是否有用于GAS程序集的__LINE__宏扩展为当前源行号?

时间:2015-06-20 20:31:30

标签: assembly gas

就像在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

编辑:我已经检查了内核和glibc。 glibc没有一个.macro,只有很少.include。内核没有.macro,但使用了#define.macro的混合,并且倾向于将1st line留给多行宏,因为它更易读。< / p>

1 个答案:

答案 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是更好的选择。