ctrl
编译器如何翻译指令(asm volatile(" sc"))?
为什么有些参数作为字符串传递而有些则不传递(例如:
int __attribute__ ((noinline)) mySystemCall (uint32 Exception, uint32 Parameter)
{
#ifdef PROCESSORX
__asm__ volatile ("sc")
#else
__asm__ __volatile__ ("mov R0, %0; mov R1, %1; svc 0x0 " : : "r" (Exception), "r" (Parameter));
}
答案 0 :(得分:3)
C标准未指定内联汇编。我假设这是gcc
兼容的代码,那么您应该查看the manual。
至于你的具体问题:
编译器如何翻译指令(asm volatile(“sc”))?
此上下文中的volatile
指示编译器必须包含汇编程序片段 ,即使编译器无法查看程序行为实际需要的原因。第一个字符串参数中的任何内容都是目标平台的文字汇编代码。
为什么有些参数作为字符串传递,有些则不是
这只是语法的一部分,请参阅上面列出的手册。内联汇编可以将输入和输出参数“绑定”到C变量,并且还告诉编译器哪些寄存器被汇编代码段(以及其他内容)“破坏”。
答案 1 :(得分:1)
内联汇编程序必须弥合C和汇编之间的差距,因此除了汇编代码之外,还需要详细说明它们之间的交互方式。 GCC程序集模板中的第一项是实际程序集,其他项目包括分配输入变量,输出变量和程序集(寄存器/内存),程序集可能会破坏,因此C需要避开。可以找到完整的详细信息:here。