NASM的使用
《Orange's一个操作系统的实现》书中选择的汇编器为NASM。用过MASM和GAS,发现NASM的语法是最简洁的,而且有强大的宏。通过man可以知道nasm的使用方法及它与其它汇编器语法上的区别。
主要值得注意的区别,也是我们常用的如下:
0.注释用分号‘;'
;这是注释
这是代码
0.注释用分号‘;'
;这是注释
这是代码
1.与gas不同,寄存器名字前面不用加'%'
与gas操作数的顺序不同,mov ax,dx表示ax=dx而不是dx=ax
2.浮点寄存器名字为st0,st1等
3.与masm的dup不同,nasm重复数据用times,如:
message:times 3 ‘abc’
times 64-$+message db 0
定义了字符串“abcabcabc”,加上后面跟着的0,长度总共为64
4.$表示当前行被汇编后的地址
5.$$表示一个节的开始处被汇编后的地址
6.符号都是立即数,标号和变量是一样的,都表示地址:
foo dw 1 等价与 foo:dw 1
7.[addr]表示取地址的值,可以带word,byte等前缀指定大小:
foo dw 1
mov ax,foo
mov dx,[foo]
ax中为1的地址,dx为1
8.简单宏定义:
%macro add 2 ;定义名为add,2个参数
mov ax, %1;第一个参数给ax
add ax, %2;加上第二个参数
%endmacro
add 1,3;调用宏
9.条件预编译宏
%ifdef _BOOT_DEBUG
org 0100h
%else
org 07c00h
%endif
ax中为1的地址,dx为1
8.简单宏定义:
%macro add 2 ;定义名为add,2个参数
mov ax, %1;第一个参数给ax
add ax, %2;加上第二个参数
%endmacro
add 1,3;调用宏
9.条件预编译宏
%ifdef _BOOT_DEBUG
org 0100h
%else
org 07c00h
%endif
nasm的文档下载:http://www.nasm.us/docs.php
网上有翻译的中文文档下载,这里有一份。