RISC-V 调用约定
RISC-V calling convention
我已经读过这个 alr : 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
斐波那契函数的调用 abi 对于输入和输出都是 a0(对于 32 位 a1 也用于输出)。
Compiler explorer 是研究 C -> 程序集的非常有用的工具。在调用 fibonacci
之后,C 代码将 a0
移动到 -32(sp)
中,然后移动到 a1
中以用于以下 printf
.
我已经读过这个 alr : 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
斐波那契函数的调用 abi 对于输入和输出都是 a0(对于 32 位 a1 也用于输出)。
Compiler explorer 是研究 C -> 程序集的非常有用的工具。在调用 fibonacci
之后,C 代码将 a0
移动到 -32(sp)
中,然后移动到 a1
中以用于以下 printf
.