gpt4 book ai didi

assembly - BL 指令 ARM - 它是如何工作的

转载 作者:行者123 更新时间:2023-12-02 05:48:51 25 4
gpt4 key购买 nike

我正在学习 ARM 汇编,但我现在陷入困境。

我知道链接寄存器,如果我没记错的话,它会保存函数调用完成时要返回的地址。

所以如果我们有类似的东西(取自 ARM 文档):

0 | here
1 | B there
2 |
3 | CMP R1, #0
4 | BEQ anotherfunc
5 |
6 | BL sub+rom ; Call subroutine at computed address.

因此,如果我们将左侧的列视为每条指令的地址,那么在地址 1 处的 B 之后,链接寄存器保存的值为 1,对吗?

然后程序转到那里的方法,然后它使用链接寄存器的值来知道从哪里返回。

如果我们现在跳到地址 6,我被卡住了,我们知道 BL 将下一条指令的地址复制到 lr(r14,链接寄存器)中的内容。

所以现在它会复制 sub 的地址,它是一个子程序(什么是子程序??)+ rom(这是一个数字?)或 sub+rom 的地址(我不知道这可能是什么)。

但一般来说,我们什么时候需要 BL?为什么我们要在上面的例子中使用它?有人可以举个例子,我们真的需要它吗?

谢谢!

最佳答案

似乎有点困惑。这是一个解释:
B指令会分支。它跳转到另一个指令,并且没有预期的返回。未触及链接寄存器 (LR)。
BL指令会分支,也会链接。 LR 会加载BL 之后的指令地址在内存中,不是在 BL 之后执行的指令.然后就可以使用 LR 从分支返回。

例子 :

start:
01: MOV r0, r2 ; some instruction
02: B there ; go there and never return !

there:
11: MOV r1, r0 ; some instruction
12: BL some_function ; go to some_function, but hope to return !
; this BL will load 13 into LR
13: MOV r5, r0
14: BL some_function ; this BL will load 15 into LR
15: MOV r6, r0


some_function:
MOV r0, #3
B LR ; here, we go back to where we were before

如果你想在一个函数内部调用另一个函数,LR会被覆盖,所以你将无法返回。常见的解决方案是使用 PUSH {LR} 将 LR 保存在堆栈中,并在返回之前恢复它 POP {LR} .您甚至可以在单个 POP {PC} 中恢复和返回:这将恢复LR的值,但在程序计数器中,有效地返回了函数。

关于assembly - BL 指令 ARM - 它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34091898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com