在C中使用ASM命令

时间:2013-09-25 14:06:16

标签: c assembly arm clang

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

LDR PC,=0x123456

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

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

这会产生“无效约束”。

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

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

3 个答案:

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