Linux x86-64 Hello World和参数的注册用法

时间:2013-11-02 15:16:33

标签: linux assembly x86 x86-64 nasm

我发现这个页面在Linux上有x86-64的Hello World示例:

http://blog.markloiseau.com/2012/05/64-bit-hello-world-in-linux-assembly-nasm/

; 64-bit "Hello World!" in Linux NASM

global _start            ; global entry point export for ld

section .text
_start:

    ; sys_write(stdout, message, length)

    mov    rax, 1        ; sys_write
    mov    rdi, 1        ; stdout
    mov    rsi, message    ; message address
    mov    rdx, length    ; message string length
    syscall

    ; sys_exit(return_code)

    mov    rax, 60        ; sys_exit
    mov    rdi, 0        ; return 0 (success)
    syscall

section .data
    message: db 'Hello, world!',0x0A    ; message and newline
    length:    equ    $-message        ; NASM definition pseudo-instruction

作者说:

  

表示system_write调用的整数值放在   首先注册,然后是其参数。当系统调用时   它的参数都在适当的寄存器中,系统被调用   并显示消息。

  • “正确”寄存器是什么意思/什么是“适当”寄存器?
  • 如果我的参数多于我的寄存器,会发生什么?
  • rax总是指向函数调用(这总是系统调用吗?)?这是唯一的目的吗?

1 个答案:

答案 0 :(得分:3)

通过“正确的寄存器”,作者是指Linux内核调用约定部分中x86-64 ABI指定的寄存器。系统电话号码位于rax,参数位于rdirsirdxr10r8和{{1}按顺序。

此调用约定(尤其是r9!的使用)仅用于系统调用,系统调用最多只能有六个参数。应用程序函数使用不同(但相似)的调用约定,它将一些参数溢出到堆栈或其他寄存器。