nasm,read 系统调用读取超过缓冲区大小

发布于 2024-12-09 19:09:55 字数 1474 浏览 0 评论 0原文

我有以下代码。它工作正常,除了一件事限制了它在其他程序中的使用。当我在调试器中运行它时,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   

I have the following code. It works ok except one thing which limits its usage in other programs. When I run it in the debugger, Linux read system call returns value always bigger than the specified buffer size. Why is it and how to fix it, because it doesn't let the program to loop through the buffer array without a segmentation fault?

    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   

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

給妳壹絲溫柔 2024-12-16 19:09:55
        mov     edx,  buffsize     ;   *bufsize

这是错误的,因为 buffsize 声明如下:

        buffsize dd 1024

上面的代码会将 buffsize地址移动到 edx。您想要的是:

        mov edx, [buffsize]

它将存储在 buffsize 中的移动到edx

您那里有一些此类错误。

        mov     edx,  buffsize     ;   *bufsize

Is wrong since buffsize is declared as follows:

        buffsize dd 1024

the above code will move the address of buffsize to edx. What you want is:

        mov edx, [buffsize]

which will move the value stored at buffsize to edx.

You have a few of those type of errors in there.

于我来说 2024-12-16 19:09:55

可能是负错误返回码吗?

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

Could it be a negative error return code?

I don't see any test in your code for negative values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文