我目前正在 Linux 上学习汇编语言。我一直在使用《Programming From the Ground Up》一书,所有示例都是 32 位的。我的操作系统是 64 位,并且我一直尝试在 64 位中完成所有示例。但是我遇到了麻烦:
.section .data
.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rbx
int $0x80
这只是调用 Linux exit 系统调用或者它应该调用。相反,它会导致 SEG FAULT,当我这样做时
.section .data
.section .text
.global _start
_start:
movq $1, %rax
movq $2, %rbx
int $0x80
有用。显然问题是我移动到 %rax 的值。我在第二个示例中使用的值 $1 是“从头开始编程”所说的使用值,但是 Internet 上的多个来源表示 64 位系统调用号是 $60。参考 http://www.acsu.buffalo.edu/~charngda/linux_syscalls_64bit.html我究竟做错了什么?还有哪些问题需要注意,有哪些可以作为参考?以防万一您需要知道,我正在阅读《从头开始编程》的第五章。
您会遇到 i386 和 x86_64 之间的一个令人惊讶的差异:它们不使用相同的系统调用机制。正确的代码是:
movq $60, %rax
movq $2, %rdi ; not %rbx!
syscall
打断0x80
始终调用 32 位系统调用。它用于允许 32 位应用程序在 64 位系统上运行。
出于学习目的,您可能应该尝试严格遵循教程,而不是即时转换为 64 位 - 您可能会遇到一些其他显着的行为差异。一旦您熟悉了 i386,then你可以单独选择x86_64。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)