nasm, чтение системного вызова считывает размер буфера

#linux #assembly #x86 #nasm

#linux #сборка #x86 #nasm

Вопрос:

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

     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   
  

Ответ №1:

         mov     edx,  buffsize     ;   *bufsize
  

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

         buffsize dd 1024
  

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

         mov edx, [buffsize]
  

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

У вас есть несколько ошибок такого типа.

Комментарии:

1. О, точно. Это сложно, потому что я наткнулся на неправильные примеры в Интернете, в которых вместо значения использовался указатель. Это сработало для них, потому что это было одноразовое чтение, и запись не слишком заботится о предоставленном размере записи.

Ответ №2:

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

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

Комментарии:

1. Это, конечно, не тот случай. Потому что 1) он работает нормально 2) отладчик показывает положительные значения. В любом случае я добавил проверку на отрицательное возвращаемое значение. И я запускаю его без каких-либо ошибок, но упомянутая проблема сохраняется.