nasm, чтение syscall читает размер буфера - PullRequest
0 голосов
/ 13 октября 2011

У меня есть следующий код.Он работает нормально, за исключением одной вещи, которая ограничивает его использование в других программах.Когда я запускаю его в отладчике, системный вызов чтения Linux возвращает значение всегда больше указанного размера буфера.Почему это и как это исправить, потому что это не позволяет программе перебирать буферный массив без ошибки сегментации?

    SECTION .data
address dd "log.txt", 0
badf dd "Bad file!",0
buffsize dd 1024
size dd 1024
filedesc dd 0

section .bss    
buf     resb    1024


    SECTION .text       
        global main     
main:   
            mov   ebx, address
            mov   eax,  5           ; open(
            mov   ecx,  0           ;   read-only mode
            int   80h               ; );
            mov   [filedesc], eax
read_loop:

            mov     ebx,  [filedesc]       ;   file_descriptor, 
            mov     eax,  3         ; read(     
            mov     ecx,  buf       ;   *buf,
            mov     edx,  buffsize     ;   *bufsize
            int     80h             ; );
            test    eax,  eax
            jz      done
        js badfile              

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

            jmp     read_loop
badfile:
            mov     eax,  4         ; write(
            mov     ebx,  1         ;   STDOUT,
            mov     edx,  10
            mov     ecx,  badf       ;   *buf
            int     80h     

done:
    mov eax, 6
    mov ebx, [filedesc]
    int 0x80


    mov ebx,0       
    mov eax,1       
    int 0x80   

Ответы [ 2 ]

2 голосов
/ 13 октября 2011
        mov     edx,  buffsize     ;   *bufsize

Неверно, поскольку buffsize объявлено следующим образом:

        buffsize dd 1024

приведенный выше код переместит адрес из buffsize в edx.То, что вы хотите:

        mov edx, [buffsize]

, который переместит значение , хранящееся в buffsize, в edx.

У вас есть несколько таких ошибоктам.

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

Это может быть отрицательный код возврата ошибки?

Я не вижу ни одного теста в вашем коде для отрицательных значений.

...