Sep 17
     《Orange's一个操作系统的实现》书中选择的汇编器为NASM。用过MASM和GAS,发现NASM的语法是最简洁的,而且有强大的宏。通过man可以知道nasm的使用方法及它与其它汇编器语法上的区别。
 
主要值得注意的区别,也是我们常用的如下:

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

 
nasm的文档下载:http://www.nasm.us/docs.php
网上有翻译的中文文档下载,这里有一份。