Ich habe den folgenden Code, der eine Datei öffnet, liest es in einen Puffer und schließt dann die Datei.x86 Assembly: Bevor Sie einen Systemaufruf unter Linux durchführen, sollten Sie alle Register speichern?
Der Close-Dateisystemaufruf erfordert, dass die Dateibeschreibung im ebx-Register steht. Das ebx-Register erhält die Datei-Deskriptor-Nummer vor dem Lesen des Systemaufrufs. Meine Frage ist, sollte ich das ebx-Register auf dem Stapel oder irgendwo speichern, bevor ich den Systemaufruf lese, (könnte 80h das ebx-Register löschen?). Und dann das ebx-Register für das Schließen des Systemaufrufs wiederherstellen? Oder ist der Code, den ich unten habe, gut und sicher?
Ich habe den untenstehenden Code ausgeführt und es funktioniert, ich bin nur nicht sicher, ob es allgemein als gute Montagepraxis gilt oder nicht, weil ich das ebx-Register nicht vor dem Int 80h Leseanruf 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
Vorschlag: Testen Sie, ob das Ergebnis des Lesens '<= 0 'auf dem schnellen Pfad ist, und sortieren Sie es dann in' Error' aus. Dies reduziert die Anzahl der Verzweigungsvorhersageeinträge, die Ihr Code normalerweise benötigt. 'jle' wird funktionieren, weil' test eax, eax' die Überlauf- und Carry-Flags löscht und SF und ZF entsprechend dem Ergebnis auf die gleiche Weise setzt wie 'cmp eax, 0'. –