前言



正好最近打算写一个系统内核,因为要用汇编语言,就去查了一堆教程
结果发现大部分都是教科书式的——上来就列指令表、讲寻址方式、画内存图,
看得人昏昏欲睡,根本不知道从哪下手。


所以我就想,能不能换种方式?
不列定义,不讲大道理,用最简单的方式讲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
Fedora / RHEL / CentOS
sudo dnf install nasm
Arch / Manjaro
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一样
标志着新的旅途的开始


下一步学什么?



接下来你会学到
寄存器, 基本指令, 栈与函数调用, 条件分支与循环


写在最后



汇编不像高级语言那样"友好",没有现成的库函数,没有自动内存管理
但是坚持下来总可以看到另一番风景

目录