【问题标题】:The assembly code (x86) with jumps and a syscall read function带有跳转和系统调用读取功能的汇编代码 (x86)
【发布时间】:2013-05-13 06:38:29
【问题描述】:

我想请任何人帮助我理解汇编代码。我的问题是: 标签L2后面的代码很重要,它调用子程序函数。但在我看来,程序永远不会到达标签 L2 之后的代码,因为根据我的说法,系统调用读取(在 L1 之后)总是读取 0,然后将其与 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

【问题讨论】:

  • 我猜我们说的是 Linux 系统调用,但您可能希望将操作系统添加到标签中。

标签: linux assembly x86 system-calls


【解决方案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(...)
}

【讨论】:

  • +1 假设 Linux eax = syscall number (3) ebx = file descriptor ecx = pointer to buffer to read to edx = number of bytes to read (1).
  • 非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多