Sparc架构中的栈与寄存器
寄存器的基本结构
通用整数寄存器
在sparc架构中,同一时刻可以使用的整数寄存器为32个,如下图所示,其中8个为一组,除了一组全局寄存器(%g1-g7)外,其余的3组寄存器组成了一个寄存器窗口,在不同的sparc处理器里,寄存器窗口可以有2到32个,寄存器总数从40到520不等,大多数sparc处理器有7到8个窗口,这也是为什么sparc架构被称为是“可扩充的(scalable)”的原因。
寄存器窗口
下图展示了一个拥有8个寄存器窗口(w0-w7)的sparc处理器。
当前寄存器窗口指针(CWP)
CWP是PSR(程序状态寄存器)的一部分,如上面所说的,同一时刻只有32个整数寄存器处于可用状态,即8个全局寄存器和CWP所指向寄存器窗口中的24个寄存器,CWP通常会因SAVE指令(SAVE指令一般在过程调用时使用,用来开辟新的栈帧并切换寄存器窗口)而减一,因RESTORE指令(在从过程中返回前切换回调用者的寄存器窗口)而加一,陷阱事件(中断,异常或TRAP指令)和RETT指令(从陷阱中返回)也会改变CWP,不过函数调用比陷阱更为常见。
窗口无效掩码(WIM)
窗口的重叠
或许你已经注意到了,上图中的out寄存器组和in寄存器组是重叠的,也就是说,相邻窗口的out和in寄存器内容相同,这是为了方便过程(或者说函数)的调用,在调用者(caller)中,先把要传递的函数参数依次放入out寄存器,之后执行CALL指令(CALL callee)跳转到被调用者(callee)处,然后执行SAVE指令切换寄存器窗口,被调用者便可以使用in寄存器来访问这些参数。同样的,被调用者也可以成为调用者。
寄存器使用规则
上面说到,out和in寄存器组用来传递和接受参数,但实际上只有%o0-o5以及%i0-i5用来存放参数,六个以上的参数存放在栈中。那么%o6,%i6和%o7,%i7用来做什么呢,先来说o7和i7,调用者在执行CALL callee时,会把当前指令的地址存放在o7中,在被调用者执行完SAVE指令后,o7就变成了i7,此时执行RET指令便会跳转到刚才调用者执行调用的条指令的地址,这样就完成了函数的返回。
而o6和i6寄存器有些特殊o6又被称为sp(stack pointer),即栈指针,i6又被称为fp(frame pointer),即帧指针,sp指向栈顶,而fp指向栈帧的起始位置,当执行SAVE指令时,o6变为i6,sp的值传给了fp,而SAVE指令又同时会执行一次加法操作,将旧sp的值加上栈帧的长度赋给新sp,这样就完成了函数调用中栈帧的开辟。
栈帧的结构
下图便是栈帧的结构
注意图中被一片空白分成了上下两部分,上面的部分用sp+偏移量来访问,下面的部分用fp-偏移量来访问。为什么是sp+偏移量,fp-偏移量?因为栈是向着低地址增长的,所以在上图中,下面是高地址,上面是低地址。
注意最接近fp的一个部分,即addressable scalar automatics,这个的意思其实就是局部变量,函数中声明的变量存放于此处
上图为一个栈的内容的例子,注意local和in寄存器的值和栈中暂存的值并不相同,这是因为许多事件都会导致寄存器的值被冲进栈中,比如许多的系统调用
窗口上溢与下溢陷阱
原版地址(需翻墙):
https://cseweb.ucsd.edu/~gbournou/CSE131/sparcstack.html
Sparc架构中的栈与寄存器相关推荐
- SPARC架构下的反汇编(三)——SPARC汇编语言
1.Load&Store Architecture (存取架构) SPARC架构只能对存储在寄存器中的数据执行运算(例如算术和逻辑功能).需要使用单独的指令将数据从存储器移至寄存器(Load) ...
- 理解S12(X)架构中的地址映射方案
由于在暑假匆忙接收的嵌入式项目中需要使用特别大的数组,非分页RAM的内存不够用了,没办法,硬着头皮尝试使用分页RAM,但是完全没有单片机的基础,导致极其的困难.之前写程序都是按照纯软件的思维,主要考虑 ...
- ARM体系架构—ARMv7-A处理器模式及寄存器
一.ARMv7-A处理器模式 ARMv7架构支持安全扩展,如果使能了安全扩展,ARMv7-A架构分为安全模式(Secure State)和非安全模式(Non-secure State)两个世界. 在非 ...
- ARM架构中MMU/TLB/Cache的一些概念和寄存器
★★★ 个人博客导读首页-点击此处 ★★★ 相关文章 1.ARMV8-aarch64的MMU学习笔记 2.aarch64的TCR寄存器介绍 文章目录 1.MMU/Cache相关的一些基本概念 (1). ...
- 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理
目录 为什么浮点数不能用普通的数学指令计算 结论 用普通的数学计算add无法实现浮点数加法.必须使用浮点数计算指令fadd来进行浮点数加法计算. fpu的概念 浮点数计算需要先用fld指令压栈用fld ...
- SPARC架构下的反汇编(四)——SPARC汇编语言(二)
1.函数栈桢(stack&frame) 函数调用时栈中分配的内存块. %fp :帧指针 %sp:栈指针 具体如图: 在IDA中,每个函数前面一部分是这样的: 函数中这样使用%fp和%sp 由上 ...
- SPARC架构下的反汇编(一)——SPARC简介
1. 写作目的&个人水平 之前做过SPARC架构下的反汇编项目,但资料比较少,所以写一点笔记,结合已有的资料以及个人的经验以便于查阅.总体来说就是资料的阅读理解和实际操作的经验.因为水平有限, ...
- gdb相关(栈和寄存器)
GDB的常用调试命令大家可以查阅gdb手册就可以快速的上手了,在这儿就不给大家分享了,需要的可以到GDB的官网去下载手册.这里重点分享下GDB调试中的一些寄存器和栈的相关知识用于解决下列gdb调试时的 ...
- 如何在微服务架构中实现安全性?
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者 | Chris Richardson 网络安全已成为每个企业都面临的关键问题.几乎每天都有 ...
最新文章
- jmeter使用问题——将接口返回变量存储成csv文件
- java reference详解_Java Reference详解
- 20天掌握C语言,C语言零基础到项目实战,玩转C语言
- java程序启动后就进行了7次younggc_程序员如何优化 Java GC
- 2011年最后一小时
- img标签过滤加fs模块实现图片文件缓存
- python tushare
- 博客日历的html代码,八种精美的博客日历代码
- INSERT INTO SELECT FROM 的用法
- JS获取今天是星期几
- JS Base64加密解密
- 十问业务中台和我的答案
- Linux下CGroup进行CPU、内存等资源控制
- vue项目实现前端预览word和pdf格式文件
- 抖音视频真的能赚到钱吗?抖音真的有带货力吗?国仁网络资讯
- GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis
- Excel日常遇到的问题整理(持续更新)
- java控制台打印输出 中文乱码 解决办法
- UI界面布局有哪些?
- 今天项目报错: No operations allowed after connection closed