NASM中文手册第一章:简介1.1什么是NASMNASM是一个为可移植性与模块化而设计的一个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有一个主页:‘,更多的信息还可以在'上获取。最初的作者你可以通过email:'jules@dsf.org.uk'和'anakin@pobox.com'和他们联系,但后来的开发小组并不在其中。最新的NASM发布被上传至官方网站'和’ftp.kernel.org','ibiblio.org'公告被发布至'comp.lang.asm.x86','alt.lang.asm'和'comp.os.linux.announce'如果你想了解NASMbeta版的发布,和当前的开发状态,请通过在'''注册来捐助'nasm-devel'邮件列表。在网站Sourceforge上的列表是较好的一个列表,它也是最新nasm源代码与发布的一个网站,另外的列表也是公开的,但有可能不会被继续长期支持。1.3安装1.3.1在dos和Windows下安装NASM如果你拿到了NASM的DOS安装包,'nasmXXX.zip'(这里.'XXX'表示该安装包的NASM版本号),把它解压到它自己的目录下(比如:‘c:\nasm')该包中会包含有四个可执行文件:NASM可拟行文件'nasm.exe'和'nasmw.exe',还有NDISASM可执行文件'ndisasm.exe'和'ndisasmw.exe'。文件名以'w'结尾的是'Win32'可执行格式。是运行在'Windows95'或'WindowsNT'的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可以从上得到。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'二进制文件,然后输入'makeinstall'把它们安装到'/usr/local/bin',并把man页安装到'/usr/local/man/man1'下的'nasm.1和'ndisasm.1'或者你可以给配置脚本一个'--prefix'选项来指定安装目录,或者也可以自己来安装。NASM还附带一套处理'RDOFF'目标文件格式的实用程序,它们在'rdoff'子目录下,你可以用'makerdf'来构造它们,并使用'makerdf_install'来安装。如果你需要的话。如果NASM在自动配置的时候失败了,你还是可以使用文件'Makefile.unx'来编译它们,把这个文件改名为'Makefile',然后输入'make'。在'rdoff'子目录下同样有一个Makefile.unx文件。第二章运行NASM2.1NASM命令行语法要汇编一个文件,你可以以下面的格式执行一个命令:nasm-fformatfilename[-ooutput]比如,nasm-felfmyfile.asm会把文件'myfile.asm'汇编成'ELF'格式的文件'myfile.o'.还有:nasm-fbinmyfile.asm-omyfile.com会把文件'myfile.asm'汇编成纯二进制格式的文件'myfile.com'。想要以十六进制代码的形式产生列表文件输出,并让代码显示在源代码的左侧,使用'-l'选项并给出列表文件名,比如:nasm-fcoffmyfile.asm-lmyfile.lst想要获取更多的关于NASM的使用信息,请输入:nasm-h它同时还会输出可以使用的输出文件格式,如果你使用Linux并且不清楚你的系统是'a.out'还是'ELF',请输入:filenasm(在nasm二进制文件的安装目录下使用),如果系统输出类似下面的信息:nasm:ELF32-bitLSBexecutablei386(386andup)Version1那么你的系统就是'ELF'格式的,然后你就应该在产生Linux目标文件时使用选项'-felf',如果系统输入类似下面的信息:nasm:Linux/i386demand-pagedexecutable(QMAGIC)或者与此相似的,你的系统是'a.out'的,那你应该使用'-faout'(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-fbinprogram.asm-oprogram.comnasm-fbindriver.asm-odriver.sys请注意这是一个小写的o,跟大写字母O是不同的,大写的是用来指定需要传递的选项的数目,请参阅2.1.152.1.2`-f'选项:指定输出文件的格式。如果你没有对NASM使用'-f'选项,它会自己为你选择一个输出文件格式。在发布的NASM版本中,缺省的输出格式总是'bin';如果你自己编译你的NASM,你可以在编译的时候重定义'OF_DEFAULT'来选择你需要的缺省格式。就象'-o','-f'与输出文件格式之间的空格也是可选的,所以'-felf'和'-felf'都是合法的。所有可使用的输出文件格式的列表可以通过运行命令'nasm-hf'得到。2.1.3`-l'选项:产生列表文件如果你对NASM使用了'-l'选项,后面跟一个文件名,NASM会为你产生一个源文件的列表文件,在里面,地址和产生的代码列在左边,实际的源代码(包括宏扩展,除了那些指定不需要在列表中扩展的宏,参阅4.3.9)列在右边,比如:nasm-felfmyfile.asm-lmyfile.lst2.1.4`-M'选项:产生Makefile依赖关系.该选项可以用来向标准输出产生makefile依赖关系,可以把这些信息重定向到一个文件中以待进一步处理,比如:NASM-Mmyfile.asmmyfile.dep2.1.5`-F'选项:选择一个调试格式该选项可以用来为输出文件选择一个调试格式,语法跟-f选项相册,唯一不同的是它产生的输出文件是调试格式的。一个具体文件格式的完整的可使用调试文件格式的列表可通过命令'nasm-fformat-y'来得到。这个选项在缺省状态下没有被构建时NASM。如何使用该选项的信息请参阅6.102.1.6`-g'选项:使调试信息有效。该选项可用来在指定格式的输出文件中产生调试信息。更多的信息请参阅2.1.52.1.7`-E'选项:把错误信息输入到文件。在'MS-DOS'下,尽管有办法,