在Linux 64位处理命令行

这个问题在这里已经有了答案:

  • 如果您在64位代码中使用32位int 0x80 Linux ABI,会发生什么情况? 1个答案

  • 您正在将正确的地址加载到%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

    链接地址: http://www.djcxy.com/p/72445.html

    上一篇: Process command line in Linux 64 bit

    下一篇: Referencing the contents of a memory location. (x86 addressing modes)