废话:
大三老菜狗来更新啦,哎,感叹一下生活不易,天天犯困。
栈:
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为界向上存放的