【发布时间】: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