Правила записи параметров
Ранее составлен макрос для обмена местами двойных слов. Если необходимо менять местами слова, будем использовать другой макрос:
MACRO SWAPW a, b
push ax bx
mov ax, a
mov bx, b
mov a, bx
mov b, ax
pop bx ax
endm
Если бы использовались функции, для каждого типа данных обязательно составлять новую функцию. Для макросов эти макроопределения могут быть объединены в одно, для этого необходимо научиться соединять параметры с постоянной частью или другими параметрами. Например, составляется м/о для работы с байтами или словами. В этом случае используются регистры ax или al cоответственно. Для задания этих регистров буква a используется как постоянная часть, а буквы x
или l являются параметрами.
Для объединения параметров с постоянной частью или другими параметрами используется знак &, т.е. запись имеет вид:
Параметр & Постоянная часть;
Постоянная часть & Параметр
Параметр & Параметр,
например a&Reg, где:
a -Постоянная часть;
Reg -Параметр.
Составим м/о для обмена местами данных для целых длиной 2 и 4 байта.
IDEAL
p586
model flat
extrn ExitProcess:proc
dataseg
firstd dd 1
secondd dd 2
firstw dw 1
secondw dw 2
codeseg
begin:
MACRO SWAP a, b, type
push type&ax type&bx
mov type&ax, a
mov type&bx, b
mov a, type&bx
mov b, type&ax
pop type&bx type&ax
endm
SWAP [firstw], [secondw]
SWAP [firstd], [secondd], e
call ExitProcess
end begi
n
А теперь попытаемся составить м/о таким образом, чтобы его можно было использовать и для байтов. В этом случае в качестве регистров можно использовать регистры al
и bl, т.е. параметром является не только первая, но и последняя буква имени регистра:
Программа для этого варианта имеет вид:
IDEAL
p586
model flat
extrn ExitProcess:proc
dataseg
firstd dd 1
secondd dd 2
firstw dw 1
secondw dw 2
firstb db 1
secondb db 2
codeseg
begin:
MACRO SWAP x, y, ft, st
push ft&ax ft&bx
mov ft&a&st, x
mov ft&b&st, y
mov x, ft&b&st
mov y, ft&a&st
pop ft&bx ft&ax
endm
SWAP [firstb], [secondb], ,l
SWAP [firstw], [secondw],,x
SWAP [firstd], [secondd], e,x
call ExitProcess
end begin
Заметим, что в данном случае оставить формальные параметры a, b нельзя, т.к. постоянная часть и параметр совпадают.
Значение фактического параметра вставляется всюду, даже во внуть строки, если используется со знаком &, например
…
MACRO error name
Db ‘Ошибка. Файл &name’
endm
dataseg
msg1 error first.asm
end
Имя макроопределения может совпадать с ключевыми словами, т.е. можно переопределить команды процессора, правда, в этом случае компилятор выдаст диагностическое сообщение о совпадении имен!
Пример замены операции сложения на операцию вычитания:
IDEAL
p586
model flat
extrn ExitProcess:proc
MACRO error name
Msg db'Ошибка. Файл &name'
endm
MACRO add a, b
mov ax, a
sub ax, b
mov a, ax
endm
dataseg
error first.asm
codeseg
begin:
add cx,dx
call ExitProcess
end begin
В этом примере вместо команды add ax,bx используется команда sub ax,bx.
Допускается многократное переопределение макроса в программе. Действует последнее определенное.