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
или старше.
Класс сегмента — любой идентификатор в одинарных кавычках. Все сегменты одиного класса будут расположены в исполняемом файле непосредственно друг за другом.
Процессор не накладывает никаких ограничений на процедуры — на любой адрес можно передать управление командой CALL, и оно вернётся к команде, следующей за CALL, как только встретится команда RET. Такая свобода легко может приводить к трудночитаемым и трудно отлаживаемым программам, поэтому в язык ассемблера включены директивы логического оформления процедур, синтаксис которых следующий:
метка PROC язык тип USES регистры ; TASM
или
метка PROC тип язык USES регистры ; MASM, WASM
; тело процедуры
метка ENDP
Все операнды директивы PROC необязательны.
Тип может принимать значение NEAR или FAR, и, если он указан, все команды RET в теле процедуры заменяются на RETN или RETF соответственно.
Операнд «язык» служит для автоматизации взаимодействия с программами на языках высокого уровня. Он определяет порядок передачи параметров через стек.
Если указано слово USES и список регистров, то ассемблер автоматически помещает в начало процедуры набор команд PUSH, сохраняющих значения указанных регистров, а перед каждым оператором RET — соответствующий набор команд POP, которые обеспечат восстановление указанных регистров перед возвратом из процедуры.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.