执行易失性指令

时间:2017-10-25 06:55:43

标签: c assembly inline volatile

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));

}

2 个答案:

答案 0 :(得分:3)

C标准未指定内联汇编。我假设这是gcc兼容的代码,那么您应该查看the manual

至于你的具体问题:

  

编译器如何翻译指令(asm volatile(“sc”))?

此上下文中的volatile指示编译器必须包含汇编程序片段 ,即使编译器无法查看程序行为实际需要的原因。第一个字符串参数中的任何内容都是目标平台的文字汇编代码。

  

为什么有些参数作为字符串传递,有些则不是

这只是语法的一部分,请参阅上面列出的手册。内联汇编可以将输入和输出参数“绑定”到C变量,并且还告诉编译器哪些寄存器被汇编代码段(以及其他内容)“破坏”。

答案 1 :(得分:1)

内联汇编程序必须弥合C和汇编之间的差距,因此除了汇编代码之外,还需要详细说明它们之间的交互方式。 GCC程序集模板中的第一项是实际程序集,其他项目包括分配输入变量,输出变量和程序集(寄存器/内存),程序集可能会破坏,因此C需要避开。可以找到完整的详细信息:here