ecall

ecall

RISC-V Assembler Referenz

lyszt.net behandelt ecall und andere RISC-V-Befehle ausführlicher.

Beschreibung

ecall bittet die Umgebung, in der dein Programm läuft, einen Dienst auszuführen. Assembly kann Zahlen addieren und verschieben, aber der Bildschirm, die Tastatur und andere Geräte gehören zum System, das das Programm beherbergt, daher kann der Code sie nicht aus eigener Kraft erreichen. ecall steht für environment call. Es hält deinen Code an, der Host führt den Dienst aus, und die Kontrolle kehrt zu deinem Code zurück. Der Host ist ein Betriebssystem auf echter Hardware, und in diesem Simulator ist es der Simulator selbst.

Das Programm benennt den Dienst, den es möchte. Konventionell kommt die Dienstnummer in a7, alle Daten, die der Dienst benötigt, kommen in a0, und dann läuft ecall. Dieser Simulator bietet diese Dienste an: 1 gibt die Ganzzahl in a0 aus, 4 gibt den Text an der Adresse in a0 aus, 5 liest eine Zahl aus der Eingabe nach a0, 10 beendet das Programm, und 32 pausiert für a0 Millisekunden.

Um eine Zahl auszugeben, lade 1 in a7, um den Ausgabedienst auszuwählen, lade die Zahl in a0, und führe ecall aus. Das Beispiel macht dies. Dienst 10 beendet ein Programm, weshalb die Lektionen mit den beiden Zeilen unten enden. Ohne ihn läuft der Prozessor über die letzte Zeile hinaus in das, was als Nächstes kommt.

li a7, 10
ecall

Das RISC-V-Handbuch stellt fest, dass ecall eine Dienstanforderung an die Ausführungsumgebung stellt, und dass die Umgebung entscheidet, wie Parameter übergeben werden, üblicherweise in definierten Ganzzahlregistern. Dieser Simulator ist hier die Umgebung und er definiert die oben aufgeführten Dienstnummern. Das Handbuch merkt auch an, dass ecall einst scall hieß. Sein Begleiter ebreak gibt die Kontrolle an einen Debugger zurück. Beide lösen einen präzisen, angeforderten Trap an die Umgebung aus.

Ein vollständiges Betriebssystem funktioniert genauso, mit einer längeren Liste von Diensten.

Beispiel

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42