nasm 的一些技巧

我们在 64 位机器上,在 x86-64 上编译/链接 32 位应用程序时,设置模拟以 elf_i386 提供正确的 ELF 格式

1
2
nasm -f elf -o xxx.o xxx.s
ld -m elf_i386 -s -o xxx.bin xxx.o

下断点,在 bochs 的配置文件加入 “magic_break: enabled=1”,作用是 bochs 启动时开启魔术断点调试功能

1
2
xchg bx, bx
asm volatile ("xchg %%bx, %%bx" ::);

标号

在 NASM 汇编语言中,每条指令的前面都可以拥有一个标号,以代表和指示该指令的汇编地址。比如:

1
infi: jmp near infi

标号后面的冒号是可选的,所以:infi jmp near infi 也是正确的。

还有标号可以单独占用一行的位置:

1
2
infi:
jmp near infi

效果一样,因为 infi 所在的那一行没有指令,他的地址就是下一行的地址。

标号可以由字母、数字等特殊符号组成,但必须以字母、点、下划线、问号 中的任意一个打头。

声明并初始化地址

DB(Declare Byte):声明字节。注意要声明超过一个以上的数据,各个操作数之间必须以逗号隔开

DW(Declare Word):声明字数据

DD(Declare Double Word):声明双字数据

DQ(Declare Quad Word):声明四字数据

这些是编译器提供的汇编指令,也称为伪指令。