Программирование на Ассемблере

       

Правила записи параметров


Ранее составлен макрос для обмена местами двойных слов. Если необходимо менять местами слова, будем использовать другой макрос:

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.
Допускается многократное переопределение макроса в программе. Действует последнее определенное.

Содержание раздела