首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RISC-V调用约定

RISC-V调用约定
EN

Stack Overflow用户
提问于 2020-10-19 14:48:39
回答 1查看 518关注 0票数 0

我已经读过这个alr了:https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf

但仍然找不到RISC-V将参数放入哪个寄存器。

代码fibonacci.c如下所示:

代码语言:javascript
复制
#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代码格式是这样的:

代码语言:javascript
复制
.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寄存器中的值,但输出仍然没有更改。

如下所示:

代码语言:javascript
复制
.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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 04:17:19

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

Compiler explorer是研究C ->汇编的一个非常有用的工具。在调用fibonacci之后,C代码将a0移动到-32(sp)中,然后移动到a1中用于下面的printf

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64422384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档