буфер чтения файла пуст в nasm - PullRequest
0 голосов
/ 08 октября 2011

Мне удалось создать учебный код NASM для работы с файлами. Он выводит содержимое файла в стандартный вывод, но когда я пытаюсь получить доступ к буферу данных, он содержит только нули. Например, в приведенном ниже коде в среднем цикле 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 Ответ

1 голос
/ 08 октября 2011

Например, в приведенном ниже коде в среднем цикле EBX всегда установлен в 0, когда он должен содержать байты файла.

Как вы это определяете?(Возможно, работает под отладчиком?)

В вашем коде есть неудачная ошибка:

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

Вы перезаписываете EAX (который содержит дескриптор файла, возвращаемый системным вызовом open,если open удалось) со значением 3, прежде чем он будет перемещен в EBX в качестве аргумента дескриптора файла на read.

Обычно процесс начинается с присвоенных дескрипторов файлов 0, 1 и 2на stdin, stdout и stderr, и первый дескриптор файла, который вы явно open, будете равен 3, так что вам это сойдет с рук!

Но вам может не повезти, если вы работаете с отладчиком.Файловый дескриптор 3 может быть чем-то другим, и read может завершиться ошибкой (вы не проверяете, является ли возвращаемое значение отрицательным кодом ошибки), или прочитать что-то совершенно неожиданное ...

...