以x86汇编语言获取文件大小的简单方法



>假设我已经在程序集中打开了一个文件,并且在寄存器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

相关内容

  • 没有找到相关文章

最新更新