nasm中的文件读取缓冲区为空

时间:2011-10-07 20:57:41

标签: linux assembly x86 nasm

我设法构建了一个用于处理文件的NASM教程代码。它将文件的内容输出到stdout就好了,但是当我尝试访问数据缓冲区时,它只包含零。例如,在下面的中间循环代码中,EBX总是设置为0,它应该包含文件字节。

section .data
   bufsize dw      1024

section .bss
   buf     resb    1024


section  .text              ; declaring our .text segment
  global  _start            ; telling where program execution should start

_start:                     ; this is where code starts getting exec'ed

  ; get the filename in ebx
    pop   ebx               ; argc
    pop   ebx               ; argv[0]
    pop   ebx               ; the first real arg, a filename

  ; open the file
    mov   eax,  5           ; open(
    mov   ecx,  0           ;   read-only mode
    int   80h               ; );

  ; read the file
    mov     eax,  3         ; read(
    mov     ebx,  eax       ;   file_descriptor,
    mov     ecx,  buf       ;   *buf,
    mov     edx,  bufsize   ;   *bufsize
    int     80h             ; );

    mov ecx, 20
loop:
    mov eax, 20
    sub eax, ecx
    mov ebx, [buf+eax*4]
    loop loop       

  ; write to STDOUT
    mov     eax,  4         ; write(
    mov     ebx,  1         ;   STDOUT,
    mov     ecx,  buf       ;   *buf
    int     80h             ; );

  ; exit
    mov   eax,  1           ; exit(
    mov   ebx,  0           ;   0
    int   80h               ; );

1 个答案:

答案 0 :(得分:1)

  

例如,在中间循环的下面的代码中,EBX总是设置为0,它应该包含文件字节。

你是如何确定的? (也许在调试器下运行?)

你的代码有一个不幸的错误:

 ; read the file
    mov     eax,  3         ; read(
    mov     ebx,  eax       ;   file_descriptor,

你将EAX(包含open系统调用返回的文件描述符,如果open成功)覆盖值为3,在它作为文件描述符参数移到EBX之前覆盖read

通常,进程将以分配给stdinstdoutstderr的文件描述符0,1和2以及您明确{{1}的第一个文件描述符开始。将是3,所以你会逃脱它!

但如果您使用调试器运行,那么您可能不会那么幸运。文件描述符3可能是其他内容,open可能会失败(您不检查返回的值是否为错误的错误代码),或者读取完全意外的内容...