Сборка 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.

Другие вопросы по тегам