我正在看汇编程序代码,我发现了一条我不理解的指令-- ldr PC, r1。据我所知,这会将内存跳转到r1指向的地址处包含的值。为什么不使用B或BL指令?LDR指令会停止流水线吗?出于好奇,如果管道没有停滞,会发生什么?
发布于 2021-08-05 13:52:48
其中一个原因是ARM的分支命令不能转移到距离当前程序计数器超过4千字节的地址。(我不熟悉新的基于ARM的机器,只熟悉Game Boy Advance,它有这个限制,但我不确定m-Cortex)
发布于 2021-08-04 10:10:09
全局函数的地址在内存中的一个表中。或者可以简单地存在跳转地址表。
adr r1, jumptable
ldr r2, [r1, r12, lsl #2]!
blx r2
ldr pc, [r1, #4]
jumptable:
.word 0x80000000
.word 0x800000c0
.word 0x800000e0上面的例程将首先分支(带链接)到r12的th子例程,然后在返回时分支(不带链接)到表中的下一个子例程。
大多数函数在被调用时都会保留寄存器:
push {r4-r10, lr}然后,通过以下方式在返回时恢复寄存器:
pop {r4-r10, lr}并最终通过以下方式返回给调用者:
bx lr但更有可能的是,还原和实际回报将结合在一起,如下所示:
pop {r4-r10, pc}https://stackoverflow.com/questions/68643414
复制相似问题