【问题标题】:sys_read syscall vs. int 0x80 in GNU Assembler [duplicate]GNU Assembler 中的 sys_read 系统调用与 int 0x80 [重复]
【发布时间】:2012-12-11 13:34:11
【问题描述】:

我正在尝试编写一个从标准输入中获取多个字符的简单程序。为简洁起见,相关代码为:

mov $3, %rax    # sys_read = 3
mov $0, %rbx    # stdin fd = 0
mov $b, %rcx    # '.lcomm b, 32' declared in .bss section
mov $32,%rdx    # size_t
# syscall
int $0x80

当我使用int $0x80 时,程序按预期运行,但是使用syscall 时会出现段错误。我读到这与使用中断需要内核记住机器状态这一事实有关,而syscall 不满足该要求,即内核在自己的时间处理它。我不确定这是否是真正的原因 - 我会假设 syscall 对寄存器做了一些事情,导致 sys_read 失败。

我还从之前发布的问题中读到“syscall 是进入内核的默认方式”和“int 0x80 是调用系统调用的传统方式,应该避免使用。” (Link)

我真的找不到任何好的文档,所以任何输入都将不胜感激。

编辑:错字

【问题讨论】:

  • syscall 应该可以在 64 位系统上工作,但是您需要在不同的寄存器中使用不同的 sys_call 编号和参数。有趣的是,不推荐 int 80h ......但似乎工作 - 即使在 64 位系统上! 64 位寄存器和 32 位系统调用号和参数的“混合包”。
  • 啊,好的,谢谢。 $b 和 $0 分别进入寄存器 rsi 和 rdi。

标签: assembly x86 x86-64 system-calls gnu-assembler


【解决方案1】:

检查this 问题。在 x86_64 上,正确的退出系统调用是 $60,它应该在 %rax 中。

 mov $60, %rax
 mov $0, %rdi 
 syscall

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多