【发布时间】:2012-01-20 13:45:06
【问题描述】:
我目前正在 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 的值。我在第二个示例中使用的值 $1 是“从头开始编程”所说的使用,但是 Internet 上的多个消息来源说 64 位系统调用号是 60 美元。 Reference 我究竟做错了什么?我还应该注意哪些其他问题以及我应该使用什么作为参考?以防万一你需要知道,我在从头开始编程的第 5 章。
【问题讨论】:
-
基本上是重复的:What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code? -
int $0x80仍然调用 32 位 ABI,使用 32 位寄存器和索书号。真的只是使用 Assembling 32-bit binaries on a 64-bit system (GNU toolchain) 来学习 32 位教程。
标签: linux assembly x86-64 system-calls gnu-assembler