2012-01-08 69 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