Bitte fragt nicht nach dem Sinn des folgenden Programms…
Es soll eine Variable mit dem Wert 41 initialisiert werden, diese Variable soll verdoppelt werden, dann soll 1 hinzuaddiert werden und dann soll nochmal 1 hinzuaddiert werden. Das Ergebnis sollte ausgegeben werden.
main:
addi a0, zero, 41
jal ra, my_function
addi a0, a0, 1
j stop
my_function:
# Prologue
addi sp, sp, -32
sw ra, 0(sp)
sw a0, 8(sp)
sw s0, 16(sp)
sw s1, 24(sp)
add a0,a0,a0
jal ra, my_function_2
# Epilogue
lw ra, 0(sp)
# lw a0, 8(sp)
lw s0, 16(sp)
lw s1, 24(sp)
addi sp, sp, 32
ret
my_function_2:
# Prologue
addi sp, sp, -32
sw ra, 0(sp)
sw a0, 8(sp)
sw s0, 16(sp)
sw s1, 24(sp)
addi a0, a0, 1
# Epilogue
lw ra, 0(sp)
# lw a0, 8(sp)
lw s0, 16(sp)
lw s1, 24(sp)
addi sp, sp, 32
ret
stop:
Ihr könnt das mit (jedem) RISC-V Online Simulator gern ausprobieren.
Meine Frage wär, a) Warum es nicht mehr funktioniert, wenn ich Zeile 20 und 38 EINkommentiere, b) Wie das korrekte Idiom für eine Funktion mit sagen wir zwei Parametern und einem Rückgabewert aussieht, und c) Wie man solch eine Funktion „sicher“ aufrufen kann.