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 :
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 programme32 # pause (a0 = millisecondes)
a7 = 1 sélectionne le service d'impression.
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.li a7, 5 # lire un entier -> a0ecalladd a0, a0, a0 # le doubleli a7, 1 # afficher un entierecallli a7, 10ecall
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.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = adresse du texteli a7, 4 # afficher une chaîneecallli a7, 10ecall
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.
