[英]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
進入,參數以rdi
, rsi
, rdx
, r10
, r8
和r9
順序進入。
該調用約定(尤其是使用syscall
!)僅用於系統調用,最多只能有六個參數。 應用程序函數使用不同(但類似)的調用約定,這會將一些參數溢出到堆棧或其他寄存器中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.