我有一个用C语言编写的库,混合了ARM的一些程序集。它曾经是为armv6编译的。现在我正在尝试将其升级到armv7。但是,有一个中断处理程序,它具有armv7中不允许的指令stmdb sp!, {pc}
。 armv7上的等效指令是什么?我试过了str r15, [sp, #-4]!
,但这不起作用。
答案 0 :(得分:2)
“armv7”相当通用。您使用的实际芯片是什么?你在编译ARMv7-M吗?然后尝试PUSH {PC}
。虽然我希望这不会是你遇到的唯一问题。我认为你应该发布一些片段,并详细描述你正在移植到的特定环境。
答案 1 :(得分:2)
在PC
和PUSH
指令的注册列表中使用POP
有特定限制,具体取决于操作模式,请参阅:
ARM Instruction Set Reference, PUSH
/POP
具体来说,在Thumb [2]中,是没有push {pc}
操作(与说没有stmfd sp!, {pc}
操作相同 - push
被映射到stmfd sp!
)。
因此,如果您正在编译内核代码(如果它不是内核代码,为什么还有/需要中断处理程序),请检查您是否正在编译Thumb-2内核。 / p>
那就是说,你说你遇到stmfd sp!,{pc}
指令 - 你确定这不是拼写错误吗? stmfd sp!,{lr}
(及其兄弟ldmfd sp!, {pc}
- 此处PC
存在)是正常/完全合法的,在ARM模式和Thumb-2模式下经常需要/遇到。但实际上 是将程序计数器保存到堆栈的目的?人们可以用其他方式无法实现的目标做什么?