wufu

nasm使用简易教程

 

Nasm中文手册
  
--------------------------------------------------------------------------------
第一章: 简介
-----------------------
  1.1 什么是NASM
      NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和\'\'NetBSD/FreeBSD\'\',\'\'a.out\'\',\'\'ELF\'\',\'\'COFF\'\',微软16位的\'\'OBJ\'\'和\'\'Win32\'\'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。它持\'\'Pentium\'\',\'\'P6\'\',\'\'MMX\'\',\'\'3DNow!\'\',

 \'\'SSE\'\' and \'\'SSE2\'\'指令集。
     
      1.1.1 为什么还需要一个汇编器?
      NASM当初被设计出来的想法是\'\'comp.lang.asm.x86\'\'(或者可能是\'\'alt.lang.asm\'\' ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用,所以,必须有人来写一个。      

      (*)\'\'a86\'\'不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你付费,它只使用在dos上。 (*) \'\'gas\'\'是免费的,而且在dos下和unix下都可以使用,但是它是作为\'\'gcc\'\'的一个后台而设计的,并不是很好,\'\'gcc\'\'一直就提供给它绝对正确的代码,所以它的错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲,它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) \'\'as86\'\'是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 

       (*) \'\'MASM\'\'不是很好,并且相当贵,还且只能运行在DOS下。 (*) \'\'TASM\'\'好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的东西。它也是相当贵的,并且只能运行在DOS下。

      所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望能够超越所有的这些汇编器。但请您发给我们bug报告,修正意见,和其他有用的信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的人们),我们还会不断地改进它。

      1.1.2 许可条件
      请阅读作为NASM发布的一部分的文件\'\'Licence\'\',只有在该许可条件下你才可以使用NASM。

  1.2 联系信息
当前版本的NASM(0.98.08)由一个开发小组在维护,你可以从\'\'nasm-devel\'\'邮件列表中得到(看下面的链接),如果你想要报告bug,请先阅读10.2节     

NASM有一个主页:\'\'http://www.web-sites.co.uk/nasm\'\',更多的信息还可以在“http://nasm.2y.net/\'\'上获取。     

      最初的作者你可以通过email:`jules@dsf.org.uk\'\'和`anakin@pobox.com\'\'和他们联系,但后来的开发小组并不在其中。最新的NASM发布被上传至官方网站`http://www.web-sites.co.uk/nasm\'\'和`ftp.kernel.org\'\',`ibiblio.org\'\'公告被发布至`comp.lang.asm.x86\'\', `alt.lang.asm\'\' 和`comp.os.linux.announce\'\'

如果你想了解NASM beta版的发布,和当前的开发状态,请通过在

      `http://groups.yahoo.com/group/nasm-devel\'\',      `http://www.pairlist.net/mailman/listinfo/nasm-devel\'\' and

      `http://sourceforge.net/projects/nasm\'\'
     注册来捐助\'\'nasm-devel\'\'邮件列表。
    在网站Sourceforge上的列表是较好的一个列表,它也是最新nasm源代码与发布的一个网站,另外的列表也是公开的,但有可能不会被继续长期支持。

  1.3 安装
  1.3.1 在dos和Windows下安装NASM
      如果你拿到了NASM的DOS安装包,\'\'nasmXXX.zip\'\'(这里.\'\'XXX\'\'表示该安装包的NASM版本号),把它解压到它自己的目录下(比如:‘c:\asm\'\')该包中会包含有四个可执行文件:NASM可拟行文件\'\'nasm.exe\'\'和\'\'nasmw.exe\'\',还有NDISASM可执行文件\'\'ndisasm.exe\'\'和\'\'ndisasmw.exe\'\'。文件名以\'\'w\'\'结尾的是\'\'Win32\'\'可执行格式。是运行在\'\'Windows 95\'\'或\'\'Windows NT\'\'的Intel处理器上的,另外的是16位的\'\'DOS\'\'可执行文件。NASM运行时需要的唯一文件就是它自己的可执行文件,所以可以拷贝\'\'nasm.exe\'\'和\'\'nasmw.exe\'\'的其中一个到你自己的路径下,或者可以编写一个\'\'autoexec.bat\'\'把nasm的路径加到你的\'\'PATH\'\'环境变量中去。(如果你只安装了Win32版本的,你可能希望把文件名改成\'\'nasm.exe\'\'。)就这样,NASM装好了。你不需要为了运行nasm而让\'\'nasm\'\'目录一直存在(除非你把它加到了你的\'\'PATH\'\'中,所以如果你需要节省空间,你可删掉它,但是,你可能需要保留文档或测试程序。
   
    如果你下载了DOS版的源码包,\'\'nasmXXXs.zip\'\',那\'\'nasm\'\'目录还会包含完整的NASM源代码,你可以选择一个Makefiles来重新构造你的NASM版本。注意源文件`insnsa.c\'\', `insnsd.c\'\', `insnsi.h\'\'和`insnsn.c\'\'是由\'\'standard.mac\'\'中的指令自动生成的,尽管NASM0.98发布版中包含了这些产生的文件,你如果改动了insns.dat,standard.mac或者文件,可能需要重新构造他们,在将来的源码发布中有可能将不再包含这些文件,多平台兼容的Perl可以从www.cpan.org上得到。
  1.3.2 在unix下安装NASM
      如果你得到了Unix下的NASM源码包\'\'nasm-x.xx.tar.gz\'\'(这里x.xx表示该源码包中的nasm的版本号),把它解压压到一个目录,比如\'\'/usr/local/src\'\'。包被解压后会创建自己的子目录\'\'nasm-x.xx\'\'NASM是一个自动配置的安装包:一旦你解压了它,\'\'cd\'\'到它的目录下,输入\'\'./configuer\'\',该脚本会找到最好的C编译器来构造NASM,并据此建立Makefiles。一旦NASM被自动配置好后,你可以输入\'\'make\'\'来构造\'\'nasm\'\'和\'\'ndisasm\'\'二进制文件,然后输入\'\'make install\'\'把它们安装到\'\'/usr/local/bin\'\',并把man页安装到\'\'/usr/local/man/man1\'\'下的\'\'nasm.1和\'\'ndisasm.1\'\'或者你可以给配置脚本一个\'\'--prefix\'\'选项来指定安装目录,或者也可以自己来安装。
      NASM还附带一套处理\'\'RDOFF\'\'目标文件格式的实用程序,它们在\'\'rdoff\'\'子目录下,你可以用\'\'make rdf\'\'来构造它们,并使用\'\'make rdf_install\'\'来安装。如果你需要的话。
      如果NASM在自动配置的时候失败了,你还是可以使用文件\'\'Makefile.unx\'\'来编译它们,把这个文件改名为\'\'Makefile\'\',然后输入\'\'make\'\'。在\'\'rdoff\'\'子目录下同样有一个Makefile.unx文件。
第二章 运行NASM
-----------------------
  
2.1 NASM命令行语法
要汇编一个文件,你可以以下面的格式执行一个命令:      nasm -f   [-o ]
比如,                                                                                       

      nasm -f elf myfile.asm         会把文件\'\'myfile.asm\'\'汇编成\'\'ELF\'\'格式 的文件\'\'myfile.o\'\'.还有:         

      nasm -f bin myfile.asm -o myfile.com        会把文件\'\'myfile.asm\'\'汇编成纯二进制格式的文件\'\'myfile.com\'\'。

      想要以十六进制代码的形式产生列表文件输出,并让代码显示在源代码的左侧,使用\'\'-l\'\'选项并给出列表文件名,比如:

      nasm -f coff myfile.asm -l myfile.lst

      想要获取更多的关于NASM的使用信息,请输入:
      nasm -h

      它同时还会输出可以使用的输出文件格式,如果你使用Linux并且不清楚你的系统是\'\'a.out\'\'还是\'\'ELF\'\',请输入:      file nasm
(在nasm二进制文件的安装目录下使用),如果系统输出类似下面的信息:     

     nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1

那么你的系统就是\'\'ELF\'\'格式的,然后你就应该在产生Linux目标文件时使用选项\'\'-f elf\'\',如果系统输入类似下面的信息:

     nasm: Linux/i386 demand-paged executable (QMAGIC)

或者与此相似的,你的系统是\'\'a.out\'\'的,那你应该使用\'\'-f aout\'\'(Linux的\'\'a.out\'\'系统很久以前就过时了,现在已非常少见。)
     
就像其他的Unix编译器与汇编器,NASM在碰到错误以前是不输出任何信息的,所以除了出错信息你看不到任何其他信息。

 2.1.1 \'\'-o\'\'选项:指定输出文件的文件名。

  NASM会为你的输出文件选择一个文件名;具体如何做取决于目标文件的格式,对于微软的目标文件格式(\'\'obj\'\'和\'\'win32\'\'),它会去掉你的源文件名的\'\'.asm\'\'扩展
名(或者其他任何你喜欢使用的扩展名,NASM并不关心具体是什么),并替换上\'\'obj\'\'。对于Unix的目标文件格式(\'\'aout\'\',\'\'coff\'\',\'\'elf\'\'和\'\'as86\'\')它会替换成
\'\'.o\'\', 对于\'\'rdf\'\',它会使用\'\'.rdf\'\',还有为\'\'bin\'\'格式,它会简单地去掉扩展名,所以\'\'myfile.asm\'\'会产生的一个输出文件\'\'myfile\'\'。
      如果输出文件已经存在,NASM会覆盖它,除非它的文件名与输入文件同名,在这种情况下,它会给出一个警告信息,并使用\'\'nasm.out\'\'作为输出文件的文件名。
在某些情况下,上述行为是不能接受的,所以,NASM提供了\'\'-o\'\'选项,它能让你指定你的输出文件的文件名,你使用 \'\'-o\'\' 后面紧跟你为输出文件取的名字,中间可以加
空格也可以不加。比如:
      nasm -f bin program.asm -o program.com
  nasm -f bin driver.asm -odriver.sys
请注意这是一个小写的o,跟大写字母O是不同的,大写的是用来指定需要传递的选项的数目,请参阅2.1.15

 2.1.2 "-f\'\'选项:指定输出文件的格式。

      如果你没有对NASM使用 \'\'-f\'\' 选项,它会自己为你选择一个输出文件格式。在发布的NASM版本中,缺省的输出格式总是\'\'bin\'\';如果你自己编译你的NASM,你可以在编译的时候重定义\'\'OF_DEFAULT\'\'来选择你需要的缺省格式。
      就象\'\'-o\'\',\'\'-f\'\'与输出文件格式之间的空格也是可选的,所以 \'\'-f elf\'\'\'\'-felf\'\' 都是合法的。所有可使用的输出文件格式的列表可以通过运行命令 \'\'nasm -hf\'\' 得到。

2.1.3 "-l"选项: 产生列表文件

      如果你对NASM使用了 \'\'-l\'\' 选项,后面跟一个文件名,NASM会为你产生一个源文件的列表文件,在里面,地址和产生的代码列在左边,实际的源代码(包括宏扩展,除了那些指定不需要在列表中扩展的宏,参阅4.3.9)列在右边,比如:

      nasm -f elf myfile.asm -l myfile.lst

2.1.4 "-M\'\'选项: 产生Makefile依赖关系.

该选项可以用来向标准输出产生makefile依赖关系,可以把这些信息重定向到一个文件中以待进一步处理,比如:
     NASM -M myfile.asm > myfile.dep

2.1.5 `-F\'\'选项: 选择一个调试格式

      该选项可以用来为输出文件选择一个调试格式,语法跟-f选项相册,唯一不同的是它产生的输出文件是调试格式的。一个具体文件格式的完整的可使用调试文件格式的列表可通过命令 \'\'nasm -f  -y\'\' 来得到。这个选项在缺省状态下没有被构建时NASM。如何使用该选项的信息请参阅6.10。

 2.1.6 `-g\'\' 选项:使调试信息有效。

      该选项可用来在指定格式的输出文件中产生调试信息。更多的信息请参阅2.1.5。

2.1.7 `-E\'\' 选项: 把错误信息输入到文件。
  在\'\'MS-DOS\'\'下,尽管有办法,但要把程序的标准错误输出重定向到一个文件还是非常困难的。因为NASM常把它的警告和错误信息输出到标准错误设备,这将导致你在文本编辑器里面很难捕捉到它们。因此NASM提供了一个\'\'-E\'\'选项,带有一个文件名参数,它可以把错误信息输出到指定的文件而不是标准错误设备。所以你可以输入下面这样的命令来把错误重定向到文件:

      nasm -E myfile.err -f obj myfile.asm

2.1.8 `-s\'\' 选项: 把错误信息输出到\'\'stdout\'\'

     \'\'-s\'\'选项可以把错误信息重定向到\'\'stdout\'\'而不是\'\'stderr\'\',它可以在\'\'MS-DOS\'\'下进行重定向。想要在汇编文件\'\'myfile.asm\'\'时把它的输出用管道输出给\'\'more\'\'程序,可以这样:

   nasm -s -f obj myfile.asm | more      请参考2.1.7的\'\'-E\'\'选项.

 2.1.9 "-i\'\'选项: 包含文件搜索路径

  当NASM在源文件中看到\'\'%include\'\'操作符时(参阅4.6),它不仅仅会在当前目录下搜索给出的文件,还会搜索\'\'-i\'\'选项在命令行中指定的所有路径。所以你可以从宏定义库中包含进一个文件,比如,输入:

   nasm -i c:\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>\'\': 位移运算符。
      `>\'\'提 供位右移。在NASM中,这样的位移总是无符号的,所以位移后,左侧总是以 零填充,并不会有符号扩展。
     
声明:

     该教程摘自NASM的中文手册,感谢翻译作者的辛勤工作。

    来自网页:http://blog.chinaunix.net/uid-7874697-id-2037994.html ,感谢提供者。

分类:

技术点:

相关文章: