跳到內容

第一個程式解析

現在應該已經大致了解此範例程式的每個內容,讓我們回來看第一個程式

global _start
section .data
hello: db "Hello World!",10
section .text
_start:
mov rax, 1 ; 1=sys_write
mov rdi, 1 ; 1=stdout
mov rsi, hello
mov rdx, 13
syscall
mov rax, 60 ; 60=sys_exit
xor rdi, rdi
syscall

第一行宣告了作為程式進入點的_start函數是可被外部使用的,類似高階語言public的概念
接著.data數據段保存了Hello World!\n內容在記憶體,再來就是代碼段
此程式只有兩個動作,輸出和離開

mov rax, 1 ; 1=sys_write
mov rdi, 1 ; 1=stdout
mov rsi, hello
mov rdx, 13
syscall

這四行的動作用於呼叫sys_write(fd, *buf, count);執行寫入的動作
此系統函數的編號是1,所以將rax設為1
第一個參數fd(file descriptor),使用stdout為1
第二個參數是要輸出內容的開頭地址,將hello的地址載入rsi
第三個參數是輸出的長度,這裡全部13個字符所以將rdx設為13
設定好即可使用syscall系統呼叫

接著退出程式

mov rax, 60 ; 60=sys_exit
xor rdi, rdi
syscall

系統函數編號60是退出,有一個參數作為退出的返回值
將第一個參數rdi清零,返回值0表示正常退出