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章。

(0)

相关推荐

  • NASM(汇编编译器安装)

    https://www.nasm.us/pub/nasm/snapshots/latest/win64/ 安装时候的选项,都选择上 安装好的样子就是这样 C:\Users\yunswj\AppData ...

  • Nasm中文手册四

    第四章 NASM预处理器. -------------------------------- NASM拥有一个强大的宏处理器,它支持条件汇编,多级文件包含,两种形式的 宏(单行的与多行的),还有为更强 ...

  • Nasm中文手册二

    第三章 NASM语言 ---------------- 3.1 NASM源程序行的组成. 就像很多其他的汇编器,每一行NASM源代码包含(除非它是一个宏,一个预处理操作 符,或一个汇编器操作符,参况第 ...

  • Nasm中文手册

    Nasm中文手册一    -------------------------------------------------------------------------------- 第一章: 简 ...

  • 【Deep Learning with PyTorch 中文手册】(三)Execution Mode

    Immediate versus Deferred Execution 深度学习库的关键区别在于是即时执行(Immediate Execution)还是延迟执行(Deferred Execution) ...

  • 实时操作系统ThreadX全中文手册上线了

    对于很多初学者来说,学习一门技术非常头疼的一件事,就是面对英文资料和手册. 不但初学者,对于有一定工作经验的工程师来说,想要深入理解技术,遇到英文资料和手册同样头疼. 最近,实时操作系统ThreadX ...

  • iw linux 命令 在线中文手册

    iw 相关命令: iwconfig iw 是一种新的基于 nl80211 的用于无线设备的CLI配置实用程序.它支持最近已添加到内核所有新的驱动程序.采用无线扩展接口的旧工具iwconfig已被废弃, ...

  • Sinumerik中文手册库

    SINUMERIK 828D 操作/编程/诊断 SINUMERIK中文手册库 SINUMERIK 840D sl 操作/编程/诊断 SINUMERIK 828D 硬件/调试 SINUMERIK 840 ...

  • 【Deep Learning with PyTorch 中文手册】(九)Size,Offset,Strides

    Size, storage offset, and strides 为了索引到内存中,张量依赖于一些信息,这些信息明确地定义了:尺寸大小,内存偏移量和单位步长(见下图).存储尺寸大小信息的变量(Num ...

  • 【Deep Learning with PyTorch 中文手册】(八)Tensors and storages

    Tensors and storages 在本节中,我们将开始探讨张量存储的内部实现.张量的值被分配在连续的内存块中,由torch.Storage管理.一块存储指的是存储数据的一维数组,例如包含给定类 ...