Организация ЭВМ и систем: Курс лекций (Позиционные системы счисления. Процессоры семейства IA-32. Лазерные принтеры), страница 26

PAGE — с адреса, кратного 256.

Разумеется, на выравнивание сегмента накладывает ограничения процессор. Например, в режиме реальной адресации сегмент может начинаться только с адреса, кратного 16.

По умолчанию подразумевается PARA.

Тип определяет способ комбинирования сегментов. Ассемблеры MASM, TASM и WASM допускают следующие значения данного операнда:

PUBLIC или MEMORY, означает, что все такие сегменты с одинаковым именем могут быть объединены в один.

STACK — то же самое, что и PUBLIC, но указывает транслятору, что данный сегмент должен использоваться как сегмент стека, соответственно, при загрузке программы сегмент, полученный объединением всех сегментов типа STACK, должен использоваться как стек.

COMMON — сегменты с одинаковыми именами объединяются в один, но не последовательно, а по одному и тому же базовому адресу, следовательно, длина суммарного сегмента будет равна не сумме длин объединяемых сегментов, как для двух предыдущих типов, а длине наибольшего сегмента.

AT указывает, что сегмент должен располагаться по фиксированному абсолютному адресу в памяти. Данный тип имеет один операнд — база сегмента, делённая на 16=10H.

Пример. Следующие операторы определяют сегмент, начинающийся по адресу 400H:

bios            SEGMENT AT 40H
                ORG     17H
keyboard_flag   DB      ? ; Флаги состояния клавиатуры
bios            ENDS

Сегмент с заданным адресом не может содержать инициализированные данные или код.

Сегменты данного типа используют, как правило, при написании системных программ, работающих с данными, расположенными по фиксированным адресам памяти, например, в области данных BIOS, как это показано выше.

PRIVATE — сегмент не объединяется с другими сегментами.

По умолчанию подразумевается PRIVATE.

Разрядность сегмента может принимать значение USE16 или USE32. Размер сегмента, описанного как USE16 не может превышать 64 Кб, и все команды и адреса в этом сегменте считаются 16-разрядными. В таких сегментах всё равно можно применять команды, использующие 32-разрядные адреса и данные, но они будут использовать префикс изменения разрядности, а потому будут длиннее и будут дольше выполняться. Сегменты, определённые с USE32 могут занимать до 4 Гб, и все команды и адреса в них по умолчанию считаются 32-разрядными.

Если разрядность сегмента не указана, то подразумевается USE16 при условии, что перед директивой .MODEL не применялась директива задания допустимого набора команд .386 или старше.

Класс сегмента — любой идентификатор в одинарных кавычках. Все сегменты одиного класса будут расположены в исполняемом файле непосредственно друг за другом.

8.2.  Процедуры

Процессор не накладывает никаких ограничений на процедуры — на любой адрес можно передать управление командой CALL, и оно вернётся к команде, следующей за CALL, как только встретится команда RET. Такая свобода легко может приводить к трудночитаемым и трудно отлаживаемым программам, поэтому в язык ассемблера включены директивы логического оформления процедур, синтаксис которых следующий:

метка                            PROC    язык тип USES регистры  ; TASM

или

метка                            PROC    тип язык USES регистры  ; MASM, WASM
; тело процедуры
метка            ENDP

Все операнды директивы PROC необязательны.

Тип может принимать значение NEAR или FAR, и, если он указан, все команды RET в теле процедуры заменяются на RETN или RETF соответственно.

Операнд «язык» служит для автоматизации взаимодействия с программами на языках высокого уровня. Он определяет порядок передачи параметров через стек.

Если указано слово USES и список регистров, то ассемблер автоматически помещает в начало процедуры набор команд PUSH, сохраняющих значения указанных регистров, а перед каждым оператором RET — соответствующий набор команд POP, которые обеспечат восстановление указанных регистров перед возвратом из процедуры.

9. Структура программы для MS DOS