第一个程序解析
概述
现在应该已经大致了解此范例程序的每个内容,让我们回来看第一个程序
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表示正常退出