Assembly 使用stat syscall获取文件大小
我正在尝试使用stat syscall with assembly(nasm)获取文件大小: 在执行syscall之后,Assembly 使用stat syscall获取文件大小,assembly,nasm,x86-64,system-calls,stat,Assembly,Nasm,X86 64,System Calls,Stat,我正在尝试使用stat syscall with assembly(nasm)获取文件大小: 在执行syscall之后,rax中有0,这很好,但是在mov eax之后,dword[stat+stat.st_size]也有0的变化 mov eax, dword [stat + STAT.st_size] 到 在我的参考资料中(虽然是32位),STAT结构的描述有点不同。至少,您的结构的大小不同于64 struct STAT .st_dev dw ? ; ID of devi
rax中有0,这很好,但是在mov eax之后,dword[stat+stat.st_size]
也有0的变化
mov eax, dword [stat + STAT.st_size]
到
在我的参考资料中(虽然是32位),STAT结构的描述有点不同。至少,您的结构的大小不同于64
struct STAT
.st_dev dw ? ; ID of device containing file
.pad1 dw ?
.st_ino dd ? ; inode number
.st_mode dw ? ; protection
.st_nlink dw ? ; number of hard links
.st_uid dw ? ; user ID of owner
.st_gid dw ? ; group ID of owner
.st_rdev dw ? ; device ID (if special file)
.pad2 dw ?
.st_size dd ? ; total size, in bytes
.st_blksize dd ? ; block size
.st_blocks dd ?
.st_atime dd ? ; time of last access
.unused1 dd ?
.st_mtime dd ? ; time of last modification
.unused2 dd ?
.st_ctime dd ? ; time of last status change
.unused3 dd ?
.unused4 dd ?
.unused5 dd ?
ends
尽管如此,这些差异并不能解释为什么您的程序不起作用。“/home/usr/file”的实际大小是多少。不是0吗?您似乎是为64位Linux编程的。从sys/stat.h
获得正确的结构有点困难。我最后为它创建了一个C程序:
#include <stdio.h>
#include <sys/stat.h>
int main ( void )
{
struct stat file_stat;
printf ("__WORDSIZE: %d\n",__WORDSIZE);
printf ("__USE_MISC: %d\n",__USE_MISC);
printf ("__USE_XOPEN2K8: %d\n",__USE_XOPEN2K8);
printf ("file_stat len: %ld\n", sizeof file_stat);
long p = (long)(&file_stat);
printf ("file_stat.st_dev pos: %3ld len: %2ld\n", (long)(&file_stat.st_dev) - p, sizeof file_stat.st_dev);
printf ("file_stat.st_ino pos: %3ld len: %2ld\n", (long)(&file_stat.st_ino) - p, sizeof file_stat.st_ino);
printf ("file_stat.st_nlink pos: %3ld len: %2ld\n", (long)(&file_stat.st_nlink) - p, sizeof file_stat.st_nlink);
printf ("file_stat.st_mode pos: %3ld len: %2ld\n", (long)(&file_stat.st_mode) - p, sizeof file_stat.st_mode);
printf ("file_stat.st_uid pos: %3ld len: %2ld\n", (long)(&file_stat.st_uid) - p, sizeof file_stat.st_uid);
printf ("file_stat.st_gid pos: %3ld len: %2ld\n", (long)(&file_stat.st_gid) - p, sizeof file_stat.st_gid);
printf ("file_stat.__pad0 pos: %3ld len: %2ld\n", (long)(&file_stat.__pad0) - p, sizeof file_stat.__pad0);
printf ("file_stat.st_rdev pos: %3ld len: %2ld\n", (long)(&file_stat.st_rdev) - p, sizeof file_stat.st_rdev);
printf ("file_stat.st_size pos: %3ld len: %2ld\n", (long)(&file_stat.st_size) - p, sizeof file_stat.st_size);
printf ("file_stat.st_blksize pos: %3ld len: %2ld\n", (long)(&file_stat.st_blksize) - p, sizeof file_stat.st_blksize);
printf ("file_stat.st_blocks pos: %3ld len: %2ld\n", (long)(&file_stat.st_blocks) - p, sizeof file_stat.st_blocks);
printf ("file_stat.st_atim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_atim.tv_sec) - p, sizeof file_stat.st_atim.tv_sec);
printf ("file_stat.st_atim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_atim.tv_nsec) - p, sizeof file_stat.st_atim.tv_nsec);
printf ("file_stat.st_mtim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_mtim.tv_sec) - p, sizeof file_stat.st_mtim.tv_sec);
printf ("file_stat.st_mtim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_mtim.tv_nsec) - p, sizeof file_stat.st_mtim.tv_nsec);
printf ("file_stat.st_ctim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_ctim.tv_sec) - p, sizeof file_stat.st_ctim.tv_sec);
printf ("file_stat.st_ctim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_ctim.tv_nsec) - p, sizeof file_stat.st_ctim.tv_nsec);
printf ("file_stat.__unused pos: %3ld len: %2ld\n", (long)(&file_stat.__unused) - p, sizeof file_stat.__unused);
return 0;
}
这将导致以下NASM结构:
section .bss
stat resb 144
struc STAT
.st_dev resq 1
.st_ino resq 1
.st_nlink resq 1
.st_mode resd 1
.st_uid resd 1
.st_gid resd 1
.pad0 resb 4
.st_rdev resq 1
.st_size resq 1
.st_blksize resq 1
.st_blocks resq 1
.st_atime resq 1
.st_atime_nsec resq 1
.st_mtime resq 1
.st_mtime_nsec resq 1
.st_ctime resq 1
.st_ctime_nsec resq 1
endstruc
我用GCC作为链接器测试了它,它成功了。也许文件大小为零?我敢打赌一位先生会崩溃<代码>[stat+stat.st_size]
应该正确。文件名应该以零结尾,但如果sys_stat返回零,这可能不是问题所在。不知道代码在我看来没问题。。。
#include <stdio.h>
#include <sys/stat.h>
int main ( void )
{
struct stat file_stat;
printf ("__WORDSIZE: %d\n",__WORDSIZE);
printf ("__USE_MISC: %d\n",__USE_MISC);
printf ("__USE_XOPEN2K8: %d\n",__USE_XOPEN2K8);
printf ("file_stat len: %ld\n", sizeof file_stat);
long p = (long)(&file_stat);
printf ("file_stat.st_dev pos: %3ld len: %2ld\n", (long)(&file_stat.st_dev) - p, sizeof file_stat.st_dev);
printf ("file_stat.st_ino pos: %3ld len: %2ld\n", (long)(&file_stat.st_ino) - p, sizeof file_stat.st_ino);
printf ("file_stat.st_nlink pos: %3ld len: %2ld\n", (long)(&file_stat.st_nlink) - p, sizeof file_stat.st_nlink);
printf ("file_stat.st_mode pos: %3ld len: %2ld\n", (long)(&file_stat.st_mode) - p, sizeof file_stat.st_mode);
printf ("file_stat.st_uid pos: %3ld len: %2ld\n", (long)(&file_stat.st_uid) - p, sizeof file_stat.st_uid);
printf ("file_stat.st_gid pos: %3ld len: %2ld\n", (long)(&file_stat.st_gid) - p, sizeof file_stat.st_gid);
printf ("file_stat.__pad0 pos: %3ld len: %2ld\n", (long)(&file_stat.__pad0) - p, sizeof file_stat.__pad0);
printf ("file_stat.st_rdev pos: %3ld len: %2ld\n", (long)(&file_stat.st_rdev) - p, sizeof file_stat.st_rdev);
printf ("file_stat.st_size pos: %3ld len: %2ld\n", (long)(&file_stat.st_size) - p, sizeof file_stat.st_size);
printf ("file_stat.st_blksize pos: %3ld len: %2ld\n", (long)(&file_stat.st_blksize) - p, sizeof file_stat.st_blksize);
printf ("file_stat.st_blocks pos: %3ld len: %2ld\n", (long)(&file_stat.st_blocks) - p, sizeof file_stat.st_blocks);
printf ("file_stat.st_atim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_atim.tv_sec) - p, sizeof file_stat.st_atim.tv_sec);
printf ("file_stat.st_atim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_atim.tv_nsec) - p, sizeof file_stat.st_atim.tv_nsec);
printf ("file_stat.st_mtim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_mtim.tv_sec) - p, sizeof file_stat.st_mtim.tv_sec);
printf ("file_stat.st_mtim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_mtim.tv_nsec) - p, sizeof file_stat.st_mtim.tv_nsec);
printf ("file_stat.st_ctim.tv_sec pos: %3ld len: %2ld\n", (long)(&file_stat.st_ctim.tv_sec) - p, sizeof file_stat.st_ctim.tv_sec);
printf ("file_stat.st_ctim.tv_nsec pos: %3ld len: %2ld\n", (long)(&file_stat.st_ctim.tv_nsec) - p, sizeof file_stat.st_ctim.tv_nsec);
printf ("file_stat.__unused pos: %3ld len: %2ld\n", (long)(&file_stat.__unused) - p, sizeof file_stat.__unused);
return 0;
}
argv[0]: ./example_stat
__WORDSIZE: 64
__USE_MISC: 1
__USE_XOPEN2K8: 1
file_stat len: 144
file_stat.st_dev pos: 0 len: 8
file_stat.st_ino pos: 8 len: 8
file_stat.st_nlink pos: 16 len: 8
file_stat.st_mode pos: 24 len: 4
file_stat.st_uid pos: 28 len: 4
file_stat.st_gid pos: 32 len: 4
file_stat.__pad0 pos: 36 len: 4
file_stat.st_rdev pos: 40 len: 8
file_stat.st_size pos: 48 len: 8
file_stat.st_blksize pos: 56 len: 8
file_stat.st_blocks pos: 64 len: 8
file_stat.st_atim.tv_sec pos: 72 len: 8
file_stat.st_atim.tv_nsec pos: 80 len: 8
file_stat.st_mtim.tv_sec pos: 88 len: 8
file_stat.st_mtim.tv_nsec pos: 96 len: 8
file_stat.st_ctim.tv_sec pos: 104 len: 8
file_stat.st_ctim.tv_nsec pos: 112 len: 8
file_stat.__unused pos: 120 len: 24
section .bss
stat resb 144
struc STAT
.st_dev resq 1
.st_ino resq 1
.st_nlink resq 1
.st_mode resd 1
.st_uid resd 1
.st_gid resd 1
.pad0 resb 4
.st_rdev resq 1
.st_size resq 1
.st_blksize resq 1
.st_blocks resq 1
.st_atime resq 1
.st_atime_nsec resq 1
.st_mtime resq 1
.st_mtime_nsec resq 1
.st_ctime resq 1
.st_ctime_nsec resq 1
endstruc