2015-06-20 20 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這是一個更好的選擇。

相關問題