我目前正在学习在Linux下的汇编语言。我一直在使用《从基础开始编程》这本书,而且所有的例子都是32位的。我的操作系统是64位的,我一直试图在64位中完成所有的例子。然而,我遇到了麻烦:
.section .data
.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rbx
int $0x80
这仅仅调用了Linux的exit系统调用,或者应该是这样的。但实际上它导致了段错误,而当我采用这种方式时的结果是
.section .data
.section .text
.global _start
_start:
movq $1, %rax
movq $2, %rbx
int $0x80
代码可以运行。显然,问题出在我移动到% rax的值上。第二个示例中使用的$1是“从基础开始编程”建议使用的,但互联网上的多个来源称64位系统调用编号为$60。参考。我做错了什么?还有哪些问题需要注意?我应该使用什么参考资料? 以防万一您需要知道,我正在进行《从零开始编程》第5章的学习。
int $ 0x80
仍然调用32位ABI,使用32位寄存器和调用号码。 只需使用在64位系统上组装32位二进制文件(GNU工具链)来遵循32位教程即可。 - Peter Cordes