Der syscall wird verwendet, um einen Dienst vom Kernel anzufordern. Für MIPS muss die Servicenummer / der Code in $ v0 übergeben werden und Argumente werden in einigen der anderen designierten Registern übergeben. Zum Beispiel könnten wir Folgendes tun:
%Vor%In diesem Fall ist 1 der Servicecode für print integer. Der zweite Befehl führt effektiv eine Kopie von $ t0 nach $ a0 durch, das das bezeichnete Register ist, in dem das Argument gehalten wird (in diesem Fall die zu druckende ganze Zahl). Eine Liste der Dienste und der entsprechenden Argumente ist angegeben: Ссылка
Es wird viel offensichtlicher, wenn Sie den Kontext eines Emulators wie MARS oder SPIM verlassen, wo die Systemaufrufe etwas künstlich sind. Auf einem echten MIPS-Rechner würden Sie es verwenden, um den Kernel zu steuern, um eine bestimmte Funktion aufzurufen.
Zum Beispiel ist dies ein einfaches Hallo-Welt-Programm in MIPS 32-Bit-Assembly für einen Linux-Rechner (ich bin 95% sicher, dass dies bei einer Installation von mipsel war, nicht dass es für diese Frage viel bedeutet)
%Vor%Dies entspricht sehr dem C-Code (wenn Sie Probleme haben, der MIPS-Assembly zu folgen).
%Vor%Beachten Sie zuerst, dass Header enthalten sind, um den Registern symbolische Namen (asm / regdef.h) und einen Header zu geben, der symbolische Namen für die Systemaufrufe (sys / syscall.h) abruft, so dass wir nicht darauf verweisen müssen zu den syscalls durch nummerieren. Die Konventionen, um hier einen Systemaufruf zu machen, sind ungefähr dieselben wie das Aufrufen einer Funktion, ein # Register mit Argumenten laden, dann laden wir den Systemaufruf, den wir haben wollen, in $ v0 und rufen syscall auf. SYS_write entspricht der grundlegenden Write (2) -Funktion für Linux / Unix (1 ist Standard out).
%Vor%Also sagen wir dem Kernel, dass er in die Datei handle 1 (stdout) schreibt, die Zeichenfolge hallo, die length bytes verwendet. Unter Linux können Sie syscalls (2) für alle verfügbaren Syscalls sehen, aber sie entsprechen ziemlich genau den Kernfunktionen, die der Kernel bietet und die (g) libc für C / C ++ - Programme entweder umschließt oder aufbaut.
Linux (und die meisten Unix-Likes, die die 4BSD-Route zurückgehen) haben eine Funktion syscall (2), die im Grunde dasselbe ist.
Sobald Sie anfangen, komplexere Sachen zu machen, werden Sie entweder finden, dass Sie das syscall-Aufrufen in nützliche Funktionen verpacken, oder besser nur die entsprechenden libc-Versionen aufrufen (überraschend einfach zu tun, aber eine andere Diskussion).