#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 нет хорошего документа, о котором я знаю.