2015-06-20 55 views
0

就像NASM和C.是否有扩展为当前源行号的GAS程序集的__LINE__宏?

只需使用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#include#define代替.macro.include任何替代?手册does say thatgas中几乎没有内置的预处理能力。这让我很想知道,为什么.macro.include存在,如果他们是如此有限。

编辑:我检查了内核和glibc。 glibc没有单独的.include,也没有几个.macro。内核没有.include,但是使用了.macro#define的混合,并且倾向于为多线宏留下.macro,因为它更具可读性。

+0

使用'#define ASSERT_FAIL'类似于C。 –

+0

@RossRidge我还需要使用'cpp'的'#include'而不是'.include'。让我奇怪为什么'.macro'和'.include'完全存在。确实,https://sourceware.org/binutils/docs-2.25/as/Preprocessing.html#Preprocessing基本上说:使用CPP。 –

+0

当然,但是如果你愿意,你的#include文件可以包含其余部分。汇编宏是因为其他汇编程序拥有它,但它从来没有被认为是汇编程序的重要组成部分。 –

回答

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这是一个更好的选择。