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

Is there a __LINE__ macro for GAS assembly that expands to the current source line number?

如 NASM 和 C.

简单地用 cpp 预处理它不起作用,因为我想定义一个宏,如:

.macro ASSERT_FAIL
    mov __LINE__, %eax
    call assert_fail
.endmacro

每当使用 ASSERT_FAIL 时都会扩展 __LINE__,这样我就可以看到故障发生的位置。所以__LINE__必须在ASSERT_FAIL之后展开。

我还想将该宏放在一个单独的文件中,并将其包含在 .include 中。

我已经能够通过 NASM:

实现这一目标
%macro ASSERT_FAIL 0
    mov eax, __LINE__
    call assert_fail
%endmacro

除了用cpp#include#define代替.macro.include之外,还有其他选择吗?手册 does say that gas 中几乎没有内置的预处理功能。这让我想知道为什么 .macro.include 存在,如果它们如此有限。

编辑:我检查了内核和 glibc。 glibc 没有一个 .include 和很少的 .macro。内核没有 .include,而是混合使用 .macro#define,并倾向于将 .macro 用于多行宏,因为它更具可读性。

@RossRidge 所述,目前我能找到的最佳解决方案是使用 cpp 并使用:

#define ASSERT_FAIL \
    mov $__LINE__, %eax ;\
    call assert_fail

这还要求任何使用它的宏都使用 CPP 而不是 .macro,并且 #include 而不是 .include。所以最好的办法是在任何地方都只使用 cpp 作为宏。

如果使用标准.S(大写)扩展,gcc4.8默认自动运行cpp,方便。

但如果您的用例有点不同,请务必探索其他 GCC 功能。例如,我也在考虑使用 __LINE__ 来生成唯一的本地标签,但后来我发现 numeric local relative labels 是一个更好的选择。