Ho il codice seguente che apre un file, lo legge in un buffer e quindi chiude il file.Assembly x86: prima di effettuare una chiamata di sistema su Linux, dovresti salvare tutti i registri?
La chiamata del file system chiusa richiede che il numero del descrittore di file sia nel registro ebx. Il registro ebx ottiene il numero del descrittore del file prima che venga effettuata la chiamata di sistema di lettura. La mia domanda è: dovrei salvare il registro di ebx nello stack o da qualche parte prima di effettuare la chiamata di sistema di lettura, (potrebbe int 80h trash il registro di ebx?). E poi ripristinare il registro ebx per la chiamata di sistema chiusa? O è il codice che ho sotto bene e sicuro?
Ho eseguito il codice seguente e funziona, non sono sicuro che sia generalmente considerato un buon esercizio di assemblaggio o meno perché non salvare il registro ebx prima della chiamata di lettura int 80h.
;; 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
suggerimento: eseguire un test per il risultato della lettura come '<= 0' sul percorso veloce, quindi riordinarlo in' Errore'. Ciò riduce la quantità di voci della cronologia delle branch-branch normalmente necessarie per il codice. 'jle' funzionerà, perché' test eax, eax' cancella l'overflow e trasporta i flag, e imposta SF e ZF in base al risultato allo stesso modo 'cmp eax, 0'. –