在C中使用ASM命令

关于在c中使用ASM,我有一个小问题。 我想执行指令:

LDR PC,=0x123456 

这给了我错误“操作数中的意外令牌”。

 asm("LDR PC,=0x123456"); 

这给出了“无效约束”。

 asm("LDR PC," : "m" (0x123456)); 

这样做的正确方法是什么?

你正在使用这个:

 asm("LDR PC,=0x123456"); 

这不是标准的ARM汇编指令,而是作为编译器扩展提供的伪指令。 编译时,此伪指令将转换为其他汇编指令。 看来clang不支持这个编译器扩展(参见这个主题 )。 您应该自己转换为汇编指令,请参阅ARM文档以了解LDR伪指令的转换方式。

您可以在普通C中实现您想要的效果:

 ((void (*)(void))0x123456)(); 

或者如果你更喜欢更详细:

 typedef void FN(void); ((FN*)0x123456)(); 

我同意@Étienne。 我尝试使用mi Google工具链进行编码。 它工作正常。

我想你应该阅读手册如何将编译器的指令更改为指令(通常是两个mov指令)。