1,搭建编程环境
1.1 NASM 基本信息
示例使用的汇编器为 nasm
主页:
https://www.nasm.us/https://www.nasm.us/
下载最新的稳定版源代码
wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/nasm-2.16.01.tar.gz
1.2解压并编译安装
tar zxf nasm-2.16.01.tar.gz
cd cd nasm-2.16.01/
./configure
make -j
sudo make install
执行make -j前的文件夹内容:
执行make -j 后的文件夹内容:
安装
不安装的话也可以使用,只是每次需要跑到这个nasm的文件夹里来使用它。
简单测试:
2,示例测试 Hello World x86
2.1 源代码 及说明:
源码文件名可能有所改动,可以调整回来。
;assembly language hello world
section .data
bbb db "hello asm lan world!\n", 0
section .bss
section .text
global main
main:
mov rax, 3 ;
mov rdi, 1 ;
mov rsi, bbb ;
mov rdx, 21 ;
syscall
mov rax, 60 ;
mov rdi, 0 ;
syscall
2.2 汇编,链接并执行
汇编命令:
nasm hello.asm -f elf64 -g -l hello.lst
由于nasm只是个汇编器,会把汇编语言翻译成机器码,生成 *.o 文件,还没有链接,于是不能执行;
链接:
$ gcc -o hello hello.o -no-pie
运行:
写一个Makefile:
all: hello
hello: hello.o
gcc -o $@ $< -no-pie
hello.o: hello.asm
nasm $< -f elf64 -g -l hello.lst -o $@
.PHONY: clean
clean:
-rm -f hello *.o *.lst
规则行的起始处要用tab键
或者为了能够简单地加入更多被编译的 asm 源文件,也可以使用如下的Makefile
例如,还需要编译一个名为 world.asm 的汇编源文件,只需要将EXE 修改为:
EXE := hello world
EXE := hello
all: $(EXE)
%: %.o
gcc -o $@ $< -no-pie
%.o: %.asm
nasm $< -f elf64 -g -l $*.lst -o $@
.PHONY: clean
clean:
-rm -f hello *.o *.lst
效果:
3, gcc 的角色
上述单行命令或Makefile中的 gcc 都仅作为编译器的 driver,并没调用编译功能和汇编功能,而是仅仅调用了链接功能 collect2,这可以在 gcc 后边跟上 -v 来查看详细的信息:
3.1 gcc -v
将上述过程中的
$ gcc -o hello hello.o -no-pie
修改为
$ gcc -v -o hello hello.o -no-pie
可以得到如下输出信息:
这里调用了 gnu 的collect2 连接器
3.2 clang -v
可以将上述过程中的 gcc 改用 clang,则得到类似的结果,稍微不同的是这里使用了 gnu ld 链接器。
4. 关于list列表文件 hello.lst
4.1 内容

4.2 分析

列表文件包含了源代码和编译器生成的机器指令之间的详细对应关系,以及行号和地址信息。它对于调试和理解汇编程序的结构非常有用。
列表文件会包含以下信息:
- 源代码行:原始的汇编语言指令。
- 地址:每条指令或数据元素在生成的目标文件中的地址。
- 机器码:汇编指令对应的二进制编码。
- 行号:源文件中的行号,方便开发者对照源代码。
通过 -l 指定生成列表文件,是一个可选步骤,但在复杂的汇编项目中,这个文件可以帮助开发者更好地理解代码是如何被转换为机器码的,以及各个指令的放置位置。此外,如果在汇编过程中遇到错误或警告,列表文件也可以帮助快速定位问题所在的源代码行。
5. IDE Simple ASM