2012-01-08 83 views
2

我有這個Ç宏:粘貼恆成彙編代碼塊

#define syscall(number) \ 
({ \ 
    asm volatile (\ 
     ".set noreorder\n" \ 
     "nop\n" \ 
     "syscall "#number"\n" \ 
    );\ 
}) 

它的偉大工程,當我與整數叫它:

syscall(5); 

然而,當我做這樣的事情:

#define SYSCALL_PUTC 5 

syscall(SYSCALL_PUTC); 

我收到此錯誤:

Error: Instruction syscall requires absolute expression

我該如何解決這個問題?我不想讓我的代碼亂七八糟地用魔法數字。

回答

4

使用字串這樣的:

#define xstr(s) str(s) 
#define str(s) #s 
#define syscall(number) \ 
({ \ 
    asm volatile (\ 
     ".set noreorder\n" \ 
     "nop\n" \ 
     "syscall "xstr(number)"\n" \ 
    );\ 
}) 

有關字串的詳細信息,請參閱本GCC頁:

http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

+0

很好用。謝謝ouah! – 2012-01-08 17:33:21

+0

@MatějZábský不客氣! – ouah 2012-01-08 17:35:15

0

有點駭客,但不是那麼多:爲每個系統調用號碼複製原始的syscall宏,爲每個系統調用命名。因此,你需要一個名爲SYSCALL_PUTC的宏,它可以像syscall(5)一樣擴展。

+0

另一種可能是使你的系統調用線在你的系統調用基於數字的宏觀連接,以便您不會有任何直接引用參數的裝配線。不知道你的編譯器會不會更好,但是。 – 2012-01-08 17:13:10