码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-03 20:12:29      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:res   对比   堆栈   未使用   窗口   执行   pos   处理器   关于   

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

标签:res   对比   堆栈   未使用   窗口   执行   pos   处理器   关于   

原文地址:https://www.cnblogs.com/yanhc/p/12628421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!