Ранее составлен макрос для обмена местами двойных слов. Если необходимо менять местами слова, будем использовать другой макрос:
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