前言
正好最近打算写一个系统内核,因为要用汇编语言,就去查了一堆教程
结果发现大部分都是教科书式的——上来就列指令表、讲寻址方式、画内存图,
看得人昏昏欲睡,根本不知道从哪下手。
所以我就想,能不能换种方式?
不列定义,不讲大道理,用最简单的方式讲asm
这个教程就是这么来的
可以学到什么
这个教程将带你初步了解Intel x86_64架构汇编语言的基本概念,并搭建环境
用汇编写一个Hello World
开始之前
安装环境
Windows
先去从 NASM 官网下载 Windows 安装包
也可以直接
下载
适用于64位操作系统的
或者
下载
适用于32操作系统的
MacOS
使用啤酒(brew)安装nasm
brew install nasm
如果你没有啤酒就用这条命令安装啤酒(brew)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
如果你认为这个啤酒弱爆了, 那也可以 购买 啤酒
Linux
Debian / Ubuntu / Kali
sudo apt update && sudo apt install nasm
sudo dnf install nasm
sudo pacman -Syu && sudo pacman -S nasm
nasm -v验证如果可以显示版本号就下载完成了
第一个汇编的Hello World!
接下来环境都配置好后就可以开始写代码啦
这是一个Hello World的简单示例
; ./code/hello.asm
; 数据
section .data
msg db "Hello World", 0xA ; 0xA换行符
len equ $ - msg
section .text
global _start
_start:
; sys_write
mov rax, 1 ; 系统调用号 1 = sys_write
mov rdi, 1 ; 文件描述符 1 = stdout
mov rsi, msg ; 字符串地址
mov rdx, len ; 字符串长度
syscall
; sys_exit
mov rax, 60 ; 系统调用号 60 = sys_exit
xor rdi, rdi ; 退出码 0
syscall
运行
第一步:汇编 / Assemble
把 .asm 源代码转换成机器码目标文件(.o):
nasm -f elf64 hello.asm -o hello.o
参数说明:
-f elf64:指定输出格式为 64 位 ELF(Linux 的可执行文件格式)
-o hello.o:输出文件名
第二步:链接 / Link
将目标文件链接成可执行程序:
ld hello.o -o hello
说明:ld 是 GNU 链接器,它会把你的代码和操作系统规范结合起来,生成最终的可执行文件 hello。
第三步:运行 / Run!
直接执行生成的可执行文件:
./hello
预期输出:
[user@WSL ~/asm]$ ./hello
Hello World
[user@WSL ~/asm]$
总结
到这里,你已经用汇编写出了第一个程序,并且成功运行了它
别看代码只有十几行,它和你曾经写过的所有写过的Hello World一样
标志着新的旅途的开始
下一步学什么?
接下来你会学到
寄存器, 基本指令, 栈与函数调用, 条件分支与循环
写在最后
汇编不像高级语言那样"友好",没有现成的库函数,没有自动内存管理
但是坚持下来总可以看到另一番风景