nasm编译器
- nasm只是一个编译器,只能输出目标文件,你还需要一个链接器来生成exe。
- nasm支持多种输出文件格式,比如obj、elf等等。用参数-f告诉nasm输出什么格式。参数-hf可以查看支持的格式。
- 在没有-f参数的情况下,nasm默认的输出文件格式是bin,比如要写boot sector就要输出成bin。bin这种格式没有所谓段这个概念,分段都是自己管理。
nasm编译选项
nasm 1.asm -o 1.com
只展开宏不编译
nasm -e 1.asm -o 2.asm
nasm中section的概念
nasm支持以下三个标准的段,编译后的程序文件中的内存地址顺序是.text, .data,用户自定义section
1 .text
用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器指令,当各个源文件单独编译之后生成目标文件,经连接器链接各个目标文件并解决各个源文件之间函数的引用,与此同时,还得将所有目标文件中的.text段合在一起,但不是简单的将它们“堆”在一起就完事,还需要处理各个段之间的函数引用问题。
2 .data
用于存放在编译阶段(而非运行时)就能确定的数据,可读可写。也是通常所说的静态存储区,赋了初值的全局变量、常量和静态变量都存放在这个域。
而bss段不在可执行文件中,由系统初始化。
3.bss
BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。
比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
nasm之bits
'BITS’指令指定NASM产生的代码是被设计运行在16位模式的处理器上还是运行在32位模式的处理器上。
section .text
bits 16
nasm基础语法
nasm基础语法与masm差不多,但是有些地方需要注意
1. nasm使用寄存器+偏移地址
寻址时寄存器要写在里面
mov [es:120], ax
2. nasm不使用offest
关键字,[地址值]
即代表使用地址里面的值
mov [es:120], ax
3. nasm 定义的 7 种数据 size
- byte : 8 位
- word : 16 位
- dword : 32 位
- qword : 64 位
- tword : 80 位
- oword : 128 位
- yword : 256 位
4.nasm 定义了用于初始化上面 7 种 size 的 db 家族,它们用于定义初化常量值。
db : define byte
dw :define word
dd :define doubleword
dq :define quadword
dt :define tword
do :define oword
dy :define yword
5. nasm 为操作数指定一个size值
mov byte [buffer + 0x01] , 'a'