Mam poniższy kod, który otwiera plik, odczytuje go w buforze, a następnie zamyka plik.x86 Montaż: Przed wykonaniem System Call w systemie Linux należy zapisać wszystkie rejestry?
Zamknięcie systemowe systemu plików wymaga, aby numer deskryptora pliku znajdował się w rejestrze ebx. Rejestr ebx otrzymuje numer deskryptora pliku przed wykonaniem odczytu systemowego. Moje pytanie brzmi: czy powinienem zapisać rejestr ebx na stosie lub gdzieś przed wykonaniem wywołania systemowego odczytu, (czy mógłbym 80h wyrzucić do śmieci rejestr ebx?). A następnie przywrócić rejestr ebx do bliskiego wywołania systemowego? Czy jest to kod, który mam poniżej w porządku i bezpiecznie?
Uruchomiłem poniższy kod i działa, po prostu nie jestem pewien, czy jest to ogólnie uważane za dobrą praktykę montażową, czy nie, ponieważ nie zapisuję rejestru ebx przed wywołaniem odczytu 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
sugestia: Wykonaj jeden test, aby wynik odczytu był "<= 0" na szybkiej ścieżce, a następnie posortuj go w "Błąd". Zmniejsza to ilość pozycji historii przewidywania rozgałęzień, które normalnie potrzebuje twój kod. 'jle' zadziała, ponieważ' test eax, eax' czyści flagi przepełnienia i przenoszenia i ustawia SF i ZF zgodnie z wynikiem w taki sam sposób jak 'cmp eax, 0'. –