x86 Assembly: Bevor Sie einen Systemaufruf unter Linux ausführen, sollten Sie alle Register speichern?

Ich habe den folgenden Code, der eine Datei öffnet, sie in einen Puffer liest und die Datei dann schließt.

Der Aufruf zum Schließen des Dateisystems erfordert, dass sich die Dateideskriptornummer im ebx-Register befindet. Das ebx-Register erhält die Dateideskriptornummer, bevor der Lesesystemaufruf ausgeführt wird. Meine Frage ist, ob ich das ebx-Register auf dem Stack oder irgendwo speichern soll, bevor ich den Systemaufruf "read" durchführe (könnte int 80h das ebx-Register in den Papierkorb werfen?). Und dann das ebx-Register zum Schließen des Systemaufrufs wiederherstellen? Oder ist der Code, den ich unten habe, gut und sicher?

Ich habe den folgenden Code ausgeführt und er funktioniert. Ich bin mir nur nicht sicher, ob er allgemein als gute Montagepraxis angesehen wird oder nicht, da ich das ebx-Register nicht vor dem int 80h-Leseaufruf speichere.

;; open up the input file 
mov eax,5        ; open file system call number
mov ebx,[esp+8]  ; null terminated string file name, first command line parameter
mov ecx,0o       ; access type: O_RDONLY
int 80h          ; file handle or negative error number put in eax
test eax,eax
js Error         ; test sign flag (SF) for negative number which signals error

;; read in the full input file
mov ebx,eax            ; assign input file descripter
mov eax,3              ; read system call number
mov ecx,InputBuff      ; buffer to read into
mov edx,INPUT_BUFF_LEN ; total bytes to read
int 80h
test eax,eax
js Error               ; if eax is negative then error
jz Error               ; if no bytes were read then error
add eax,InputBuff      ; add size of input to the begining of InputBuff location
mov [InputEnd],eax     ; assign address of end of input

;; close the input file
;; file descripter is already in ebx
mov eax,6       ; close file system call number
int 80h         

Antworten auf die Frage(4)

Ihre Antwort auf die Frage