在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指令)。