Сборка x86 (ia-32): как использовать struct stat
global _start
section .text
_start:
mov eax,5 ;open
mov ebx,filename ;path to file
mov ecx,0000o ;O_RDONLY
int 0x80
mov ebx,eax ;fd
mov eax,0x1c; fstat
mov ecx,structvar ;address of struct
int 0x80
;**HERE**
mov eax,0x1 ;exit
mov ebx,0x5 ;ret code
int 0x80
section .data
filename: db "/home/USER/file.txt"
section .bss
structvar: resb 88 ;struct stat is 88 bytes in x86
я пытаюсь использовать fstat
системный вызов, но у меня есть проблема, где вы видите ;**HERE**
в коде. На самом деле значение $eax
после того, как системный вызов является отрицательным числом (последний раз, когда я запускал этот код, был -75).
Это значит, что я делаю что-то не так, но не могу понять, что. Любой намек??
PS: я использую Gentoo x86
Спасибо
РЕДАКТИРОВАТЬ: обновление кода
global _start
section .text
_start:
mov eax,5 ;open
mov ebx,filename ;path to file
mov ecx,0000o ;O_RDONLY
int 0x80
mov ebx,eax ;fd
mov eax,0x6c ;newfstat
mov ecx,structvar ;address struct
int 0x80
mov eax,0x1 ;exit
mov ebx,0x5 ;ret code
int 0x80
section .data
filename: db "/home/USER/file.txt",0x0
section .bss
structvar: resb 88 ;struct stat in x86 is 88 bytes
1 ответ
Вы используете старый системный вызов fstat, который действительно имеет некоторые ограничения и устарел. Вы, вероятно, можете увидеть сообщение в системном журнале:
vmunix: VFS: Предупреждение: a.out, используя старый вызов stat(). Перекомпилируйте ваш бинарный файл.
Вы должны использовать syscall newfstat (0x6c) или fstat64 (0xc5), или, что еще лучше, избегать файлов, ввода-вывода и системных вызовов в asm, если это возможно.
Также обратите внимание, что вы забыли обнулить строку. Если он завершается нулем, то только потому, что за ним случайно следует 0.