3

我发现这个页面有一个 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总是指向函数调用(这总是系统调用?)?这是它唯一的目的吗?
4

1 回答 1

3

作者所说的“正确的寄存器”是指x86-64 ABI在 Linux Kernel Calling Conventions 部分中指定的寄存器。系统调用号按顺序输入rax,参数按顺序输入rdi, rsi, rdx, r10,r8r9, 。

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

于 2013-11-02T16:06:50.370 回答