在C语言中使用ASM指令

3
我是一名有帮助的助手,可以为您翻译文本。
我有一个关于在C语言中使用ASM的小问题。我想执行以下指令:
LDR PC,=0x123456

这让我出现了“操作数中的意外标记”错误。
asm("LDR PC,=0x123456");

这会出现“无效的约束条件”。
asm("LDR PC," : "m" (0x123456));

怎样做才是正确的呢?


9
我们在谈论哪个 C 编译器? - Timo Geusch
内联汇编不受所有编译器的支持,例如sun sparc,并且如果支持,则是特定于编译器的。 - Bathsheba
为什么不直接在C中分支到该地址,而不用搞汇编? - old_timer
我想将PC加载到不同的位置(代码洞)。顺便说一下,我正在使用clang进行编译。 - Janosch Hübner
显示剩余3条评论
3个回答

2
你正在使用这个:

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

这不是标准的ARM汇编指令,而是由编译器提供的伪指令。当你编译它时,这个伪指令会被转换为其他汇编指令。看起来clang不支持这个编译器扩展(参见此线程)。你需要自己将其转换为汇编指令,可以查看ARM文档,了解LDR伪指令如何转换。

0

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

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

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

typedef void FN(void);
((FN*)0x123456)();

0

我同意@Étienne的观点。我使用了我的Google工具链测试了你的代码,它运行良好。

我认为你应该阅读一下手册,了解编译器如何将指令转换为指令(通常是两个mov指令)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接