linux - x86_64 汇编 Linux 系统调用混淆

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

我目前正在 Linux 上学习汇编语言。我一直在使用“从头开始编程”一书,所有示例都是 32 位的。我的操作系统是 64 位的,我一直在尝试在 64 位中完成所有示例。但是我遇到了麻烦:

.section .data

.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rbx
int $0x80

这只是调用 Linux 退出系统调用或者它应该调用。相反,它会导致 SEG FAULT,而当我这样做时
.section .data

.section .text
.global _start
_start:
movq $1, %rax
movq $2, %rbx
int $0x80

有用。显然问题是我移动到 %rax 的值。我在第二个示例中使用的值(value) 1 美元是“从头开始编程”所说的使用,但是 Internet 上的多个来源说 64 位系统调用号是 60 美元。 Reference
我究竟做错了什么?我还应该注意哪些其他问题以及我应该使用什么作为引用?以防万一你需要知道,我在从头开始编程的第 5 章。

最佳答案

i386 和 x86_64 之间发生了很多变化,包括用于进入内核的指令和用于携带系统调用参数的寄存器。这是与您的代码等效的代码:

.section .data

.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rdi
syscall

引自 this answer到一个相关的问题:

The syscall numbers are in the Linux source code under arch/x86/include/asm/unistd_64.h. The syscall number is passed in the rax register. The parameters are in rdi, rsi, rdx, r10, r8, r9. The call is invoked with the "syscall" instruction. The syscall overwrites the rcx register. The return is in rax.

关于linux - x86_64 汇编 Linux 系统调用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510333/

相关文章:

assembly - 如何用汇编语言检查EIP值?

c - 汇编到 C 代码跳转

linux - node.js mplayer fifo 控制

c++ - 调用 POCO c++ ServerSocket() 时在 Linux 上出现段错误

C、汇编 x86 - 调用替代方案

c++ - 如何在 x64 Visual C++ 中执行裸函数和内联汇编程序

linux - 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

c - 组装时如何返回?

linux - 一个 bash 脚本中的多个 find -exec 命令不起作用?

java - 如何使 SWT 浏览器控件在 Linux(Ubuntu 14) 上使用 Mozilla/Firefox 而不是 WebKit