您正在将正确的地址加载到中%rcx
。
int 0x80
然后调用32位syscall接口。这会将地址截断为32位,这使它不正确。(如果您使用调试器并在第一个调试器之后设置一个断点int 0x80
,则会看到它返回-14 in %eax
,即-EFAULT
。)
第二个syscall exit
可以正常工作,因为在这种情况下,截断为32位不会造成任何损害。
如果要将64位地址传递给系统调用,则必须使用64位syscall接口:
这是您的代码的有效版本:
.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