在GNU汇编程序中sys_read syscall与int 0x80

时间:2012-12-25 18:25:44

标签: assembly x86 x86-64 system-calls gas

我正在尝试编写一个简单的程序,它从stdin中抓取一些字符。为简洁起见,相关代码为:

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

我无法在此找到任何好的文档,所以任何输入都会受到赞赏。

编辑:拼写错误

1 个答案:

答案 0 :(得分:0)

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

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