Составить макроопределение для задания. Для проведения отладки макрокоманды составить программу, включающую макрообращение.
Макрокоманда, аналогичная оператору IF в языке PL/M. Eсли Х больше Y, то Z присваивается значение Х, в противном случае Z присваивается значение Y.
Параметрами могут быть не только константы, но регистры, ячейки памяти, прямо или косвенно адресуемые.
Решение
Разработаем макрокоманду для работы с 16-разрядными аргументами. В качестве X и Y могут выступать: регистры: AX, BX, CX, DX, SI, DI, BP, SP; прямо адресуемые ячейки памяти; косвенно адресуемые ячейки памяти (через регистры BX, BP, SI, DI – это обусловлено системой команд i8086); а также константы. Параметром Z может выступать аналогично X и Y, кроме констант.
Текст макрокоманды
; макрокоманда
ifm macro x, y, z
local mge1, mge2
ifidni <y>, <ax>
cmp ax, x; сравнить y и x
jge mge1; переход, если y > x
mov ax, x; иначе, AX = x
mge1:
mov z, ax; запись результата
else
mov ax, x; AX = x
cmp ax, y; сравнить x и y
jge mge2; переход, если x > y
mov ax, y; иначе AX = y
mge2:
mov z, ax; запись результата
endif
endm
Фрагмент листинга программы
34 ; 1-й вызов макрокоманды
35ifm op1, 40, max
1 360005 A1 0002rmov ax, op1 ; AX = op1
1 370008 3D 0028cmp ax, 40 ; сравнитьop1 и 40
1 38000B 7D 03jge ??0001 ; переход,если op1 > 40
1 39000D B8 0028mov ax, 40 ; иначе AX= 40
1 400010??0001:
1 410010 A3 0000rmov max, ax ; запись результата
42
430013 BE 0002rlea si, op1 ; SI = адрес операнда 1
44; 2-й вызов макрокоманды
45ifm [si], ax, bx
1 460016 3B 04cmp ax, [si] ; сравнитьax и [si]
1 470018 7D 02jge ??0002 ; переход, если ax > [si]
1 48001A 8B 04mov ax, [si] ; иначе, AX = [si]
1 49001C??0002:
1 50001C 8B D8mov bx, ax ; запись результата