我想调用由其他配置结果确定的地址。并且该调用是在内联汇编中。
目前,它是这样的,并且是手动修改的:
asm volatile ("call 0xc0200c20\n\t");
我的问题是我可以这样写吗?
#define CALL_ADDR 0xC0200c20
asm volatile ("call CALL_ADDR\n\t");
谢谢!
答案 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
。