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 カーネル呼び出し規則セクションで指定したレジスターを意味します。にシステムコール番号、、、、の順raxに引数が入ります。rdirsirdxr10r8r9

この呼び出し規則 (特にsyscall! の使用) は、最大 6 つの引数しか持てないシステム コールにのみ使用されます。アプリケーション関数は、いくつかの引数をスタックまたは他のレジスターにスピルする、異なる (しかし類似した) 呼び出し規則を使用します。

于 2013-11-02T16:06:50.370 に答える