我有一个关于在c中使用ASM的小问题。我想执行指令:
LDR PC,=0x123456
这给了我错误“操作数中的意外令牌”。
asm("LDR PC,=0x123456");
这会产生“无效约束”。
asm("LDR PC," : "m" (0x123456));
这样做的正确方法是什么?
答案 0 :(得分:2)
你正在使用这个:
asm("LDR PC,=0x123456");
这不是标准的ARM汇编指令,而是作为编译器扩展提供的伪指令。编译时,此伪指令将转换为其他汇编指令。似乎clang不支持此编译器扩展(请参阅此thread)。您应该自己转换为汇编指令,请参阅ARM文档以了解LDR pseudo-instruction的转换方式。
答案 1 :(得分:0)
您可以在普通C中实现您想要的效果:
((void (*)(void))0x123456)();
或者如果您更喜欢更详细:
typedef void FN(void);
((FN*)0x123456)();
答案 2 :(得分:0)
我同意@Étienne。我尝试使用mi Google工具链进行编码。它工作正常。
我认为你应该阅读手册,编译器如何将指令更改为指令(通常是两个 mov 指令)。