Assembly 汇编x86(ia-32):如何使用struct stat

Assembly 汇编x86(ia-32):如何使用struct stat,assembly,system-calls,x86,Assembly,System Calls,X86,我正在尝试使用fstatsyscall,但您看到时我遇到了一个问题**代码中的**。实际上,在系统调用之后,$eax的值是一个负数(我上次运行此代码时是-75)。 这意味着我做错了什么,但我不明白是什么。有什么提示吗?? PS:我正在运行Gentoo x86 谢谢 编辑:代码更新 global _start section .text _start: mov eax,5 ;open mov ebx,filename ;path to file mov ecx,0000o

我正在尝试使用
fstat
syscall,但您看到
时我遇到了一个问题**代码中的**
。实际上,在系统调用之后,
$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,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系统调用,它确实有一些限制,并且已经过时。您可能会在syslog中看到以下消息:

vmunix:VFS:Warning:a.out正在使用旧的stat()调用。重新编译您的 二进制的

您应该使用syscall newfstat(0x6c)或fstat64(0xc5),或者更好地避免在asm中使用文件、i/o和syscall(如果可能)


还要注意的是,您忘记了零终止字符串。如果它恰好以零结尾,那只是因为它后面意外地跟了一个0。

-75是-EOVERFLOW:可能文件很大?文件有1812个字节,所以不是溢出…:(我也试过使用一个大小为2字节但没有更改的文件,总是
-75
。如果我使用
x/40cb&structvar
,它只填充
0
;-/非常感谢!现在retcode是
0
,变量
structvar
填充了一些值(但它们不正确,我不知道为什么xD)通过
strace-v
运行您的程序。我很确定返回的值是正确的,您只是使用了错误的结构布局。是的,
open
syscall是正确的,
fstat
使用了正确的
fd
但是值都很奇怪,比如
st_size=250495198606543074
(大小应该是
1812
..)你是说我使用了错误的结构布局,但你的确切意思是什么?PS我更新了答案中的代码
strace-v
fstat(3,{st_dev=makedev(10485843775922179),st_ino=98724,st_mode=S_iffo,st_nlink=7782480740352,st_uid=8,st_gid=1390561506,st_blksize=0,st_blocks=0,st_size=250495198606543074,st_atime=0,st_mtime=0,st_ctime=0}=0
我编写了一个c程序来检查上述(并更正)值,它们是:
,st_ino=1052177,st_mode=S_IFREG | 0644,st_nlink=1,st_uid=0,st_gid=0,st_blksize=4096,st_blocks=8,st_size=1812,st_atime=2014/01/24-12:05:06,st_mtime=2014/01/24-12:05:06,st_ctime=2014/01/24-12:05:06,st_ctime=0
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