push {LR} ;return pop {PC}
时间: 2023-11-01 13:37:19 浏览: 32
这是 ARM 汇编语言中用于函数调用和返回的指令序列。它的作用是将 Link Register(LR)的值保存到栈中,然后跳转到函数代码执行。在函数执行完毕后,使用 pop {PC} 指令将保存在栈中的 LR 值弹出并存储到 PC 寄存器中,从而实现函数返回。该指令序列可以简写为 bl 和 bx lr,具体使用哪种方式取决于编译器和目标平台的要求。
相关问题
为什么最后pop的是pc而不是lr__asm int func1(int arg1, int arg2){ PUSH {r4, lr} ; store r4 and lr to stack MOVS r4, r1 ; r4 = arg2 ; 1st argument already in r0 MOVS r1, #4 ; 2nd argument for func2 MOVS r2, #5 ; 3rd argument for func2 MOVS r3, #6 ; 4th argument for func2 BL func2 ; call func2 ADDS r0, r0, r4 ; return value in r0 … POP {r4, pc} ; load lr back to pc, then return }
在 ARM Cortex-M 架构中,链接寄存器 lr(Link Register)用于存储函数返回地址。在函数调用时,链接寄存器 lr 会被设置为调用该函数的指令的下一条指令的地址,以便在函数返回时可以跳转回调用该函数的指令。因此,在函数的末尾,应该从堆栈中恢复链接寄存器 lr 的值,以便正确地返回到调用该函数的指令。
在这个例子中,链接寄存器 lr 的值已经存储在堆栈中,所以必须使用 POP 指令将它恢复。但是,由于这个函数的返回值已经存储在寄存器 r0 中了,所以不能再使用 POP 指令将寄存器 lr 直接恢复到 PC 寄存器(Program Counter),否则函数的返回值将被覆盖。因此,这里使用了 POP {r4, pc} 指令,它会先将堆栈中存储的寄存器 r4 的值恢复到 r4 寄存器中,然后将链接寄存器 lr 的值恢复到 PC 寄存器中,从而正确地返回到调用该函数的指令。
用中文给每行代码加注释__asm int func1(int arg1, int arg2){ PUSH {r4, lr} ; store r4 and lr to stack MOVS r4, r1 ; r4 = arg2 ; 1st argument already in r0 MOVS r1, #4 ; 2nd argument for func2 MOVS r2, #5 ; 3rd argument for func2 MOVS r3, #6 ; 4th argument for func2 BL func2 ; call func2 ADDS r0, r0, r4 ; return value in r0 … POP {r4, pc} ; load lr back to pc, then return }
下面是对代码的每行进行注释的解释:
```
__asm int func1(int arg1, int arg2){
```
这是一个使用汇编语言编写的函数,参数 arg1 和 arg2 是整数类型,返回值也是整数类型。
```
PUSH {r4, lr} ; store r4 and lr to stack
```
将寄存器 r4 和链接寄存器 lr 的值存储在堆栈中,以备后续使用。
```
MOVS r4, r1 ; r4 = arg2 ; 1st argument already in r0
```
将第二个参数 arg2 的值存储在寄存器 r4 中,而第一个参数 arg1 的值已经存储在寄存器 r0 中了。
```
MOVS r1, #4 ; 2nd argument for func2
```
将数字 4 存储在寄存器 r1 中,作为将要传递给 func2 函数的第二个参数。
```
MOVS r2, #5 ; 3rd argument for func2
```
将数字 5 存储在寄存器 r2 中,作为将要传递给 func2 函数的第三个参数。
```
MOVS r3, #6 ; 4th argument for func2
```
将数字 6 存储在寄存器 r3 中,作为将要传递给 func2 函数的第四个参数。
```
BL func2 ; call func2
```
调用另一个函数 func2。
```
ADDS r0, r0, r4 ; return value in r0
```
将 func2 函数的返回值与第二个参数 arg2 相加,并将结果存储在寄存器 r0 中,以备用作函数的返回值。
```
POP {r4, pc} ; load lr back to pc, then return
```
将存储在堆栈中的寄存器 r4 和链接寄存器 lr 的值恢复,然后返回到函数的调用者。