ARM处理器的堆栈和函数调用,以及与Sparc的比较

Posted yanhc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM处理器的堆栈和函数调用,以及与Sparc的比较相关的知识,希望对你有一定的参考价值。

主要内容来自以下网址。该网站是个学习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的作用)。

 

以上是关于ARM处理器的堆栈和函数调用,以及与Sparc的比较的主要内容,如果未能解决你的问题,请参考以下文章

学习 SPARC 汇编中函数调用的基本示例

从Java的堆栈到Equals和==的比較

TQ2440开发板学习纪实--- 设置堆栈并调用C函数

ARM64的函数调用标准和栈布局

ARM的堆栈方式

如何测量 C 中任意函数调用使用的堆栈数量?