Значение «list
params
», которое далее во время генерации строк, заключенных в фигурные скобки, заменяется на соответственное значение. Так, если «list
» имеет значение «1,2
», строка, указанная выше, сгенерирует строку, содержащую «foo 1,2
», которая далее пройдет стандартный препроцессинг.Есть ещё один особый случай — когда препроцессор собирается проверить второй символ и натыкается на двоеточие (что далее интерпретируется ассемблером как определение метки), он останавливается в этом месте и заканчивает препроцессинг первого символа (то есть если это символьная константа, она развертывается) и если это все еще выглядит меткой, совершается стандартный препроцессинг, начиная с места после метки. Это позволяет поместить директивы препроцессора и макроинструкции после меток, аналогично инструкциям и директивам, обрабатываемым ассемблером, например:
start: include 'start.inc'
Однако если метка во время препроцессинга разрушается (например, если у символьной константы пустое значение), происходит только замена символьных констант до конца строки.
2.4 Директивы форматирования
«format
format binary
».«use16
use32
» указывают ассемблеру генерировать 16-битный или 32-битный код, пренебрегая настройкой по умолчанию для выбранного формата вывода. «use64
» включает генерирование кода для длинного режима процессоров x86.Ниже описаны разные форматы вывода со специфичными для них директивами.
2.4.1 MZ
Чтобы выбрать формат вывода MZ, используйте директиву «format MZ
«segment
use16
» или «use32
», чтобы указать битность кода в сегменте. Начало сегмента выровнено по параграфу (16 байт). Все метки, определенные далее, будут иметь значения относительно начала этого сегмента.«entry
«stack
«heap
heap 0
», Чтобы всегда отводить только память, которая программе действительно нужна.2.4.2 PE
Чтобы выбрать формат вывода PE, используйте директиву «format PE
console
», «GUI
» или оператор «native
», чтобы выбрать целевую субсистему (далее может следовать значение с плавающей точкой, указывающее версию субсистемы), «DLL
» помечает файл вывода как динамическую связывающую библиотеку. Далее может следовать оператор «at
» и числовое выражение, указывающее базу образа PE и далее опционально оператор «on
» со следующей за ним строкой в кавычках, содержащей имя файла, выбирающей заглушку MZ для PE программы (если указанный файл не в формате MZ, то он трактуется как простой двоичный исполняемый файл и конвертируется в формат MZ). По умолчанию код для этого формата 32-битный. Пример объявления формата PE со всеми свойствами:format PE GUI 4.0 DLL at 7000000h on 'stub.exe'
«section
code
», «data
», «readable
», «writeable
», «executable
», «shareable
», «discardable
», «notpageable
». Начало секции выравнивается по странице (4096 байт). Пример объявления секции PE:section '.text' code readable executable