RISC-V Befehle

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.

Hat jemand eine Idee, warum das nicht funktionieren könnte?

.data
.float 1.5
.text
main:
    fmv.d.x f16, zero
    fld f17, (.data)
    jal ra, my_sum
    j stop

Fehlermeldung in Zeile 6:
AssemblerError: start1.s:6: Register f17 is not an integer register

Ich möchte den Double-Wert 1.5 in das float-Register f17 laden…

Die Register werden hier eigentlich ganz gut zusammengefast beschrieben: https://en.wikipedia.org/wiki/RISC-V#Register_sets

Ich nutze die VS Code-Erweiterung: RISC-V Venus Simulator embedded in VS Code

Hallo die Herren,

hab jetzt Folgendes probiert, um den Wert 1.5 in f16 zu laden:

    addi        a0, zero, 1
    addi        a1, zero, 5
    addi        a2, zero, 1
    addi        a3, zero, 10
    fcvt.d.w    f16, a0
    fcvt.d.w    f17, a1
    fcvt.d.w    f18, a2
    fcvt.d.w    f19, a3
    start1:
    flt.s       a3, f17, f18
    beq         a2, a3, stop1
    fdiv.s      f17, f17, f19
    # fmv.s
    j           start1
    stop1:
    fadd.d      f16, f16, f17

Zuerst lade ich intermediate 5 und 10 in die normalen int-Registers (das funktioniert auch laut Debugger). Dann move ich die Werte in die float-Registers (das funktioniert auch laut Debugger ). Dann möchte ich 5.0 / 10.0 + 1.0 rechnen. Das Ergebnis wäre dann in f16.

Problem: Nach der Zeile fdiv.s f17, f17, f19 steht im f17-Register immer der Wert NaN. Warum das denn, es kann nicht dividieren?

Wäre für jeden Input dankbar.