是否有扩展到当前源行号的 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
(大写)扩展,gcc
4.8默认自动运行cpp
,方便。
但如果您的用例有点不同,请务必探索其他 GCC 功能。例如,我也在考虑使用 __LINE__
来生成唯一的本地标签,但后来我发现 numeric local relative labels 是一个更好的选择。
如 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
(大写)扩展,gcc
4.8默认自动运行cpp
,方便。
但如果您的用例有点不同,请务必探索其他 GCC 功能。例如,我也在考虑使用 __LINE__
来生成唯一的本地标签,但后来我发现 numeric local relative labels 是一个更好的选择。