Руководство по препроцессору FASM (fb2) читать постранично
- Руководство по препроцессору FASM 61 Кб, 19с. скачать: (fb2) - (исправленную) читать: (полностью) - (постранично) - Автор неизвестен
[Настройки текста] [Cбросить фильтры]
- 1
- 2
- 3
- . . .
- последняя (7) »
РУКОВОДСТВО ПО ПРЕПРОЦЕССОРУ FASM
1. Об этом документе
Я написал это потому что вижу, как многие задают вопросы на форуме FASM, связанные с непониманием идей или особенностей препроцессора. (Я не отговариваю Вас задавать такие вопросы, непонимание чего-то — это вполне нормально, и если Ваш вопрос не чересчур сложен, кто-нибудь наверняка на него ответит). Если Вам что-нибудь из туториала покажется непонятным, пожалуйста, напишите на форум FASM, форум WASM, автору или переводчику.2. Общие понятия
2.1. Что такое препроцессор
Препроцессор — это программа (или чаще — часть компилятора), которая преобразует исходный текст непосредственно перед компиляцией. К примеру, если Вы используете какой-либо кусок кода довольно часто, можно дать ему некое имя и заставить препроцессор повсеместно заменять это имя в исходном тексте на соответствующий ему код. Другой пример — Вы хотите имитировать инструкцию, которая на самом деле не существует. В таком случае препроцессор может заменять её последовательностью инструкций дающих желаемый эффект. Препроцессор просматривает исходный текст и заменяет некоторые вещи другими. Но как объяснить препроцессору, что именно он должен делать? Для этих целей существуют директивы препроцессора. О них мы и будем говорить. Препроцессор понятия не имеет о инструкциях, директивах компилятора и прочих подобных вещах. Для него существуют собственные команды, и он игнорирует всё остальное.2.2. Комментарии
Подобно большинству ассемблеров, комментарии в FASM начинаются с точки с запятой ;. Всё, что следует за этим символом до конца строки игнорируется и удаляется из исходника. К примеру, исходный текст ; заполним 100h байтов адресуемых EDI нулями xor eax, eax ; обнуляем eax mov ecx, 100h/4 rep stosd после препроцессора превращается в xor eax,eax mov ecx,100h/4 rep stosd ПРИМЕЧАНИЕ: ; можно рассматривать как директиву препроцессора, удаляющую текст начиная с этого символа до конца строки. ПРИМЕЧАНИЕ: Строка, полностью состоящая из комментария не будет удалена. Она становится пустой строкой (см. пример выше). Это будет важно в дальнейшем.2.3. Перенос строки (Line Break)
Если строка выглядит слишком длинной, возможно разделить её на несколько, используя символ \. При обработке препроцессором следующая строка будет добавлена к текущей. Например: db 1, 2, 3,\ 4, 5, 6,\ 7, 8, 9 будет преобразовано в: db 1,2,3,4,5,6,7,8,9 Конечно, \ в составе текстовой строки или комментария не вызовет объединения строк. Внутри текстовой строки этот символ воспринимается как обычный ASCII символ (как и всё остальное заключённое между кавычками ' или "). Комментарии же удаляются без анализа того, что в них написано. В строке после символа \ могут быть только пробелы или комментарии. Ранее, я упоминал, что строка, состоящая только из комментария не удаляется, а заменяется на пустую строку. Это значит, что код, подобный этому: db 1, 2, 3,\ ; 4,5,6,\ - закомментировано 7, 8, 9 преобразуется в: db 1, 2, 3 7, 8, 9 и вызовет ошибку. Выход из положения — помещать символ \ до комментария: db 1, 2, 3,\ \; 4,5,6 - правильно закомментировано 7, 8, 9 в результате будет: db 1, 2, 3, 7, 8, 9 как мы и хотели.2.4. Директива INCLUDE
Синтаксис: include 'file name' Эта директива вставляет содержимое файла file name в исходный текст. Вставленный текст, естественно, тоже будет обработан препроцессором. Имя файла (и путь к нему, если он есть) должны быть заключены в кавычки " или апострофы '. Например: include 'file.asm' include 'HEADERS\data.inc' include '..\lib\strings.asm' include 'C:\config.sys' Можно также использовать переменные окружения ОС, помещая их имена между символами %: include '%FASMINC%\win32a.inc' include '%SYSTEMROOT%\somefile.inc' include '%myproject%\headers\something.inc' include 'C:\%myprojectdir%\headers\something.inc'3. Присваивания (Equates)
3.1. Директива EQU
Простейшая команда препроцессора. Синтаксис: name1 equ name2 Это команда говорит препроцессору, что необходимо заменить все последующие name1 на name2. Например: count equ 10 ; это команда препроцессора mov ecx, count преобразуется в: mov ecx, 10 Ещё пример: mov eax, count count equ 10 mov ecx, count преобразуется в: mov eax, count mov ecx,10 потому что препроцессор заменит count только после директивы equ. Даже это работает: 10 equ 11 mov ecx, 10 после обработки препроцессором, получим: mov ecx, 11 Обратите внимание, name1 может быть любым идентификатором. Идентификатор — это всего лишь набор символов, завершаемый пробелом (space),- 1
- 2
- 3
- . . .
- последняя (7) »
Последние комментарии
55 минут 10 секунд назад
1 час 3 минут назад
7 часов 15 минут назад
7 часов 19 минут назад
7 часов 29 минут назад
7 часов 36 минут назад