3

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

LDR PC,=0x123456

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

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

这给出了“无效约束”。

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

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

4

3 回答 3

2

你正在使用这个:

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

这不是标准的 ARM 汇编指令,而是作为编译器扩展提供的伪指令。当你编译这个伪指令时,它会被转换成其他的汇编指令。似乎 clang 不支持此编译器扩展(请参阅此线程)。您应该自己转换为汇编指令,请参阅 ARM 文档了解如何转换LDR 伪指令

于 2013-09-25T14:56:27.543 回答
0

您可能可以在纯 C 中实现您想要的效果:

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

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

typedef void FN(void);
((FN*)0x123456)();
于 2013-09-26T11:37:01.757 回答
0

我同意@Étienne。我用 mi Google 工具链尝试了你的代码。它工作正常。

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

于 2013-09-27T14:28:44.130 回答