Соглашение о вызовах RISC-V.

#riscv

#riscv

Вопрос:

Я прочитал это 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("%llun", 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. Ваши изменения в сборке должны иметь эффект. Мое лучшее предположение о том, почему вы не видите изменений, заключается в том, что вы связываете старую версию сборки. Пожалуйста, укажите шаги для компиляции и ссылки, которые вы используете.

2. LOL Я обнаружил ошибку, я извлекаю код из docker, но я кодирую в своей IDE, это не меняет код в docker

Ответ №1:

Вызывающий abi для вашей функции Фибоначчи — это просто a0 как для ввода, так и для вывода (для 32-битного a1 также используется для вывода).

Compiler explorer — невероятно полезный инструмент для исследования C -> Assembly. После вызова fibonacci C код переходит a0 в -32(sp) , а затем в a1 для следующего printf .

Комментарии:

1. Непривилегированная спецификация RISC-V описывает соглашение о вызовах в главе 25. a0 — a7 может использоваться для аргументов функции. Вы также можете посмотреть ссылку, чтобы понять соглашение о вызовах youtube.com/watch ? v= wyjtOdgt2n8amp;t= 734s .

2. Примечательно, что спецификация RISC-V (RV) не определяет, какие аргументы помещаются в какие регистры. В частности, что касается C, вы должны обратиться к соглашению о вызовах C для RV для получения подробной информации; аргументы размером более одного регистра, более 8 аргументов и varargs — это все случаи, когда нет ни одного очевидного способа следовать спецификации RV. К сожалению, в соглашении о вызовах C на RV нет хорошего документа, о котором я знаю.