Вы здесь: HomeМакросы

Макросы

Для каждой закодированной команды ассемблер генерирует  одну  команду на машинном языке. Но для каждого закодированного оператора компиляторного языка 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$" 

Как видим в таком виде мы значительно уменьшили исходный код нашей программы и сделали ее более понятной.