RISC-V汇编学习笔记(六):RISC-V汇编语言和栈的使用

废话:

大三老菜狗来更新啦,哎,感叹一下生活不易,天天犯困。

 

栈:

 1.一种后入先出(LIFO)的队列结构,通过压入和弹出操作将数据放入或移出栈。

2.栈是存储系统的一部分,因此需要一个指向它的基地址,sp寄存器(x2)就是RISC-V的栈指针寄存器。

3.通常沿高地址向低地址的方向来扩展栈空间通过递减设定(sp)值不断压入(push)数据,通过递增设定(sp)值来弹出(pop)数据。

栈帧:

一次函数调用中保存在栈中的数据是按一定的顺序组织在一起的,这种组织结构就是栈帧。

递归函数调用:

被调用的函数内部又调用了其他函数时,是否因为新的函数调用而破坏原调用中的参数寄存器值a0 - a7、以及ra中的返回地址值。

函数调用中的寄存器约定:

1.在函数调用关系中,通常将发起调用的函数称为调用函数(caller),将被调用函数称为被调用函数(callee)。

2.被调用函数执行结束返回时,调用函数需要知道本次函数调用中哪些寄存器的值被动过、哪些寄存器的值没变。

3.寄存器使用规范,规定了函数调用后哪些寄存器能被修改,哪些寄存器不能被修改

4.函数调用时保存的寄存器:被调用函数一般不会使用,即便使用也要提前保存原值

调用函数可以信任sp、gp、tp寄存器和s0 - s11寄存器额值没有被更改

5.函数调用时不保存的寄存器:有可能被被调用函数使用更改,需要调用函数在调用前对自己用到的寄存器进行保存,这些寄存器包括ra和t0 - t6以及a0 - a7。

RISC-V寄存器:

注释:No代表Caller;Yes代表Callee

在栈中为新数据分配空间 

栈指针:SP;帧指针FP

静态区、堆区和栈区 

1.静态区:保存的是在程序中声明一次的全局变量,这部分存储空间值有在程序执行完毕后才会被释放。

2.堆区:使用malloc函数申请的一些动态存储空间,保存一些程序中的动态变量;

3.栈区:程序发生函数调用时用来保存寄存器值存储空间。

栈在内存的空间

这里使用的是RV32I

栈区从高地址0xbfff_fff0开始向低地址扩展,以每16byte为界进行对齐   

RV32的程序段是以pc为界向上存放的         

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值