2

我有一个用 C 语言编写的库,混合了一些用于 ARM 的程序集。它曾经是为 armv6 编译的。现在我正在尝试将其升级到 armv7。但是,有一个中断处理程序具有stmdb sp!, {pc}armv7 中不允许的指令。armv7 上的等效指令是什么?我试过str r15, [sp, #-4]!了,但这不起作用。

4

2 回答 2

2

“armv7”相当通用。你使用的实际芯片是什么?你在为 ARMv7-M 编译吗?那就试试PUSH {PC}吧。虽然我预计这不会是您遇到的唯一问题。我认为您应该发布一些片段并更详细地描述您要移植到的特定环境。

于 2011-10-21T19:04:36.503 回答
2

根据操作模式的不同,PC在 reg 列表中的使用PUSH和说明有特定的限制,请参阅:POP

ARM 指令集参考,PUSH/POP

具体来说,在 Thumb[2]没有push {pc}操作(这与说没有stmfd sp!, {pc}操作相同 -push映射到stmfd sp!)。

因此,如果您正在编译内核代码(如果不是内核代码,为什么还需要/需要中断处理程序),请检查您是否正在编译 Thumb-2 内核。

也就是说,你是说你遇到了一个stmfd sp!,{pc}指令——你确定那不是错字吗?stmfd sp!,{lr}(以及它的兄弟,ldmfd sp!, {pc}- 这里PC是存在的)是正常的/完全合法的,并且在 ARM 模式和 Thumb-2 模式下经常需要/遇到。但这实际上程序计数器保存到堆栈的目的吗?用其他方式无法实现的东西可以做什么?

于 2011-10-24T12:39:24.907 回答