nasm,read syscall读取缓冲区大小

时间:2011-10-13 13:01:37

标签: linux assembly 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   

2 个答案:

答案 0 :(得分:2)

        mov     edx,  buffsize     ;   *bufsize

错误,因为buffsize声明如下:

        buffsize dd 1024

上述代码会将buffsize地址移至edx。你想要的是:

        mov edx, [buffsize]

会将buffsize中存储的移至edx

那里有一些类型的错误。

答案 1 :(得分:1)

可能是否定错误返回代码?

我的代码中没有看到负值的任何测试。