
Макросы
- Подробности
- Категория: Разное
- Опубликовано 21.03.2014 10:29
- Автор: Админ
- Просмотров: 776
Для каждой закодированной команды ассемблер генерирует одну команду на машинном языке. Но для каждого закодированного оператора компиляторного языка Pascal или C генерируется один или более (чаще много) команд машинного языка. В этом отношении можно считать, что компиляторный язык состоит из макрооператоров.
Ассемблер FASM ( MASM так же как и другие) также имеет макросредства, но макросы здесь определяются программистом. Для этого задается директива MACRO ,имя макроса, открываеться фигурная скобка, различные ассемблерные команды, которые должен генерировать данный макрос и для завершения макроопределения - закрываеться фигурная скобка. Затем в любом месте программы, где необходимо выполнение определенных в макрокоманде команд, достаточно закодировать имя макроса. В результате ассемблер сгенерирует необходимые команды. Использование макрокоманд позволяет:
- упростить и сократить исходный текст программы;
- сделать программу более понятной;
- уменьшить число возможных ошибок кодирования.
Примерами макрокоманд могут быть операции ввода-вывода, связанные с инициализацией регистров и выполнения прерываний преобразования ASCII и двоичного форматов данных, арифметические операции над длинными полями, обработка строковых данных, деление с помощью вычитания.
Пример простого макроса:
org 100h macro endprogram { mov ax,4c00h int 21h } mov ah,9 mov dx,msg int 21h endprogram msg db "Hello World$"
Как видим создали простой макрос который упрощает наглядно вид программы. Вместо макроса endprogram вставляется его тело(то есть его код).
Давайте создадим еще один макрос который принимает параметры:
macro endprogram { mov ax,4c00h int 21h } macro print str { mov ah,9 mov dx,str int 21h } org 100h print msg endprogram msg db "Hello World$"
Мы создали макрос который принимает переменную и выводит ее на экран. Это переменная (str) для макроса является локальной, и она видна только внутри макроса. также в макросе можно создавать свои локальные метки и переменные:
macro endprogram { mov ax,4c00h int 21h } macro print str,kol { local start local cikl local endl jmp start endl db 10,13,'$' start: mov cx,kol cikl: mov ah,9 mov dx,str int 21h mov ah,9 mov dx,endl int 21h loop cikl } org 100h print msg,8 endprogram msg db "Hello World$"
Так же все макросы можно написать в отдельном файле а затем подключить его с помощью директивы include. К примеру создадим два файла main.asm и my_macro.asm со следующим содержимым:
my_macro.asm:
macro endprogram { mov ax,4c00h int 21h } macro print str,kol { local start local cikl local endl jmp start endl db 10,13,'$' start: mov cx,kol cikl: mov ah,9 mov dx,str int 21h mov ah,9 mov dx,endl int 21h loop cikl }
main.asm:
include 'my_macro.asm' org 100h print msg,8 endprogram msg db "Hello World$"
Как видим в таком виде мы значительно уменьшили исходный код нашей программы и сделали ее более понятной.