Nasm中文手册.doc

上传人:hw****26 文档编号:3552215 上传时间:2019-06-04 格式:DOC 页数:110 大小:595.50KB
下载 相关 举报
Nasm中文手册.doc_第1页
第1页 / 共110页
Nasm中文手册.doc_第2页
第2页 / 共110页
Nasm中文手册.doc_第3页
第3页 / 共110页
Nasm中文手册.doc_第4页
第4页 / 共110页
Nasm中文手册.doc_第5页
第5页 / 共110页
点击查看更多>>
资源描述

1、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,我忘了),从本质

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

3、SM不是很好,并且相当贵,还且只能运行在 DOS 下。(*) TASM好一些,但却极入与 MASM 保持兼容,这就意味着无数的伪操作码和繁琐的约定,并且它的语法本质上就是 MASM 的,伴随着的就是一些自相矛盾和奇怪的东西。它也是相当贵的,并且只能运行在 DOS 下。所以,只有 NASM 才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它能够超越所有的这些汇编器。但请您发给我们 bug 报告,修正意见,和其他有用的信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的人们),我们还会不断地改进它。1.1.2 许可条件请阅读作为 NASM 发布的一部分的文件Licence

4、,只有在该许可条件下你才可以使用 NASM。1.2 联系信息当前版本的 NASM(0.98.08)由一个开发小组在维护,你可以从 nasm-devel邮件列表中得到(看下面的链接),如果你想要报告 bug,请先阅读 10.2 节NASM 有一个主页:http:/www.web-sites.co.uk/nasm ,更多的信息还可以在http:/ email:julesdsf.org.uk和和他们联系,但后来的开发小组并不在其中。最新的 NASM 发布被上传至官方网站http:/www.web-sites.co.uk/nasm和ftp.kernel.org,ibiblio.org公告被发布至com

5、p.lang.asm.x86, alt.lang.asm 和comp.os.linux.announce如果你想了解 NASM beta 版的发布,和当前的开发状态,请通过在http:/ andhttp:/ Sourceforge 上的列表是较好的一个列表,它也是最新 nasm 源代码与发布的一个网站,另外的列表也是公开的,但有可能不会被继续长期支持。1.3 安装1.3.1 在 dos 和 Windows 下安装 NASM如果你拿到了 NASM 的 DOS 安装包,nasmXXX.zip(这里.XXX表示该安装包的 NASM 版本号),把它解压到它自己的目录下( 比如:c:nasm)该包中会包

6、含有四个可执行文件: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 版本的,你可能希望把文件名改成na

7、sm.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,s

8、tandard.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.xxNASM 是一个自动配置的安装包: 一旦你解压了它,cd到它的目录下,输入./configuer,该脚本会找到最好的 C 编译器来构造 NASM,并据此建

9、立 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 在自动配置的时候失败了,你还是

10、可以使用文件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.asm汇编成纯二进制格式的文件。想要以十六进制代码的形式产生列表文件输出,并让代码显示在源代码的左侧,使用-l

11、选项并给出列表文件名,比如: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, 如果系统输

12、入类似下面的信息:nasm: Linux/i386 demand-paged executable (QMAGIC)或者与此相似的,你的系统是a.out的,那你应该使用-f aout(Linux 的a.out系统很久以前就过时了,现在已非常少见。)就像其他的 Unix 编译器与汇编器,NASM 在碰到错误以前是不输出任何信息的,所以除了出错信息你看不到任何其他信息。2.1.1 -o选项:指定输出文件的文件名。NASM 会为你的输出文件选择一个文件名;具体如何做取决于目标文件的格式,对于微软的目标文件格式(obj和win32),它会去掉你的源文件名的.asm扩展名(或者其他任何你喜欢使用的扩展名

13、,NASM 并不关心具体是什么) ,并替换上obj。对于 Unix 的目标文件格式 (aout,coff,elf和as86) 它会替换成.o, 对于rdf,它会使用 .rdf,还有为bin格式,它会简单地去掉扩展名,所以myfile.asm会产生的一个输出文件myfile。如果输出文件已经存在,NASM 会覆盖它,除非它的文件名与输入文件同名,在这种情况下,它会给出一个警告信息,并使用nasm.out作为输出文件的文件名。在某些情况下,上述行为是不能接受的,所以,NASM 提供了-o选项,它能让你指定你的输出文件的文件名,你使用-o后面紧跟你为输出文件取的名字,中间可以加空格也可以不加。比如:

14、nasm -f bin program.asm -o nasm -f bin driver.asm -odriver.sys请注意这是一个小写的 o,跟大写字母 O 是不同的,大写的是用来指定需要传递的选项的数目,请参阅 2.1.152.1.2 -f选项:指定输出文件的格式。如果你没有对 NASM 使用-f 选项,它会自己为你选择一个输出文件格式。在发布的NASM 版本中,缺省的输出格式总是bin;如果你自己编译你的 NASM,你可以在编译的时候重定义OF_DEFAULT来选择你需要的缺省格式。就象-o,-f与输出文件格式之间的空格也是可选的,所以-f elf和-felf都是合法的。所有可使用

15、的输出文件格式的列表可以通过运行命令nasm -hf得到。2.1.3 -l 选项: 产生列表文件如果你对 NASM 使用了-l选项,后面跟一个文件名,NASM 会为你产生一个源文件的列表文件,在里面,地址和产生的代码列在左边,实际的源代码(包括宏扩展,除了那些指定不需要在列表中扩展的宏,参阅 4.3.9)列在右边,比如:nasm -f elf myfile.asm -l myfile.lst2.1.4 -M选项: 产生 Makefile 依赖关系.该选项可以用来向标准输出产生 makefile 依赖关系,可以把这些信息重定向到一个文件中以待进一步处理,比如:NASM -M myfile.asm

16、 myfile.dep2.1.5 -F选项: 选择一个调试格式该选项可以用来为输出文件选择一个调试格式,语法跟-f 选项相册,唯一不同的是它产生的输出文件是调试格式的。一个具体文件格式的完整的可使用调试文件格式的列表可通过命令nasm -f -y来得到。这个选项在缺省状态下没有被构建时 NASM。如何使用该选项的信息请参阅 6.102.1.6 -g 选项 :使调试信息有效。该选项可用来在指定格式的输出文件中产生调试信息。更多的信息请参阅 2.1.52.1.7 -E 选项 : 把错误信息输入到文件。在MS-DOS下,尽管有办法,但要把程序的标准错误输出重定向到一个文件还是非常困难的。因为 NAS

17、M 常把它的警告和错误信息输出到标准错误设备,这将导致你在文本编辑器里面很难捕捉到它们。因此 NASM 提供了一个-E选项,带有一个文件名参数,它可以把错误信息输出到指定的文件而不是标准错误设备。所以你可以输入下面这样的命令来把错误重定向到文件:nasm -E myfile.err -f obj myfile.asm2.1.8 -s 选项: 把错误信息输出到stdout-s选项可以把错误信息重定向到stdout 而不是stderr,它可以在MS-DOS下进行重定向。想要在汇编文件myfile.asm时把它的输出用管道输出给 more程序,可以这样:nasm -s -f obj myfile.a

18、sm | more请参考 2.1.7 的-E选项.2.1.9 -i选项: 包含文件搜索路径当 NASM 在源文件中看到%include 操作符时( 参阅 4.6),它不仅仅会在当前目录下搜索给出的文件,还会搜索-i选项在命令行中指定的所有路径。所以你可以从宏定义库中包含进一个文件,比如,输入:nasm -ic:macrolib -f obj myfile.asm(通常,在 -i与路径名之间的空格是允许的,并且可选的。)NASM 更多的关注源代码级上的完全可移植性,所以并不理解正运行的操作系统对文件的命名习惯;你提供给-i作为参数的的字符串会被一字不差地加在包含文件的文件名前。所以,上例中最后面

19、的一个反斜杠是必要的,在 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.a

20、sm -p myinc.inc跟在源文件开头写上%include “myinc.inc“ 然后运行nasm myfile.asm 是等效的。为和-I,-D,-U选项操持一致性,该选项也可以被写成 -P2.1.11 -d选项 : 预定义一个宏。就像-p选项给出了在文件头放置%include的另一种实现,-d选项给出了在文件中写%define的另一种实现,你可以写:nasm myfile.asm -dFOO=100作为在文件中写下面一行语句的一种替代实现:%define FOO 100在文件的开始,你可以取消一个宏定义,同样,选项-dFOO等同于代码%define FOO。这种形式的操作符在选择编

21、译时操作中非常有用,它们可以用%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 允许预处理器独立运

22、行。使用-e选项( 不需要参数)会导致 NASM 预处理输入文件,展开所有的宏,去掉所有的注释和预处理操作符,然后把结果文件打印在标准输出上(如果-o选项也被指定的话,会被存入一个文件) 。该选项不能被用在那些需要预处理器去计算与符号相关的表达式的程序中,所以如下面的代码:%assign tablesize ($-tablestart)会在仅预处理模式中会出错。2.1.14 -a 选项: 不需要预处理。如果 NASM 被用作编译器的后台,那么假设编译器已经作完了预处理,并禁止 NASM的预处理功能显然是可以节约时间,加快编译速度。-a选项(不需要参数),会让 NASM 把它强大的预处理器换成另

23、一个什么也不做的预处理器。2.1.15 -On选项: 指定多遍优化。NASM 在缺省状态下是一个两遍的汇编器。这意味着如果你有一个复杂的源文件需要多于两遍的汇编。你必须告诉它。使用-O选项,你可以告诉 NASM 执行多遍汇编。语法如下:(*)-O0严格执行两遍优化,JMP 和 Jcc 的处理和 0.98 版类似,除了向后跳的 JMP 是短跳转,如果可能,立即数在它们的短格式没有被指定的情况下使用长格式。(*)-O1严格执行两遍优化,但前向分支被汇编成保证能够到达的代码;可能产生比-O0更大的代码,但在分支中的偏移地址没有指定的情况下汇编成功的机率更大,(*)-On 多编优化,最小化分支的偏移,

24、最小化带符号的立即数,当 strict关键字没有用的时候重载指定的大小(参阅 3.7),如果 2=n=3,会有 5*n 遍,而不是 n 遍。注意这是一个大写的 O,和小写的 o 是不同的,小写的 o 是指定输出文件的格式,可参阅2.1.12.1.16 -t选项: 使用 TASM 兼容模式。NASM 有一个与 Borlands 的 TASM 之间的受限的兼容格式。如果使用了 NASM 的-t选项,就会产生下列变化:(*)本地符号的前缀由.改为(*)TASM 风格的以开头的应答文件可以由命令行指定。这和 NASM 支持的-resp风格是不同的。(*)扩号中的尺寸替换被支持。在 TASM 兼容模式中

25、,方括号中的尺寸替换改变了操作数的尺寸大小,方括号不再支持 NASM 语法的操作数地址。比如,mov eax,DWORD VAL在 TASM 兼容语法中是合法的。但注意你失去了为指令替换缺省地址类型的能力。(*)%arg预处理操作符被支持,它同 TASM 的 ARG 操作符相似。(*) %local预处理操作符。(*) %stacksize预处理操作符。(*) 某些操作符的无前缀形式被支持。 (arg, elif,else, endif, if,ifdef, ifdifi, ifndef, include,local)(*) 还有很多.需要更多的关于操作符的信息,请参阅 4.9 的 TASM

26、兼容预处理操作符指令。2.1.17 -w选项: 使汇编警告信息有效或无效。NASM 可以在汇编过程中监视很多的情况,其中很多是值得反馈给用户的,但这些情况还不足以构成严重错误以使 NASM 停止产生输出文件。这些情况被以类似错误的形式报告给用户,但在报告信息的前面加上warning 字样。警告信息不会阻止 NASM 产生输出文件并向操作系统返回成功信息。有些情况甚至还要宽松:他们仅仅是一些值得提供给用户的信息。所以,NASM 支持-w命令行选项。它以使特定类型的汇编警告信息输出有效或无效。这样的警告类型是以命名来描述的,比如,orphan-labels,你可以以下列的命令行选项让此类警告信息得

27、以输出:-w+orphan-labels,或者以-w-orphan-labels让此类信息不能输出。可禁止的警告信息类型有下列一些:(*)macro-params包括以错误的参数个数调用多行的宏定义的警告。这类警告信息缺省情况下是输出的,至于为什么你可能需要禁止它,请参阅 4.3.1。(*)orphan-labels包含源文件行中没有指令却定义了一个没有结尾分号的 label 的警告。缺省状况下,NASM 不输出此类警告。如果你需要它,请参阅 3.1 的例子。(*) number-overflow包含那些数值常数不符合 32 位格式警告信息(比如,你很容易打了很多的 F,错误产生了0x7fff

28、ffffffff) 。这种警告信息缺省状况下是打开的。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 以后开始叫这个名字。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。