блок x86: Прежде, чем Сделать Системный вызов на Linux необходимо ли Сохранить Все Регистры?

Я имею ниже кода, который открывает файл, читает его в буфер и затем закрывает файл.

Близкий вызов файловой системы требует, чтобы число дескриптора файла было в регистре ebx. Регистр ebx получает число дескриптора файла, прежде чем системный вызов чтения будет сделан. Мой вопрос, я должен сохранить регистр ebx на стеке или где-нибудь прежде чем я сделаю системный вызов чтения, (мог международный 80-й мусор регистр ebx?). И затем восстановите регистр ebx для близкого системного вызова? Или код, я имею ниже прекрасного и безопасного?

Я работал ниже кода, и он работает, я просто не уверен, считают ли это обычно хорошей практикой блока или не потому что я не сохраняю регистр ebx перед международным 80-м вызовом чтения.

;; 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         
11
задан Matthew Slattery 25 April 2010 в 16:53
поделиться

2 ответа

Сам вызов int 80h ничего не повредит, кроме помещения возвращаемого значения в eax . Итак, фрагмент кода, который у вас есть, в порядке. (Но если ваш фрагмент кода является частью более крупной процедуры, которая, как ожидается, будет вызываться другим кодом, следующим за обычным Linux x86 ABI, вам нужно будет сохранить ebx и, возможно, другие регистры, при входе в ваш

Соответствующий код ядра можно найти в arch / x86 / kernel / entry_32.S . Это немного сложно понять из-за широкого использования макросов и различных деталей (поддержка трассировки системных вызовов, аннотации отладки DWARF и т. Д.), Но: обработчик int 80h - это system_call (строка 493 в версии, на которую я ссылался); регистры сохраняются с помощью макроса SAVE_ALL (строка 497); и они восстанавливаются снова через RESTORE_REGS (строка 534) непосредственно перед возвратом.

11
ответ дан 3 December 2019 в 09:19
поделиться

Да, вы должны сохранить и восстановить, как в http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/ 040/4048 / 4048l1.html

1
ответ дан 3 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: