Linux x86-64下的Hello World和参数的寄存器使用

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是否总是指向函数调用(这将始终是系统调用)?那是它唯一的目的吗?
1个回答

3
"the proper registers"指的是x86-64 ABI中Linux内核调用约定部分指定的寄存器。系统调用号放在rax中,参数按照rdi、rsi、rdx、r10、r8和r9的顺序放置。这个调用约定(尤其是syscall的使用!)仅用于系统调用,最多只能有六个参数。应用程序函数使用不同(但类似)的调用约定,将一些参数溢出到堆栈或其他寄存器。"

感谢您的回复-有几个问题:1)所以所有系统调用都有少于7个参数吗?2)rax是否也为应用程序函数执行相同的“职责”?3)为什么只有rdi、rsi、rdx、r10、r8和r9?在x86-64上难道没有其他寄存器可以使用吗? - user997112
  1. 目前没有,但如果有的话,可以使用临时结构。
  2. 不,它不会。
  3. 任何调用约定都是方便调用者和被调用者之间的权衡。当参数超过6个时,堆栈用于传递其他参数。但这通常很少见。
- Netch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接