为什么最后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 }
时间: 2024-03-18 16:44:34 浏览: 99
C8051_int_asm.rar_c8051 int_c8051中int
在 ARM Cortex-M 架构中,链接寄存器 lr(Link Register)用于存储函数返回地址。在函数调用时,链接寄存器 lr 会被设置为调用该函数的指令的下一条指令的地址,以便在函数返回时可以跳转回调用该函数的指令。因此,在函数的末尾,应该从堆栈中恢复链接寄存器 lr 的值,以便正确地返回到调用该函数的指令。
在这个例子中,链接寄存器 lr 的值已经存储在堆栈中,所以必须使用 POP 指令将它恢复。但是,由于这个函数的返回值已经存储在寄存器 r0 中了,所以不能再使用 POP 指令将寄存器 lr 直接恢复到 PC 寄存器(Program Counter),否则函数的返回值将被覆盖。因此,这里使用了 POP {r4, pc} 指令,它会先将堆栈中存储的寄存器 r4 的值恢复到 r4 寄存器中,然后将链接寄存器 lr 的值恢复到 PC 寄存器中,从而正确地返回到调用该函数的指令。
阅读全文