ARM处理器的堆栈和函数调用,以及与Sparc的比较 Sparc V8 汇编指令、寄存器窗口、堆栈、函数调用

主要内容来自以下网址。该网站是个学习ARM汇编的好地方。计划将该篇文章翻译过来,并和Sparc对比。

https://azeria-labs.com/functions-and-the-stack-part-7/

ARM和Sparc比较

之前整理的Sparc的原理,Sparc V8 汇编指令、寄存器窗口、堆栈、函数调用https://www.cnblogs.com/yanhc/p/12255886.html

关于函数调用的跳转执行

ARM跳转有BL指令,Branch Link(Saves (PC+4) in LR and jumps to function),即首先将跳转指令的下一条指令地址保存在LR寄存器中,以便调用函数返回时能找到返回地址,然后执行跳转。

对于Sparc处理器,在执行call label时,会将PC拷贝到o7(r15,address of call instruction),call指令本身叫call and link,其中link与ARM中BL的link是一个意思,即保存一个调用函数的链接。不同的是ARM保存的是跳转指令的下一条指令地址,Sparc保存的是跳转指令地址,这没关系,对于Sparc来说,只需在返回的时候+4即可得到下一条要执行的地址,即返回的地址。

关于函数调用时的frame pointer,fp保存

对于ARM,r11为fp。在调用callee函数中,会

(1)将fp和lr压入堆栈push {r11, lr},

(2)让fp=sp,add r11, sp, #0,

(3)sp减去栈帧长度,sub sp, sp, #16。

对于Sparc,fp=i6,sp=o6。在调用callee函数中,执行save %sp, -1024, %sp时,寄存器窗口会旋转,从而做了

扫描二维码关注公众号,回复: 10448010 查看本文章

(1)将fp和lr压入堆栈(当前未使用的寄存器窗口发挥了部分堆栈的作用),

(2)让fp=sp(fp=i6,sp=o6,以及寄存器窗口旋转方向,完成了fp=sp操作),

(3)sp减去栈帧长度(save有add的作用)。

猜你喜欢

转载自www.cnblogs.com/yanhc/p/12628421.html