我发现这个页面在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
总是指向函数调用(这总是系统调用吗?)?这是唯一的目的吗?答案 0 :(得分:3)
通过“正确的寄存器”,作者是指Linux内核调用约定部分中x86-64 ABI指定的寄存器。系统电话号码位于rax
,参数位于rdi
,rsi
,rdx
,r10
,r8
和{{1}按顺序。
此调用约定(尤其是r9
!的使用)仅用于系统调用,系统调用最多只能有六个参数。应用程序函数使用不同(但相似)的调用约定,它将一些参数溢出到堆栈或其他寄存器。