【发布时间】:2014-07-28 07:09:54
【问题描述】:
根据 ARM IC。
在ARM状态下,PC的值是当前指令的地址加上8个字节。
在拇指状态:
- 对于 B、BL、CBNZ 和 CBZ 指令,PC 的值是当前指令的地址加上 4 个字节。
- 对于所有其他使用标签的指令,PC 的值是当前指令的地址加上 4 个字节,结果的 bit[1] 清零以使其字对齐。
简单地说,PC寄存器的值指向下一条指令之后的指令。这是我不明白的。通常(特别是在 x86 上)程序计数器寄存器用于指向要执行的下一条指令的地址。
那么,这背后的前提是什么?可能是条件执行?
【问题讨论】:
-
我相信更熟悉该架构的人可以给出更详细的解释,但简而言之; R15 包含要获取的下一条指令的地址,因为预取它(对于 arm 状态)8 或在某些情况下比当前执行的指令提前 12 个字节。
-
@JoachimIsaksson 什么情况下R15的值应该是当前指令的地址加上12个字节?
-
@Notlikethat 你可以直接在 x86-64 上阅读 RIP:
lea rax, [rip]。在 x86-32 上,最直接的方法可能是使用call指令,以pushes EIP 作为返回地址。但是,它远没有在 ARM 上那么暴露,它可以是几乎任何指令或寻址模式 IIRC 的 src 或 dst。 -
@Peter 好吧,我承认 ;) 我想我在这里用“寄存器”的意思是“可以作为指令操作数的东西”,而我的 x86 知识有点淡出 32 位之外SSE2时代...
标签: assembly arm relative-addressing