- •Введение
- •Сведения об архитектуре процессоров intel 80х86 и операционной системе windows, необходимые для программирования на ассемблере
- •1.1. Программно доступные регистры
- •1.2. Организация памяти [5]
- •1.2.1. Сегментация
- •1.2.2. Дескрипторы сегментов
- •1.2.3 Адресное пространство режима реального адреса
- •1.2.4. Адресное пространство защищенного режима [6]
- •1.2.5. Виртуальное адресное пространство
- •1.2.6. Способы адресации операндов
- •Регистровый операнд
- •Непосредственный операнд
- •1.3. Организация ввода – вывода
- •1.3.1. Консоль
- •1.3.2. Графический интерфейс пользователя
- •1.4. Система команд
- •Команды пересылки данных
- •Команды ввода/вывода
- •Команды целочисленной арифметики
- •Логические операции
- •Операции сдвигов
- •Команды передачи управления
- •Командные прерывания
- •Команды управления процессором
- •Команды обработки последовательности кодов
- •Команды для работы со стеком
- •2. Описание языка ассемблера
- •2.1. Алфавит языка ассемблера
- •2.2. Лексемы
- •2.3. Имена
- •2.3.1. Ключевые слова
- •2.3.2. Имена пользователя
- •2.4. Константы
- •2.4.1.Целые числа
- •2.4.2. Вещественные числа
- •2.4.3. Символьные и строковые константы
- •2.5. Структура строки языка ассемблера
- •2.5.1. Структура строки, содержащей машинную команду
- •2.6.3. Директивы упрощенного определения сегментов
- •2.6.4. Директивы определения сегментов и групп
- •2.6.5. Директивы описания процедуры
- •2.6.6. Директивы определения данных
- •2.6.7. Директивы определения имен
- •2.6.8. Директивы внешних ссылок
- •2.6.7. Директивы управления трансляцией
- •2.6.8. Макросредства
- •2.7. Операции в выражениях
- •2.7.1. Арифметические операции
- •2.7.2. Логические операции
- •2.7.3. Операции отношения
- •2.7.4. Операции, возвращающие значения
- •2.7.5. Операции присваивания атрибута
- •Трансляция программ
- •. Компиляция
- •3.2. Компоновка
- •Библиографический список
- •Функции api
- •1. Функция GetModuleHandleA
- •2. Функция LoadIcon
- •3. Функция LoadCursor
- •4. Функция Register Class
- •5. Функция CreateWindowExA
- •6. Функция ShowWindow
- •7. Функция UpdateWindow
- •8. Функция GetMessage
- •9. Функция DispatchMessage
- •10. Функция ExitProcess
- •11. Функция BeginPaint
- •12. Функция TextOutA
- •13. Функция EndPaint
- •Описание структур, определенных в фале win32.Inc
- •1. Структура wndclass
- •2. Структура сообщения
- •3. Структура paintstruct
- •Продолжение прил. 4
- •4. Структура rect
- •Формат командной строки и ключи транслятора tasm32
- •Формат командной строки и ключи компоновщика tlink32
- •Оглавление
2.6.3. Директивы упрощенного определения сегментов
Эти директивы употребляются в программе после описания модели памяти с помощью директивы MODEL. В тексте программного модуля директивы упрощенного описания могут располагаться в произвольном порядке. Turbo Assembler компонует все части с одинаковыми именами в один сегмент. Ниже приведены список и краткое описание директив упрощенной сегментации.
CODESEG [<имя>] - начало или продолжение кодового сегмента модуля. Для модели с типом FAR можно задавать имя, которое становится действующим именем сегмента. В этом случае нельзя иметь более одного кодового сегмента в модуле.
.CODE [<имя>] - аналог CODESEG для режима MASM.
DATASEG - начало или продолжение сегмента данных, инициализированных по умолчанию, или типа NEAR.
.DATA - аналог DATASEG для режима MASM.
CONST - начало или продолжение сегмента постоянных данных модуля. Постоянные данные всегда имеют тип NEAR и эквивалентны инициализированным данным.
.CONST - аналог CONST для режима MASM.
UDATASEG - начало или продолжение сегмента данных, неинициализированных по умолчанию, или типа NEAR.
.DATA? - аналог UDATASEG для режима MASM
STACK [<размер>] - начало или продолжение сегмента стека программного модуля. Необязательный параметр "размер" указывает объем памяти, отводимый под стек в словах.
.STACK [<размер>] - аналог STACK для режима MASM
FARDATA [<имя>] - начало или продолжение сегмента инициализированных данных дальнего типа с указанным именем (по умолчанию используется имя FAR_DATA). В программном модуле можно размещать несколько сегментов такого типа.
.FARDATA [<имя>] - аналог FARDATA для режима MASM.
UFARDATA [<имя>] - начало или продолжение сегмента неинициализированных данных типа FAR с указанным именем (по умолчанию используется имя FAR_BSS). В программном модуле можно размещать несколько сегментов такого типа.
.FARDATA? [<имя>] - аналог UFARDATA для режима MASM [5].
2.6.4. Директивы определения сегментов и групп
Упрощенное описание сегментов, используемое с указанием стандартной модели памяти, в большинстве случаев с успехом применяется в прикладных программах. Однако такое описание ограничивает гибкость в употреблении сегментов. Если требуется осуществлять полный контроль всех аспектов создания сегментов, необходимо пользоваться соответствующими директивами. Директива SEGMENT открывает сегмент. Любые команды или данные, следующие за этой директивой, помещаются в указанный сегмент до тех пор, пока не встретится директива ENDS, закрывающая сегмент.
В режиме IDEAL директива имеет следующий формат:
SEGMENT <имя> [<выравнив.><объединение><размер><'класс'><доступ>]
В режиме MASM синтаксис более естественный:
<имя> SEGMENT [<атрибуты>]
Имя – обязательный параметр, являющийся именем, определяемым пользователем, атрибуты - необязательные параметры, указывающие на некоторые свойства сегмента. Атрибуты определяют выравнивание сегмента в памяти на границе байта, слова, двойного слова, параграфа (16 байт) или страницы (256 байт). Другие атрибуты определяют способ, объединения сегмента с другими сегментами с тем же именем и классом сегмента.
Атрибуты выравнивания сегмента:
BYTE – сегмент может начинаться с любого адреса;
WORD – сегмент начинается на границе следующего слова;
DWORD – сегмент начинается на границе двойного слова;
PARA – используется по умолчанию, сегмент начинается на границе параграфа;
PAGE – сегмент начинается на границе страницы (256 байт);
MEMPAGE – сегмент начинается на границе страницы памяти (4 К байт).
Некоторые значения атрибута объединения:
PRIVATE – сегмент не будет объединяться с другими сегментами, находящимися в других модулях и имеющих то же имя, используется по умолчанию;
PUBLIC – сегмент будет объединяться с одноименными сегментами из других модулей в один сегмент;
MEMORY – идентичен PUBLIC, сегмент объединяется при компоновке с одноименными сегментами;
STACK – сегмент стека в явном виде должен быть отмечен с помощью этого атрибута при полном описании сегментов;
COMMON – одноименные сегменты начинаются по одному и тому же адресу, они будут занимать перекрывающуюся разделяемую область памяти;
AT <выражение> - сегмент размещается по абсолютному адресу параграфа, определяемому выражением.
Атрибуты размера:
USE16 – устанавливается по умолчанию, позволяет 16-разрядное внутрисегментное смещение и ограничивает размер сегмента в 64К байт;
USE32 - позволяет 32-разрядное смещение и ограничивает размер сегмента в 4Гбайт.
Атрибут класса представляет собой заключенное в апострофы имя, которое позволяет компоновщику группировать сегменты с одинаковым классом.
Атрибут доступа может принимать следующие значения:
EXECONLY – сегмент может содержать только код;
EXECREAD - сегмент может содержать код и данные только для чтения;
READONLY - сегмент может содержать только данные для чтения;
READWRITE - сегмент может содержать только изменяемые данные.
Формат завершающей сегмент директивы END в режиме IDEAL:
ENDS [<имя>], в режиме MASM: <имя> ENDS, где <имя.> имя сегмента, использованное в директиве SEGMENT.
В кодовом сегменте должна присутствовать директива ASSUME, связывающая имена сегментных регистров с именами сегментов, формат для разных режимов компилятора одинаковый:
ASSUME <сег._рег.>:<имя>[,…]
Директива GROUP используется для помещения сегментов в группу. Группа позволяет обеспечить доступ к данным всех сегментов, которые находятся в группе, с помощью одной загрузки адреса группы в сегментный регистр. Формат директивы:
GROUP <имя_группы> <имя>[,…]
где <имя_группы> - имя, определяемое пользователем, а <имя> – имя сегмента, использованное в директиве SEGMENT.
Квадратные скобки означают, что за первым обязательным аргументом директивы через запятую может следовать очередной аналогичный по смыслу аргумент.
