汇编函数的调用约定
文章目录
汇编的调用约定
函数调用过程的概述
stack frame
调用一个函数的时候,就会压入栈帧里面,在调用A函数后,再调用B函数,B函数的地址就会继续压栈,当B函数处理完之后,在栈帧里面的B地址就会出栈,入宫函数过多的话,有可能会出现爆栈的情况
函数调用约定
- caller就是一个函数调用者,callee就是被调用函数
- 在caller中调用call,调用了callee,callee执行完之后返回,返回到调用call的下一个地址
这里有一个问题,函数调用的时候,那些函数的调用参数,和函数的返回值应该放在哪里呢?
这就是我们下面要解决的问题
函数调用过程中的编程约定
有关寄存器的编程约定
x0-x31就是寄存器的最初始化的名字,最开始的32个寄存器
ABI就是在函数的时候吧这些寄存器普遍化修改的别名,主要使用的就是这些别名,我们之后都是使用这些别名,更好的进行理解
N/A:就是not available,没有人维护
ra:return address,就是jal函数返回后的下一个地址,由调用者来进行维护,因为函数返回之后要达到对应的位置
sp:stack pointer:就是用来存放栈指针,由被调用者来维护,因为出栈和入栈主要就是由被调用的子函数来执行
t:temporary:临时寄存器,用来函数调用者保存函数的一些临时变量
s :save :保存寄存器,就是和t是反过来的,对于调用者来说,要保证save里面的值在调用前和调用后值是不变的
a:argument参数寄存器,用于在函数时候保存函数的参数,以及传递返回值
我们在写risc-v的时候,一般使用a0,a1来进行返回
使用a0-a7来进行传递函数的参数
函数跳转和返回指令的编程约定
(1)
(2)
我们要将函数的ra寄存器保存在栈里面,避免之后调用的时候这个ra寄存器没了,寄存器没了的话,函数返回地址就没了,不知道返回到那里,所以我们要用s寄存器来保存ra的值,退栈的时候恢复ra的值
在c语言里面调用汇编代码
- 汇编
示例
1 |
|
在汇编代码里面调用c代码
1 |
|
汇编函数的调用约定
http://example.com/2022/11/05/汇编函数的调用约定/