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.