主要内容来自以下网址。该网站是个学习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时,寄存器窗口会旋转,从而做了
(1)将fp和lr压入堆栈(当前未使用的寄存器窗口发挥了部分堆栈的作用),
(2)让fp=sp(fp=i6,sp=o6,以及寄存器窗口旋转方向,完成了fp=sp操作),
(3)sp减去栈帧长度(save有add的作用)。
原文地址:https://www.cnblogs.com/yanhc/p/12628421.html