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