您正在将正确的地址加载到中
%rcx。
int 0x80然后调用32位syscall接口。这会将地址截断为32位,这使它不正确。(如果您使用调试器并在第一个调试器之后设置一个断点
int0x80,则会看到它返回-14 in
%eax,即
-EFAULT。)
第二个syscall
exit可以正常工作,因为在这种情况下,截断为32位不会造成任何损害。
如果要将64位地址传递给系统调用,则必须使用64位syscall接口:
- 使用
syscall
而不是int 0x80
; - 使用了不同的寄存器:请参见此处;
- 系统电话号码也不同:请参见此处。
这是您的代码的有效版本:
.section .text.globl _start_start: movq %rsp, %rbp movq $1, %rax movq $1, %rdi movq 8(%rbp), %rsi # program name address ? movq $5, %rdx syscall movq $60, %rax movq $0, %rdi syscall



