跳转到内容

第一个程序解析

概述

现在应该已经大致了解此范例程序的每个内容,让我们回来看第一个程序

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表示正常退出