Entrée et sortie

Entrée et sortie

gère toutes les entrées et sorties. Un (appel à l'environnement) demande au système d'exploitation ou au simulateur d'exécuter un service pour votre code assembleur. L'écran et le clavier sont deux des services disponibles de cette manière.

Placez le numéro de service dans le registre a7, l'éventuel argument dans a0, puis déclenchez . Les services pris en charge par ce simulateur sont :

Services (a7)
1 # afficher un entier (a0 = nombre)
4 # afficher une chaîne (a0 = adresse du texte)
5 # lire un entier (résultat renvoyé dans a0)
10 # quitter le programme
32 # pause (a0 = millisecondes)
Appel de service
programme
a71
a0valeur
ecall
systèmeaffiche un nombre

a7 = 1 sélectionne le service d'impression.

Chaque service utilise le même protocole de communication à deux registres. a7 indique quel service exécuter, et a0 contient tout ce dont ce service a besoin : une valeur à afficher, une adresse à lire, une durée d'attente. La liste est fixe et courte (cinq entrées) ; il suffit donc d’apprendre une seule fois ce protocole de communication pour maîtriser toutes les interactions de ce simulateur avec le monde extérieur. Un véritable système d’exploitation étend ce même principe à une liste bien plus longue.
Lire un nombre, le doubler, l'afficher
li a7, 5 # lire un entier -> a0
ecall
add a0, a0, a0 # le double
li a7, 1 # afficher un entier
ecall
li a7, 10
ecall

sélectionne la lecture d'un entier et fait une pause pour l'entrée, renvoyant votre nombre dans a0. ajoute a0 à lui-même, le doublant sur place. Ensuite, et affichent le résultat, et et quittent. Lorsque vous l'exécutez, le simulateur affiche une boîte de saisie. Tapez un nombre et regardez-le revenir doublé.

Impression de texte

Commençons par deux nouveaux termes. Une section est une zone identifiée de votre programme : les instructions se trouvent dans la section .text, tandis que les données fixes, comme le texte, se trouvent dans la section .data. Quant à une adresse, il s’agit simplement d’un nombre qui identifie un emplacement en mémoire. Au lieu de transporter une chaîne de caractères entière, un registre peut contenir l’adresse à laquelle la chaîne commence, et le service d’impression lit à partir de là.

Le texte va dans la section data. Vous y attachez une étiquette, puis vous utilisez ("load address") pour charger l'adresse de cette étiquette et le service 4 pour l'afficher.

Bonjour, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = adresse du texte
li a7, 4 # afficher une chaîne
ecall
li a7, 10
ecall

Dans .data, la directive réserve de l'espace pour le texte et attache l'étiquette msg. .string stocke les caractères et ajoute \n, un saut de ligne. Dans .text, place l'adresse du texte dans a0, choisit le service d'affichage de chaîne, et affiche les caractères à partir de cette adresse jusqu'à atteindre la fin de la chaîne. Ensuite, le programme se termine comme d'habitude.