Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个关于在 c 中使用 ASM 的小问题。我想执行指令:
LDR PC,=0x123456
这给了我错误“操作数中的意外标记”。
asm("LDR PC,=0x123456");
这给出了“无效约束”。
asm("LDR PC," : "m" (0x123456));
这样做的正确方法是什么?
你正在使用这个:
这不是标准的 ARM 汇编指令,而是作为编译器扩展提供的伪指令。当你编译这个伪指令时,它会被转换成其他的汇编指令。似乎 clang 不支持此编译器扩展(请参阅此线程)。您应该自己转换为汇编指令,请参阅 ARM 文档了解如何转换LDR 伪指令。
您可能可以在纯 C 中实现您想要的效果:
((void (*)(void))0x123456)();
或者如果您更喜欢更详细:
typedef void FN(void); ((FN*)0x123456)();
我同意@Étienne。我用 mi Google 工具链尝试了你的代码。它工作正常。
我认为您应该阅读手册,编译器如何将指令更改为指令(通常是两个mov指令)。