我为这样的鼻子写了一小段装配:
%macro register 1
%if %1 = 0
rax
%elif %1 = 1
rbx
%elif %1 = 2
rcx
%endif
%endmacro
add register(1), register(2)
我希望评估为add rbx, rcx
但是,nasm -E test.asm
会返回此值,表示未评估宏:
%line 10+1 test.asm
add register(1), register(2)
将其与此代码进行比较:
%macro register 1
%if %1 = 0
rax
%elif %1 = 1
rbx
%elif %1 = 2
rcx
%endif
%endmacro
register(1)
转化为
%line 10+1 test.asm
rbx
为何与众不同?如何在第一个片段中实现我的期望?
答案 0 :(得分:2)
您需要使用单行宏,因为它们的扩展方式不同:
%define register_1 rax
%define register_2 rbx
%define register_3 rcx
%define register(x) register_ %+ x
add register(1), register(2)
$ nasm -E t4.asm
%line 1+1 t4.asm
%line 6+1 t4.asm
add rax, rbx