>假设我已经在程序集中打开了一个文件,并且在寄存器eax中具有该文件的文件句柄。我将如何获取文件的大小,以便为其分配足够的缓冲区空间?
我在这里研究了另一个讨论,该讨论建议使用 sys_fstat(28)
系统调用来获取文件统计信息,但无法实现它......
#My attempt at getting the file size
_test: movl filehandle, %ebx #move filehandle (file descriptor) into ebx
movl $28, %eax #fstat syscall
int $0x80 # always end up with -14 in here not sure why
我的解决方案 -- 只需使用 .lcomm 为所有命名变量创建位置
movl inputfile, %ebx #Move file handler into ebx for system call
movl $0x6c, %eax #Stat Sys Call into eax
leal statlocation, %ecx #Move reserved location for stat structure into
int $0x80 #Execute System Call
movl 20(%ecx), %eax #20 to location of size variable, size is now in eax
以下是在 FreshLib 中的实现方式。它是一个包装器,以提供可移植性。当然,您可以简化它(见下文)。
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
sys_newfstat = $6c
proc FileSize, .handle
.stat STAT
begin
push edx ecx ebx
mov eax, sys_newfstat
mov ebx, [.handle]
lea ecx, [.stat]
int $80
cmp eax, -1
jle .error
mov eax, [.stat.st_size]
clc
pop ebx ecx edx
return
.error:
neg eax ; error code
stc
pop ebx ecx edx
return
endp
最小版本可以看起来像这样(可读性差得多,而且不是线程安全的):
; argument: file handle in ebx
; returns: the size in EDX; error code in EAX
FileSize:
mov eax, $6c
mov ecx, file_stat
int $80
mov edx, [file_stat+$14]
retn
file_stat rd $10