⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nasm.txt

📁 masm is a important thing.
💻 TXT
📖 第 1 页 / 共 5 页
字号:

nasm -ic:\macrolib\ -f obj myfile.asm

(通常,在 '-i'与路径名之间的空格是允许的,并且可选的。)

NASM更多的关注源代码级上的完全可移植性,所以并不理解正运行的操作系统对文件的
命名习惯;你提供给'-i'作为参数的的字符串会被一字不差地加在包含文件的文件名前。
所以,上例中最后面的一个反斜杠是必要的,在Unix下,一个尾部的正斜线也同样是必要的。

(当然,如果你确实需要,你也可以不正规地使用它,比如,选项'-ifoo'会导致
'%incldue "bar.i'去搜索文件'foobar.i'...)

如果你希望定义一个标准的搜索路径,比如像Unix系统下的'/usr/include',你可以在环境
变量NASMENV中放置一个或多个'-i'(参阅2.1.19)

为了与绝大多数C编译器的Makefile保持兼容,该选项也可以被写成'-I'。

  2.1.10 `-p' 选项: 预包含一个文件

NASM允许你通过'-p'选项来指定一个文件预包含进你的源文件。所以,如果运行:

nasm myfile.asm -p myinc.inc

跟在源文件开头写上'%include "myinc.inc"然后运行'nasm myfile.asm'是等效的。

为和'-I','-D','-U'选项操持一致性,该选项也可以被写成'-P'

2.1.11 `-d'选项: 预定义一个宏。

就像'-p'选项给出了在文件头放置'%include'的另一种实现,'-d'选项给出了在文
件中写'%define'的另一种实现,你可以写:

nasm myfile.asm -dFOO=100

     作为在文件中写下面一行语句的一种替代实现:

      %define FOO 100

      在文件的开始,你可以取消一个宏定义,同样,选项'-dFOO'等同于代码'%define FOO'。
这种形式的操作符在选择编译时操作中非常有用,它们可以用'%ifdef'来进行测试,
比如'-dDEBUG'。
     
      为了与绝大多数C编译器的Makefile保持兼容,该选项也可以被写成'-D'。

  2.1.12 `-u' 选项: 取消一个宏定义。
 
  '-u'选项可以用来取消一个由'-p'或'-d'选项先前在命令行上定义的一个宏定义。

比如,下面的命令语句:

      nasm myfile.asm -dFOO=100 -uFOO

会导致'FOO'不是一个在程序中预定义的宏。这在Makefile中不同位置重载一个操
作时很有用。

为了与绝大多数C编译器的Makefile保持兼容,该选项也可以被写成'-U'。

  2.1.13 `-e'选项: 仅预处理。
 
  NASM允许预处理器独立运行。使用'-e'选项(不需要参数)会导致NASM预处理输入
文件,展开所有的宏,去掉所有的注释和预处理操作符,然后把结果文件打印在标
准输出上(如果'-o'选项也被指定的话,会被存入一个文件)。

该选项不能被用在那些需要预处理器去计算与符号相关的表达式的程序中,所以
如下面的代码:

      %assign tablesize ($-tablestart)

会在仅预处理模式中会出错。

  2.1.14 `-a' 选项: 不需要预处理。
 
  如果NASM被用作编译器的后台,那么假设编译器已经作完了预处理,并禁止NASM的预
处理功能显然是可以节约时间,加快编译速度。'-a'选项(不需要参数),会让NASM把
它强大的预处理器换成另一个什么也不做的预处理器。
 
  2.1.15 `-On'选项: 指定多遍优化。
 
  NASM在缺省状态下是一个两遍的汇编器。这意味着如果你有一个复杂的源文件需要
多于两遍的汇编。你必须告诉它。

      使用'-O'选项,你可以告诉NASM执行多遍汇编。语法如下:

      (*)'-O0'严格执行两遍优化,JMP和Jcc的处理和0.98版类似,除了向后跳的JMP是短跳
转,如果可能,立即数在它们的短格式没有被指定的情况下使用长格式。

      (*)'-O1'严格执行两遍优化,但前向分支被汇编成保证能够到达的代码;可能产生比
'-O0'更大的代码,但在分支中的偏移地址没有指定的情况下汇编成功的机率更大,

      (*)'-On' 多编优化,最小化分支的偏移,最小化带符号的立即数,当'strict'关键字
没有用的时候重载指定的大小(参阅3.7),如果2<=n<=3,会有5*n遍,而不是n遍。

注意这是一个大写的O,和小写的o是不同的,小写的o是指定输出文件的格式,可参阅
2.1.1

  2.1.16 `-t'选项: 使用TASM兼容模式。
 
  NASM有一个与Borlands的TASM之间的受限的兼容格式。如果使用了NASM的'-t'选项,
就会产生下列变化:

      (*)本地符号的前缀由'.'改为'@@'
     
      (*)TASM风格的以'@'开头的应答文件可以由命令行指定。这和NASM支持的'-@resp'
风格是不同的。

      (*)扩号中的尺寸替换被支持。在TASM兼容模式中,方括号中的尺寸替换改变了操作
数的尺寸大小,方括号不再支持NASM语法的操作数地址。比如,'mov eax,[DWORD VAL]'
在TASM兼容语法中是合法的。但注意你失去了为指令替换缺省地址类型的能力。
       
      (*)'%arg'预处理操作符被支持,它同TASM的ARG操作符相似。

      (*) `%local'预处理操作符。

      (*) `%stacksize'预处理操作符。

      (*) 某些操作符的无前缀形式被支持。 (`arg', `elif',`else', `endif', `if',
       `ifdef', `ifdifi', `ifndef', `include',`local')

      (*) 还有很多...

需要更多的关于操作符的信息,请参阅4.9的TASM兼容预处理操作符指令。

  2.1.17 `-w'选项: 使汇编警告信息有效或无效。
 
  NASM可以在汇编过程中监视很多的情况,其中很多是值得反馈给用户的,但这些情况
还不足以构成严重错误以使NASM停止产生输出文件。这些情况被以类似错误的形式
报告给用户,但在报告信息的前面加上'warning'字样。警告信息不会阻止NASM产生
输出文件并向操作系统返回成功信息。
 
  有些情况甚至还要宽松:他们仅仅是一些值得提供给用户的信息。所以,NASM支持'-w'
命令行选项。它以使特定类型的汇编警告信息输出有效或无效。这样的警告类型是
以命名来描述的,比如,'orphan-labels',你可以以下列的命令行选项让此类警告信息
得以输出:'-w+orphan-labels',或者以'-w-orphan-labels'让此类信息不能输出。
 
  可禁止的警告信息类型有下列一些:
 
      (*)`macro-params'包括以错误的参数个数调用多行的宏定义的警告。这类警告信息
缺省情况下是输出的,至于为什么你可能需要禁止它,请参阅4.3.1。

      (*)`orphan-labels'包含源文件行中没有指令却定义了一个没有结尾分号的label的
警告。缺省状况下,NASM不输出此类警告。如果你需要它,请参阅3.1的例子。

      (*) 'number-overflow'包含那些数值常数不符合32位格式警告信息(比如,你很容易打
      了很多的F,错误产生了'0x7fffffffffff')。这种警告信息缺省状况下是打开的。
         
  2.1.18 `-v'选项: 打印版本信息。

   输入'NASM -v'会显示你正使用的NASM的版本号,还有它被编译的时间。

如果你要提交bug报告,你可能需要版本号。

  2.1.19 `NASMENV'环境变量。

如果你定义了一个叫'NASMENV'的环境变量,程序会被把它认作是命令行选项附加的一
部分,它会在真正的命令行之前被处理。你可以通过在'NASMENV'中使用'-i'选项来定
义包含文件的标准搜索路径。

环境变量的值是通过空格符分隔的,所以值'-s ic:\nasmlib'会被看作两个单独的操
作。也正因为如此,意味着值'-dNAME='my name'不会象你预期的那样被处理, 因为它
会在空格符处被分开,NASM的命令行处理会被两个没有意义的字符串'-dNAME="my'和
'name"'给弄混。

为了解决这个问题,NASM为此提供了一个特性,如果你在'NASMENV'环境变量的第一个
字符处写上一个非减号字符,NASM就会把这个字符当作是选项的分隔符。所以把环
境变量设成'!-s!-ic:\nasmlib'跟'-s -ic:\nasmlib'没什么两样,但是
'!-dNAME="my name"就会正常工作了。

这个环境变量以前叫做'NASM',从版本0.98.32以后开始叫这个名字。

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

第三章 NASM语言

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -