首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为内存跳转的LDR指令

作为内存跳转的LDR指令
EN

Stack Overflow用户
提问于 2021-08-03 22:27:21
回答 2查看 124关注 0票数 1

我正在看汇编程序代码,我发现了一条我不理解的指令-- ldr PC, r1。据我所知,这会将内存跳转到r1指向的地址处包含的值。为什么不使用B或BL指令?LDR指令会停止流水线吗?出于好奇,如果管道没有停滞,会发生什么?

EN

回答 2

Stack Overflow用户

发布于 2021-08-05 13:52:48

其中一个原因是ARM的分支命令不能转移到距离当前程序计数器超过4千字节的地址。(我不熟悉新的基于ARM的机器,只熟悉Game Boy Advance,它有这个限制,但我不确定m-Cortex)

票数 1
EN

Stack Overflow用户

发布于 2021-08-04 10:10:09

全局函数的地址在内存中的一个表中。或者可以简单地存在跳转地址表。

代码语言:javascript
复制
    adr     r1, jumptable
    ldr     r2, [r1, r12, lsl #2]!
    blx     r2

    ldr     pc, [r1, #4]



jumptable:
    .word   0x80000000
    .word   0x800000c0
    .word   0x800000e0

上面的例程将首先分支(带链接)到r12的th子例程,然后在返回时分支(不带链接)到表中的下一个子例程。

大多数函数在被调用时都会保留寄存器:

代码语言:javascript
复制
push    {r4-r10, lr}

然后,通过以下方式在返回时恢复寄存器:

代码语言:javascript
复制
pop     {r4-r10, lr}

并最终通过以下方式返回给调用者:

代码语言:javascript
复制
bx      lr

但更有可能的是,还原和实际回报将结合在一起,如下所示:

代码语言:javascript
复制
pop     {r4-r10, pc}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68643414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档