[英]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.