就像在NASM和C中一样。
使用cpp
简单地预处理它不起作用,因为我想定义一个像:
.macro ASSERT_FAIL
mov __LINE__, %eax
call assert_fail
.endmacro
每当__LINE__
被使用时,会扩展ASSERT_FAIL
,以便我可以看到失败发生的位置。因此__LINE__
之后必须展开ASSERT_FAIL
。
我还想将该宏放在一个单独的文件中,并将其包含在.include
。
我已经能够用NASM实现这一目标:
%macro ASSERT_FAIL 0
mov eax, __LINE__
call assert_fail
%endmacro
除了使用cpp
的{{1}}和#include
代替#define
和.macro
之外,还有其他选择吗?手册does say that在.include
中几乎没有内置的预处理能力。如果gas
和.macro
如此受限,我会想知道为什么会存在.include
和.include
。
.macro
,只有很少.include
。内核没有.macro
,但使用了#define
和.macro
的混合,并且倾向于将1st line
留给多行宏,因为它更易读。< / p>
答案 0 :(得分:0)
如@RossRidge
所述,到目前为止我能找到的最佳解决方案是使用cpp并使用:
#define ASSERT_FAIL \
mov $__LINE__, %eax ;\
call assert_fail
这还需要使用此功能的任何宏来使用CPP,而不是.macro
和#include
而不是.include
。因此,最好的办法是在所有地方只使用cpp
。
如果您使用标准.S
(大写)扩展程序,gcc
4.8默认会自动运行cpp
,这很方便。
但如果您的用例略有不同,请务必探索其他GCC功能。例如,我也在考虑使用__LINE__
生成唯一的本地标签,但之后我发现numeric local relative labels是更好的选择。