将常量粘贴到asm代码块中

时间:2012-01-08 17:05:07

标签: c assembly c-preprocessor stringification

我有 C 宏:

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

当我用整数调用它时效果很好:

 syscall(5);

然而,当我做这样的事情时:

 #define SYSCALL_PUTC 5

 syscall(SYSCALL_PUTC);

我收到此错误:

  

错误:指令系统调用需要绝对表达式

我该如何解决这个问题?我不希望我的代码充斥着神奇的数字。

2 个答案:

答案 0 :(得分:4)

使用 stringification ,如下所示:

#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

答案 1 :(得分:0)

有点破解,但不是那么多:为每个系统调用号创建原始系统调用宏的副本,为每个系统调用命名。因此,您将拥有一个名为SYSCALL_PUTC的宏,它将扩展为与syscall(5)相同的宏。