RISC-V呼叫约定

时间:2020-10-19 06:48:39

标签: riscv

我已经读过这篇文章: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

1 个答案:

答案 0 :(得分:0)

fibonacci函数的调用abi对于输入和输出都是a0(对于32位a1也用于输出)。

Compiler explorer是研究C-> Assembly的非常有用的工具。调用fibonacci之后,C代码将a0移至-32(sp),然后将a1移至后续的printf