1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-29 11:24:18 +00:00
triennale-appunti-steffo/public/materials/year1/architettura/5_primo_programma.md

1.6 KiB

Primo programma in RISC-V

# Che bello! Adoro l'assembly!
# Questo programma funziona, è verificato!
.global _start

# La sezione .data contiene i dati del programma
.section .data

    # Creo una variabile con etichetta "ciao"
    ciao: .string "0\n\0"

# La sezione .rodata contiene i dati del programma in sola lettura
.section .rodata

# La sezione .text contiene il testo del programma
.section .text

    # Creo una label _start che funzionerà da entrypoint
    _start: 
        li      t1, 10                      # Voglio ripetere il ciclo 10 volte
        li      a7, 64                      # PRINT(stream, indirizzo, numerobytes) è la syscall 64
        li      a0, 0                       # stream è il primo argomento: vogliamo scrivere su stdout (0)
        la      a1, ciao                    # indirizzo è il secondo argomento: partiamo dall'etichetta ciao
        li      a2, 2                       # numerobytes è il terzo argomento: vogliamo stampare 2 bytes
    print:
        ecall                               # PRINT(a0, a1, a2)
        lbu      t0, 0(a1)                  # Carica il byte con il 0
        addi     t0, t0, 1                      # Aggiungici 1
        sb		 t0, 0(a1)                  # Ricaricalo in memoria
        addi     t1, t1, -1                      # Togli 1 dal numero di cicli rimasti
        bne		 t1, zero, print            # Se rimangono dei cicli, torna indietro e falli!
    end:
        li      a7, 93                      # Tutti i programmi terminano chiamando la syscall 93, EXIT()
        ecall                               # EXIT()