8.1 内存和寄存器的分配电子课件 计算机系统基础:C语言视角(RISC-V版).ppt
-
资源ID:87370285
资源大小:2.23MB
全文页数:20页
- 资源格式: PPT
下载积分:10金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
8.1 内存和寄存器的分配电子课件 计算机系统基础:C语言视角(RISC-V版).ppt
8.1 内存和寄存器的分配电子课件 计算机系统基础:C语言视角(RISC-V版)内存和寄存器的分配内存和寄存器的分配函数的底层实现函数的底层实现在在C C语言中,子程序被称为函数语言中,子程序被称为函数C C程序本质上是函数的集合程序本质上是函数的集合把把C C程序翻译到程序翻译到RISC-VRISC-V机器上,需要理解机器上,需要理解C C函数函数的翻译过程的翻译过程ABIABI操作系统为运行在该系统下的应用程序提供了操作系统为运行在该系统下的应用程序提供了应用程序二进制接口(应用程序二进制接口(Application Binary Application Binary InterfaceInterface,ABIABI)ABIABI包含了应用程序在这个系统下运行时必须包含了应用程序在这个系统下运行时必须遵守的编程约定遵守的编程约定包括系统调用的规定,以及关于程序可以使用的包括系统调用的规定,以及关于程序可以使用的内存和寄存器的规定内存和寄存器的规定Linux ABILinux ABIC C程序,编译到程序,编译到RISC-VRISC-V计算机时,必须遵守操计算机时,必须遵守操作系统作系统ABIABI规定规定GNUGNU为为RISC-VRISC-V计算机定义了计算机定义了LinuxLinux操作系统操作系统下的下的ABIABIRV32IRV32I内存分配内存分配内存分配内存分配代码区:程序,程序计数器代码区:程序,程序计数器PCPC为为C C的变量分配存储空间:静态数据区和运行的变量分配存储空间:静态数据区和运行时栈时栈静态数据区:静态存储类变量,寄存器静态数据区:静态存储类变量,寄存器x3x3运行时栈运行时栈:局部变量局部变量,x2x2指向栈顶指向栈顶堆:动态分配数据堆:动态分配数据系统空间:操作系统,如自陷处理例程,自陷系统空间:操作系统,如自陷处理例程,自陷向量表,向量表,I/OI/O设备寄存器的内存映射地址等。设备寄存器的内存映射地址等。寄存器分配寄存器分配寄存器的访问比存储器快得多寄存器的访问比存储器快得多RISC-VRISC-V算术算术/逻辑逻辑运算指令运算指令,对寄存器进行运算对寄存器进行运算应尽量多的使用寄存器应尽量多的使用寄存器RV32IRV32I寄存器分配寄存器分配寄存器寄存器用途用途ABI助记符助记符保存保存/恢复恢复x00zero无无x1返回地址返回地址ra(Return Address)x2栈指针栈指针sp(Stack Pointer)callee-savex3全局指针全局指针gp(Global Pointer)无无x4线程指针线程指针tp(Thread Pointer)无无x5x7临时值临时值t0t2(Temporary)x8保存寄存器保存寄存器/帧指针帧指针s0/fp(Frame Pointer)callee-savex9保存寄存器保存寄存器s1(Saved)callee-savex10 x11参数参数/返回值返回值a0a1(Argument)x12x17参数参数a2a7(Argument)x18x27保存寄存器保存寄存器s2s11(Saved)callee-savex28x31临时值临时值t3t6(Temporary)保存寄存器保存寄存器x8x9x8x9,x18x27x18x27:需要保存的寄存器,例如:需要保存的寄存器,例如局局部变量部变量,其中,其中,x8x8也可用于帧指针也可用于帧指针这里的局部变量指的是这里的局部变量指的是基本数据类型基本数据类型的变量的变量x5x7x5x7和和x28x31x28x31:存储:存储临时产生的值临时产生的值助记符助记符ABIABI定义定义在在RISC-VRISC-V汇编指令中,可以使用助记符汇编指令中,可以使用助记符寄存器保存寄存器保存/恢复恢复局部变量局部变量必须由被调用者保存必须由被调用者保存/恢复,即采用恢复,即采用callee-savecallee-save策略策略被调用者知道使用了哪些寄存器存储局部变量被调用者知道使用了哪些寄存器存储局部变量栈指针栈指针如果被修改,采用如果被修改,采用callee-savecallee-save策略保存策略保存/恢复恢复x0 x0,x3x3和和x4x4中的值是不变的,不需要保存中的值是不变的,不需要保存/恢复恢复其他寄存器,视情况可采用其他寄存器,视情况可采用caller-savecaller-save策略保策略保存存/恢复恢复为变量分配为变量分配内存内存静态存储类变量,分配到内存中静态存储类变量,分配到内存中数组、结构体等类型的变量,分配到内存中数组、结构体等类型的变量,分配到内存中当寄存器数量不足时当寄存器数量不足时例如,当局部变量例如,当局部变量(基本数据类型基本数据类型)个数多于个数多于1212个,个,或者参数个数多于或者参数个数多于8 8个个需要使用内存需要使用内存寄存器的保存寄存器的保存/恢复,需要使用内存恢复,需要使用内存静态数据区静态数据区静态存储类变量静态存储类变量全局变量全局变量关键字关键字staticstatic声明声明的静态变量的静态变量静态数据区示例静态数据区示例int a;int a;int b;int b;int main()int main()变量距离变量距离gp/x3gp/x3的偏移量的偏移量a:0a:0b:1b:1t0/x5t0/x5b b lw lw t0t0,4(,4(gpgp)运行时栈运行时栈局部变量局部变量/自动存储类变量自动存储类变量(基本数据类型基本数据类型)数组、结构体等数组、结构体等寄存器保存寄存器保存/恢复恢复x2/spx2/sp,栈指针栈指针运行时栈示例运行时栈示例int main()int main()int x10;int x10;/*/*对数组对数组x x进行初始化进行初始化*/*/*输出累加和输出累加和*/*/printf(sum=%d n,sum);printf(sum=%d n,sum);数组数组x x是局部变量,被分配到栈中是局部变量,被分配到栈中把变量把变量x9x9加载到临时寄存器加载到临时寄存器x5/t0 x5/t0中中lw lw t0,36(t0,36(spsp)帧指针帧指针更方便的访问运行时栈中的变量更方便的访问运行时栈中的变量帧指针帧指针作为作为基址基址x8/fpx8/fpt0t0 x9x9假设假设x9x9距离距离fpfp的的偏移量偏移量为为-2-2,在,在fpfp和和x9x9之之间存储的都是整数类型的值间存储的都是整数类型的值lw lw t0,-8(t0,-8(fpfp)函数的栈帧函数的栈帧函数的栈帧函数的栈帧/活动记录活动记录从帧指针所指的单元到栈指针所指的单元之间的从帧指针所指的单元到栈指针所指的单元之间的这段存储空间这段存储空间问题:问题:在函数的栈帧中,除了局部变量,还存储了哪些在函数的栈帧中,除了局部变量,还存储了哪些内容?内容?答案答案:与函数的与函数的调用调用过程有关过程有关