Основы создания макросов в Assembler.

Макросы — это шаблоны для генерации кода. Один раз создав макрос, можно использовать его во многих местах в коде программы. Макросы делают процесс программирования на ассемблере более приятным и простым, а код программы получается понятнее. Макросы позволяют расширять синтаксис ассемблера и даже добавлять собственные «команды», которых нет в процессоре.

Также Макросы могут использоваться для ускорения разработки программного обеспечения для микроконтроллеров на Assembler. В процессе компиляции Макросы заменяются на последовательности команд микроконтроллера. Подобный подход к программированию позволяет приблизить программирование на Assembler по внешнему виду к языку программирования C.

Синтаксис создания макроса

Для создания макроса используется директива macro. Эта директива имеет следующий синтаксис:

macro <название_макроса> [<список_параметров>]
{
    <тело_макроса>
}

После директивы пишется название макроса, а также может быть указан список параметров (операндов). Параметры в списке перечисляются через запятую. Внутри фигурных скобок записывается тело макроса.

Тело макроса — это код, который подставляется в то место, где макрос будет вызван. Создание макроса является по сути лишь его объявлением, в этом месте программы никакого кода сгенерировано не будет. Поэтому объявления макросов обычно размещают в самом начале программы или в отдельном файле. Примеры макросов:

; Простой макрос без параметров, предназначенный для завершения программы
macro exit_app
{
    mov ax,4C00h
    int 21h
}

После того, как макрос объявлен, в нужном месте программы достаточно написать exit_app. Туда препроцессор FASM автоматически подставит 2 команды, записанные в теле макроса.

Расширение системы команд

Макросы можно использовать для расширения системы команд. Например, часто в программе приходится обнулять регистры. Создадим специальный макрос для этой цели:

; Макрос - команда обнуления регистра
macro clr reg { xor reg,reg }

Теперь обнулять регистры в программе можно так:

    clr ax          ;AX=0
    clr si          ;SI=0
    clr bl          ;BL=0

Директива include

Если нужно написать собственный набор макросов и использовать их в своих программах, то будет удобно поместить макросы в отдельный файл и воспользоваться директивой включения файла include. Синтаксис директивы:

include 'путь/к/файлу'

Путь к файлу указывается в одинарных кавычках и может быть относительным (по отношению к компилируемому файлу) или полным (начиная от буквы диска или корневого каталога системы). Если включаемый файл находится в той же папке, то достаточно указать только имя файла. Расширение файла может быть любым, но обычно используют «inc» или «asm».

Препроцессор FASM читает указанный файл и подставляет код из него вместо директивы include. В отдельный файл можно также вынести часто используемые процедуры, отдельные функциональные блоки программы или объявления данных.

Макросы с переменным количеством параметров

Возможно также создавать макросы с переменным количеством параметров. В этом случае имя параметра записывается в квадратных скобках. Для генерации кода макрос вызывается столько раз, сколько параметров ему было передано. Например, можно написать специальные макросы для улучшения команд PUSH и POP:

; Макрос - улучшенная команда push
macro push [arg] { push arg }
; Макрос - улучшенная команда pop
macro pop [arg] { pop arg }

Несмотря на то, что название макроса совпадает с именем команды, в теле макроса это имя считается именем команды. Данные макросы позволяют помещать в стек и извлекать из стека сразу несколько операндов, что упрощает код программы. Пример использования:

    push ax,word[si],5
    pop  dx,cx,ax

В результате препроцессором будет сгенерирован следующий код:

    push ax
    push word[si]
    push 5
    pop dx
    pop cx
    pop ax

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *