Nasm中文手册三
2.2 MASM用户速成。
如果你曾使用MASM写程序,或者使用在MASM兼容模式下使用TASM, 或者使用'a86',
本节将阐述MASM与NASM语法之间的主要区别。如果你没有使用过MASM,那最好先
跳过这一节。
2.2.1 NASM是大小写敏感的。
一个简单的区别是NASM是大小写敏感的。当你调用你的符号'foo','Foo',或
'FOO'时,它们是不同的。如果你在汇编'DOS'或'OS/2', '.OBJ'文件,你可以使
用'UPPERCASE'操作符来保证所有的导出到其他代码模式的符号都是大写的;但
是,在仅仅一个单独的模块中,NASM会区分大小写符事情。
2.2.2 NASM需要方括号来引用内存地址。
NASM的设计思想是语法尽可能简洁。它的一个设计目标是,它将在被使用的过程
中,尽可能得让用户看到一个单行的NASM代码时,就可以说出它会产生什么操作
码。你可以在NASM中这样做,比如,如果你声明了:
foo equ 1
bar dw 2
然后有两行的代码:
mov ax,foo
mov ax,bar
尽管它们有看上去完全相同的语法,但却产生了完全不同的操作码
NASM为了避免这种令人讨厌的情况,拥有一个相当简单的内存引用语未能。规则
是任何对内存中内容的存取操作必须要在地址上加上方括号。但任何对地址值
的操作不需要。所以,形如'mov ax,foo'的指令总是代表一个编译时常数,不管它
是一个 'EQU'或一个变量的地址;如果要取变量'bar'的内容,你必须与
'mov ax,[bar]'。
这也意味着NASM不需要MASM的'OFFSET'关键字,因为MASM的代码'mov ax,offset bar'
同NASM的语法'mov ax,bar'是完全等效的。如果你希望让大量的MASM代码能够被
NASM汇编通过,你可以编写'%idefine offset'让预处理器把'OFFSET'处理成一个无
操作符。
这个问题在'a86'中就更混乱了。
NASM因为关注简洁性,同样不支持MASM和它的衍生产品支持的的混合语法,比如像
:'mov ax, table[bx]',这里,一个中括号外的部分加上括号内的一个部分引用一个
内存地址,上面代码的正确语法是:'mov ax,[table+bx] 。同样,'mov ax,es:[di]'
也是错误的,正确的应该是'mov ax,[es:di]'。
2.2.3 NASM不存储变量的类型。
NASM被设计成不记住你声明的变量的类型。然而,MASM在看到'var dw 0'时会记住
类型,然后就可以隐式地合用'mov var, 2'给变量赋值。NASM不会记住关于变量
'var'的任何东西,除了它的位置,所以你必须显式地写上代码'mov word [var],2'。
因为这个原因,NASM不支持'LODS','MOVS','STOS','SCANS','CMPS','INS',或'OUTS'
指令,仅仅支持形如'LODSB','MOVSW',和'SCANSD'之灰的指令。它们都显式地指定
被处理的字符串的尺寸。
2.2.4 NASM不会 `ASSUME'
作为NASM简洁性的一部分,它同样不支持'ASSUME'操作符。NASM不会记住你往段寄
存器里放了什么值,也不会自动产生段替换前缀。
2.2.5 NASM不支持内存模型。
NASM同样不含有任何操作符来支持不同的16位内存模型。程序员需要自己跟踪那
些函数需要far call,哪些需要near call。并需要确定放置正确的'RET'指令('RETN'
或'RETF'; NASM接受'RET'作为'RETN'的另一种形式);另外程序员需要在调用外部函
数时在需要的编写CALL FAR指令,并必须跟踪哪些外部变量定义是far,哪些是near。
2.2.6 浮点处理上的不同。
NASM使用跟MASM不同的浮点寄存器名:MASM叫它们'ST(0)','ST(1)'等,而'a86'叫它们
'0','1'等,NASM则叫它们'st0','st1'等。
在版本0.96上,NASM现在以跟MASM兼容汇编器同样的方式处理'nowait'形式的指令,
0.95以及更早的版本上的不同的处理方式主要是因为作者的误解。
2.2.7 其他不同。
由于历史的原因,NASM把MASM兼容汇编器的'TBYTE'写成'TWORD'。
NASM以跟MASM不同的一种方式声明未初始化的内存。MASM的程序员必须使用
'stack db 64 dup (?)', NASM需要这样写:'stack resb 64',读作"保留64字节"。为了
保持可移植性,NASM把'?'看作是符号名称中的一个有效的字符,所以你可以编写这样
的代码'? equ 0', 然后写'dw ?'可以做一些有用的事情。'DUP'还是一个不被支持的语法。
另外,宏与操作符的工作方式也与MASM完全不同,可以到参阅第4,第5章。