如何在linux C内联汇编中使用宏

时间:2014-06-30 20:15:24

标签: c linux macros inline-assembly

我想调用由其他配置结果确定的地址。并且该调用是在内联汇编中。

目前,它是这样的,并且是手动修改的:

asm volatile ("call 0xc0200c20\n\t");

我的问题是我可以这样写吗?

#define CALL_ADDR 0xC0200c20

asm volatile ("call CALL_ADDR\n\t");

谢谢!

2 个答案:

答案 0 :(得分:5)

只需普通的字符串连接即可,并使用两个包装器宏来创建值的字符串化版本:

#define QUAUX(X) #X
#define QU(X) QUAUX(X)

asm volatile ("call " QU(CALL_ADDR) "\n\t");

答案 1 :(得分:1)

将我的评论推荐给答案:

gcc的内联汇编操作数的P修饰符会阻止编译器发出'常量指示前缀'在生成的汇编代码中。请参阅链接参考,以获得更详细的解释,引用Linus。

如果你已经尝试过:

#define CALL_ADDR 12345678
asm volatile("call %0\n\t" :: "i"(CALL_ADDR));

您注意到汇编程序收到错误,因为生成的代码显示call $12345678且该程序集的语法无效。使用%P0代替使编译器在开头发出$,并且没问题。

这里没有必要使用预处理程序字符串连接 - 这样做的缺点是,正如您所发现的那样,"嵌套" (需要两个级别的宏),以便在连接完成之前扩展CALL_ADDR