第一個程式解析
現在應該已經大致了解此範例程式的每個內容,讓我們回來看第一個程式
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_writemov rdi, 1 ; 1=stdoutmov rsi, hellomov rdx, 13syscall這四行的動作用於呼叫sys_write(fd, *buf, count);執行寫入的動作
此系統函數的編號是1,所以將rax設為1
第一個參數fd(file descriptor),使用stdout為1
第二個參數是要輸出內容的開頭地址,將hello的地址載入rsi
第三個參數是輸出的長度,這裡全部13個字符所以將rdx設為13
設定好即可使用syscall系統呼叫
接著退出程式
mov rax, 60 ; 60=sys_exitxor rdi, rdisyscall系統函數編號60是退出,有一個參數作為退出的返回值
將第一個參數rdi清零,返回值0表示正常退出