Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux C内联程序集中使用宏_C_Linux_Macros_Inline Assembly - Fatal编程技术网

如何在linux C内联程序集中使用宏

如何在linux C内联程序集中使用宏,c,linux,macros,inline-assembly,C,Linux,Macros,Inline Assembly,我想调用由其他配置结果确定的地址。该调用位于内联程序集中 目前是这样的,是手动修改的: asm volatile ("call 0xc0200c20\n\t"); 我的问题是我能这样写吗 #define CALL_ADDR 0xC0200c20 asm volatile ("call CALL_ADDR\n\t"); 谢谢 只需普通字符串连接就可以了,使用两个包装宏来创建值的字符串化版本: #定义QUAUX(X)#X #定义QU(X)QUAUX(X) asm volatile(“调用”QU

我想调用由其他配置结果确定的地址。该调用位于内联程序集中

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

asm volatile ("call 0xc0200c20\n\t");
我的问题是我能这样写吗

#define CALL_ADDR 0xC0200c20

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

谢谢

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

#定义QUAUX(X)#X
#定义QU(X)QUAUX(X)
asm volatile(“调用”QU(调用地址)”\n\t);

将我的评论提升为答案:

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

如果您尝试过:

#define CALL_ADDR 12345678
asm volatile("call %0\n\t" :: "i"(CALL_ADDR));
您注意到汇编程序中出现了一个错误,因为生成的代码显示
call$12345678
,而这不是有效的汇编语法。相反,使用
%P0
会使编译器在开始时不会发出
$
,这很好


这里不需要使用预处理器字符串连接-缺点是,正如您所发现的,需要“嵌套”(两级宏),以便在连接完成之前展开
CALL\u ADDR

似乎不起作用。错误:程序中出现错误“#”:应在数字前加“:”或“)”constant@xiaogw:完全正确,很抱歉。您需要一个单独的宏来执行字符串化。我在脑子里挡住了那一步…那很有效!谢谢你,伙计。但在这种情况下,为什么我们必须为字符串连接使用单独的宏?@xiaogw:你可以自己分阶段尝试,看看预处理器会产生什么结果。。。基本上,您需要一个宏来计算原始宏,另一个宏来字符串化。如果你只说
QUAUX(CALL\u ADDR)
,你会得到
“CALL\u ADDR”
,而
QU(CALL\u ADDR)
变成
QUAUX(0xC0200c20)
。再次感谢,真的很有帮助<代码>asm volatile(“调用%P0\n\t”):“p”(调用地址))就可以了-有关
p
修饰符,请参阅。警告:在内联汇编程序中使用
调用
意味着您必须用代码保存/恢复寄存器将其“括起来”。具体细节取决于ABI。至少对于gcc-arm-8.3%0似乎还可以,而%P0不起作用。