簡體   English   中英

Linux x86-64 Hello World並注冊參數使用情況

[英]Linux x86-64 Hello World and register usage for parameters

我發現此頁面有一個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是否始終指向函數調用(這始終是系統調用?)? 這是唯一的目的嗎?

作者用“適當的寄存器”表示Linux內核調用約定部分中x86-64 ABI指定的寄存器。 系統調用編號以rax進入,參數以rdirsirdxr10r8r9順序進入。

該調用約定(尤其是使用syscall !)僅用於系統調用,最多只能有六個參數。 應用程序函數使用不同(但類似)的調用約定,這會將一些參數溢出到堆棧或其他寄存器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM