ecall
lyszt.net tratta ecall e altre istruzioni RISC-V in modo più dettagliato.
Descrizione
ecall chiede all'ambiente in cui viene eseguito il tuo programma di svolgere un servizio. L'assembly può sommare e spostare numeri, ma lo schermo, la tastiera e gli altri dispositivi appartengono al sistema che ospita il programma, quindi il codice non può raggiungerli da solo. ecall sta per environment call. Ferma il tuo codice, l'host esegue il servizio, e il controllo torna al tuo codice. L'host è un sistema operativo su hardware reale, e in questo simulatore è il simulatore stesso.
Il programma indica il servizio che desidera. Per convenzione il numero del servizio va in a7, tutti i dati di cui il servizio ha bisogno vanno in a0, e poi viene eseguito ecall. Questo simulatore offre questi servizi: 1 stampa l'intero in a0, 4 stampa il testo all'indirizzo in a0, 5 legge un numero dall'input in a0, 10 termina il programma, e 32 mette in pausa per a0 millisecondi.
Per stampare un numero, carica 1 in a7 per selezionare il servizio di stampa, carica il numero in a0, ed esegui ecall. L'esempio fa questo. Il servizio 10 termina un programma, ed è per questo che le lezioni finiscono con le due righe sotto. Senza di esso il processore continua oltre l'ultima riga verso qualunque cosa venga dopo.
li a7, 10 ecall
Il manuale RISC-V afferma che ecall effettua una richiesta di servizio all'ambiente di esecuzione, e che l'ambiente decide come vengono passati i parametri, di solito in registri interi definiti. Questo simulatore è l'ambiente qui e definisce i numeri di servizio elencati sopra. Il manuale osserva anche che ecall una volta si chiamava scall. Il suo compagno ebreak restituisce il controllo a un debugger. Entrambi sollevano un trap preciso e richiesto verso l'ambiente.
Un sistema operativo completo funziona allo stesso modo, con un elenco più lungo di servizi.
Esempio
li a7, 1 # service 1 = print integer li a0, 42 ecall # prints 42
