ecall
lyszt.net couvre ecall et d'autres instructions RISC-V plus en détail.
Description
ecall demande à l'environnement dans lequel votre programme s'exécute d'effectuer un service. L'assembleur peut additionner et déplacer des nombres, mais l'écran, le clavier et les autres périphériques appartiennent au système qui héberge le programme, le code ne peut donc pas les atteindre par lui-même. ecall signifie appel à l'environnement. Il arrête votre code, l'hôte exécute le service, et le contrôle revient à votre code. L'hôte est un système d'exploitation sur du matériel réel, et dans ce simulateur c'est le simulateur lui-même.
Le programme nomme le service qu'il souhaite. Par convention, le numéro de service va dans a7, les données dont le service a besoin vont dans a0, puis ecall s'exécute. Ce simulateur propose ces services : 1 affiche l'entier dans a0, 4 affiche le texte à l'adresse dans a0, 5 lit un nombre depuis l'entrée dans a0, 10 termine le programme, et 32 met en pause pendant a0 millisecondes.
Pour afficher un nombre, chargez 1 dans a7 pour sélectionner le service d'affichage, chargez le nombre dans a0, et exécutez ecall. L'exemple fait cela. Le service 10 termine un programme, c'est pourquoi les leçons se terminent par les deux lignes ci-dessous. Sans lui, le processeur continue au-delà de la dernière ligne vers ce qui suit.
li a7, 10 ecall
Le manuel RISC-V indique que ecall effectue une demande de service à l'environnement d'exécution, et que l'environnement décide comment les paramètres sont transmis, généralement dans des registres entiers définis. Ce simulateur est l'environnement ici et il définit les numéros de service listés ci-dessus. Le manuel note également que ecall s'appelait autrefois scall. Son compagnon ebreak rend le contrôle à un débogueur. Tous deux déclenchent un piège précis demandé à l'environnement.
Un système d'exploitation complet fonctionne de la même manière, avec une liste de services plus longue.
Exemple
li a7, 1 # service 1 = print integer li a0, 42 ecall # prints 42
