x86_64 Linux 中内联 asm 的系统调用?
为什么这会打印垃圾而不是优雅地退出我的程序? 我在 BSD 上以这种方式使用系统调用,我想知道需要什么才能使其在 Linux 上工作。
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
谢谢。
Why does this print garbage instead of exiting my program gracefully? I use system calls this way on BSD, and I wonder what would I need to make it work in Linux.
int
main(int argc, char **argv)
{
__asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
return 0;
}
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我相信 Syscall 1 在 i386 上退出,但在 x86-64 上写入。
编辑:这似乎不准确:
根据网络,似乎没有太多关于 x86-64 Linux 程序集的信息,这似乎是系统调用指令之前的预期寄存器设置。
Syscall 1 is exit on i386 but write on x86-64 I believe.
EDIT: this seems inaccurate:
According to the web, which does not seem to have too much information about x86-64 Linux assembly this seems to be the expected register setup before the syscall instruction.
根据 CESA-2009-001,“Syscall 1 在 i386 上退出,但是在 x86_64 上写入”。
使用当前 unistd_64.h
希望这有帮助!
Per CESA-2009-001, "Syscall 1 is exit on i386 but write on x86_64".
Use the syscall ordinals from the current unistd_64.h
Hope this helps!