在Linux 64位处理命令行
这个问题在这里已经有了答案:
您正在将正确的地址加载到%rcx
。
int 0x80
然后调用32位系统调用接口。 这将地址截断为32位,这使得它不正确。 (如果你使用一个调试器,仅仅是第一后设置一个断点int 0x80
,你会看到它在-14返回%eax
,这是-EFAULT
。)
第二个系统调用exit
工作正常,因为截断到32位在这种情况下不会造成任何伤害。
如果要将64位地址传递给系统调用,则必须使用64位系统调用接口:
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
如X86_64 ABI所述:使用syscall
指令而不是int $0x80
。 内核在64位中使用不同的寄存器作为系统调用参数,为syscall函数分配的编号也在i386和x86_64之间变化。
一个例子 - 在德国,抱歉 - 可以在这里找到:
http://zygentoma.de/codez/linux_assembler.php
上一篇: Process command line in Linux 64 bit
下一篇: Referencing the contents of a memory location. (x86 addressing modes)