我已经读过这篇文章:https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf
但是仍然无法确定RISC-V哪个寄存器中放入了参数。
fibonacci.c代码如下:
#include <stdio.h>
unsigned long long int fibonacci(int);
int main () {
unsigned long long int ret;
for (int i = 0; i < 94; i++) {
ret = fibonacci(i);
printf("%llu\n", ret);
}
return 0;
}
和.s代码格式如下:
.global fibonacci
.type fibonacci, %function
.align 2
# unsigned long long int fibonacci(int n);
fibonacci:
# insert code here
# Green card here: https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf
ret
我尝试更改a0,a1寄存器中的值,但是输出仍然没有改变。
像这样:
.global fibonacci
.type fibonacci, %function
.align 2
# unsigned long long int fibonacci(int n);
fibonacci:
# insert code here
add a0, a0, a0
addi a1, zero, 1
# Green card here: https://www.cl.cam.ac.uk/teaching/1617/ECAD+Arch/files/docs/RISCVGreenCardv8-20151013.pdf
ret
输出仍然是 0 1个 2 3 ... ... ... 90 91 92 93
答案 0 :(得分:0)
fibonacci函数的调用abi对于输入和输出都是a0(对于32位a1也用于输出)。
Compiler explorer是研究C-> Assembly的非常有用的工具。调用fibonacci
之后,C代码将a0
移至-32(sp)
,然后将a1
移至后续的printf
。