首页 文章

具有跳转和系统调用读取功能的汇编代码(x86)

提问于
浏览
0

我想请求任何人帮助理解汇编代码 . 我的问题是:标签L2之后的代码很重要,它调用子程序功能 . 但在我看来,程序永远不会到达标签L2之后的代码,因为根据我的说法,syscall读取(在L1之后)总是读取0并且在将它比较为1.但零从不等于1,所以在我看来程序永远不会跳到L2 . 我想我一定是错的 . 我真的很感激任何帮助

jmp L1
L2:
movzbl -0x11(%ebp), %eax
movsbl %al, %eax
mov %eax, (%esp)
call SUBROUTINE_FNC
<...>

L1:
mov $0x0, %ebx
lea -0x11(%ebp), %ecx
mov $0x1, %edx
mov $0x3, %eax
int $0x80
mov %eax, -0x10(%ebp)
cmpl $0x1, -0x10(%ebp)
je L2

1 回答

  • 1

    系统调用对应于read,看起来您尝试一次读取一个字节 . read 应返回读取的实际字节数,因此如果调用成功,则返回值为1,比较结果为真,您将跳转到L2,即

    L2:
    SUBROUTINE_FNC(...);
    
    if (read(fd, buff, 1) == 1) // read one byte
        goto L2;                // if one byte read then loop to L2
    

    或者,以更有条理的形式:

    while (read(fd, buff, 1) == 1)
    {
        SUBROUTINE_FNC(...)
    }
    

相关问题