J'ai le code ci-dessous qui ouvre un fichier, le lit dans un tampon, puis ferme le fichier.x86 Assemblage: Avant de lancer un appel système sur Linux, devez-vous enregistrer tous les registres?
L'appel de fermeture de système de fichiers nécessite que le numéro de descripteur de fichier soit dans le registre ebx. Le registre ebx obtient le numéro de descripteur de fichier avant que l'appel système en lecture ne soit effectué. Ma question est que je devrais enregistrer le registre ebx sur la pile ou quelque part avant que je fasse l'appel système de lecture, (pourrait int 80h trash le registre ebx?). Et puis restaurer le registre ebx pour l'appel système proche? Ou le code que j'ai ci-dessous est-il bon et sûr?
J'ai exécuté le code ci-dessous et cela fonctionne, je ne suis pas sûr si cela est généralement considéré comme une bonne pratique d'assemblage ou non parce que je n'enregistre pas le registre ebx avant l'appel 80h int.
;; 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
suggestion: Faire un test pour le résultat de la lecture étant '<= 0' sur le chemin rapide, puis le trier dans' Erreur'. Cela réduit la quantité d'entrées d'historique de prédiction de branchement dont votre code a normalement besoin. 'jle' fonctionnera, car' test eax, eax' efface le débordement et porte les drapeaux, et place SF et ZF selon le résultat de la même manière que 'cmp eax, 0'. –