risc-v C函数调用反汇编示例
首先有一段C程序,其中main函数调用子函数add1
2
3
4
5
6
7//main.c
int add(int a, int b){
return a + b ;
}
int main(void){
return add(2, 3);
}
终端敲入rvgcc main.c -g
加-g
是为了反汇编时将C和汇编交差显示,方便阅读rvobjdum -dS a.out > main.S
反汇编看到
1 | 000000000001019c <add>: |
将上面的代码用伪代码概况精简如下:
1 | 子函数: |
栈底在最上面,示意如下
汇编语言参数传递的3种方法
- 寄存器传参, 效率高,适合少量参数
- 地址传参, 参数打包到一个结构体,讲结构体的地址传入,然后解包
- 堆栈传参,调用前先压栈,再调用,返回从堆栈返回,也可以从寄存器返回
三种传参方法可以单独使用,也可以联合使用
不同的编译器处理方式也是不一样,堆栈传参最为常见,有些编译器也会支持fast call
会将其编译成寄存器传参(条件是参数要小于可供传参的寄存器个数,一般6个左右)
C语言返回一般都是通过返回寄存器返回,如果一下返回多个参数,那么一般将多个参数放到一个结构体
将结构体的地址返回。
一些高级语言返回一次可以返回多个参数,实际上只不过编译器帮你做了包装的事情,计算机本身只能返回一个寄存器