Input e output

Input e output

gestisce tutti gli input e gli output. Un (chiamata all'ambiente) chiede al sistema operativo o al simulatore di eseguire un servizio per il tuo codice assembly. Lo schermo e la tastiera sono due dei servizi disponibili in questo modo.

Metti il numero di servizio in a7, qualsiasi argomento in a0, poi attiva . I servizi che questo simulatore conosce:

Servizi (a7)
1 # stampa intero (a0 = numero)
4 # stampa stringa (a0 = indirizzo del testo)
5 # leggi intero (risultato restituito in a0)
10 # termina il programma
32 # pausa (a0 = millisecondi)
Chiamata di servizio
programma
a71
a0valore
ecall
systemstampa un numero

a7 = 1 seleziona il servizio di stampa.

Ogni servizio condivide lo stesso handshake a due registri. a7 indica quale servizio eseguire, mentre a0 contiene tutto ciò di cui quel servizio ha bisogno: un valore da stampare, un indirizzo da cui leggere, un tempo di attesa. L’elenco è fisso e breve, composto da cinque voci; pertanto, una volta appreso questo handshake, si conoscono tutti i modi in cui questo simulatore comunica con il mondo esterno. Un vero sistema operativo estende lo stesso concetto a un elenco molto più lungo.
Leggi un numero, raddoppialo, visualizzalo
li a7, 5 # leggi intero -> a0
ecall
add a0, a0, a0 # raddoppialo
li a7, 1 # stampa intero
ecall
li a7, 10
ecall

seleziona la lettura di un intero e si mette in pausa per l'input, restituendo il tuo numero in a0. somma a0 a se stesso, raddoppiandolo sul posto. Poi e stampano il risultato, e e escono. Quando lo esegui, il simulatore apre una casella di input. Digita un numero e guardalo tornare raddoppiato.

Stampa del testo

Per prima cosa, due nuovi termini. Una sezione è un'area etichettata del programma: le istruzioni risiedono nella sezione .text, mentre i dati fissi come il testo risiedono nella sezione .data. E un indirizzo è semplicemente un numero che identifica una posizione nella memoria. Invece di trasportare l’intera stringa, un registro può contenere l’indirizzo in cui inizia la stringa, e il servizio di stampa legge da lì.

Il testo va nella sezione data. Gli si associa un'etichetta, poi si usa ("load address") per caricare l'indirizzo di quell'etichetta e il servizio 4 per stamparlo.

Ciao, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = indirizzo del testo
li a7, 4 # stampa stringa
ecall
li a7, 10
ecall

In .data, la direttiva riserva spazio per il testo e associa l'etichetta msg. .string memorizza i caratteri e aggiunge \n, un carattere di nuova riga. In .text, mette l'indirizzo del testo in a0, sceglie il servizio di stampa di stringhe, e stampa i caratteri da quell'indirizzo fino a raggiungere la fine della stringa. Poi il programma termina come al solito.