Макрос [FASM] - как обратиться к макросу и как передать параметр в макрос - Assembler
Формулировка задачи:
Задано число x0 и функции f(x), t(x), p(x). Пусть
x1=p(x0), x2=t(x1), x3=t(x2),
x4=f(x3), x5=p(x4), x6=f(x5),
x7=t(x6 x8=f(x7), x9=p(x8),
x10=p(x9), x11=p(x10), x12=t(x11),
Требуется вычислить x12 при f(x)=2x+3, t(x)=2x-17, p(x)=2x+2. Вычисление функций оформить в виде макроопределения с параметром-константой. Если аргумент отсутствует, то команду сложения не генерировать. Выбор функции организовать с помощью логической шкалы.
Выбор функции организовать с помощью логической шкалы.
format PE Console 5.0
entry Start
include 'win32a.inc'
section '.data' data readable writeable
x db 2
section '.text' code readable executable
Start:
macro f [arg]
{
mov ax, [arg]
imul 2
add ax, 3
}
macro t [arg]
{
mov ax, [arg]
imul 2
sub ax, 17
}
macro p [arg]
{
mov ax, [arg]
imul 2
add ax, 2
}
p x
Exit:
invoke ExitProcess, 0
section '.idata' import data readable
library kernel, 'KERNEL32.DLL'
import kernel,\
ExitProcess, 'ExitProcess'Решение задачи: «Макрос [FASM] - как обратиться к макросу и как передать параметр в макрос»
textual
Листинг программы
macro f arg
{
if ~ arg eq
; если параметр 'arg' есть, то будет вставлен этот кусок кода, иначе нет.
mov eax, arg
lea eax,[eax*2+3]
end if
}
Объяснение кода листинга программы
- Объявлен макрос с именем
f. - У макроса есть один параметр с именем
arg. - Если параметр
argне равен нулю, то выполняется следующий код:- Переменная
eaxполучает значение параметраarg. - Выполняется операция
lea eax,[eax*2+3]с переменнойeax.
- Переменная
- Если параметр
argравен нулю, то выполняется только операцияlea eax,[eax*2+3]с переменнойeax.