NASM中文手册
============
第一章: 简介
1.1 什么是NASM
1.1.1 为什么还需要一个汇编器?
1.1.2 许可条件
1.2 联系信息
1.3 安装
1.3.1 在dos和Windows下安装NASM
1.3.2 在unix下安装NASM
第二章 运行NASM
2.1 NASM命令行语法
2.1.1 '-o'选项:指定输出文件的文件名。
2.1.2 `-f'选项:指定输出文件的格式。
2.1.3 `-l' 选项: 产生列表文件
2.1.4 `-M'选项: 产生Makefile依赖关系.
2.1.5 `-F'选项: 选择一个调试格式
2.1.6 `-g' 选项:使调试信息有效。
2.1.7 `-E' 选项: 把错误信息输入到文件。
2.1.8 `-s' 选项: 把错误信息输出到'stdout'
2.1.9 `-i'选项: 包含文件搜索路径
2.1.10 `-p' 选项: 预包含一个文件
2.1.11 `-d'选项: 预定义一个宏。
2.1.12 `-u' 选项: 取消一个宏定义。
2.1.13 `-e'选项: 仅预处理。
2.1.14 `-a' 选项: 不需要预处理。
2.1.15 `-On'选项: 指定多遍优化。
2.1.16 `-t'选项: 使用TASM兼容模式。
2.1.17 `-w'选项: 使汇编警告信息有效或无效。
2.1.18 `-v'选项: 打印版本信息。
2.1.19 `NASMENV'环境变量。
2.2 MASM用户速成。
2.2.1 NASM是大小写敏感的。
2.2.2 NASM需要方括号来引用内存地址。
2.2.3 NASM不存储变量的类型。
2.2.4 NASM不会 `ASSUME'
2.2.5 NASM不支持内存模型。
2.2.6 浮点处理上的不同。
2.2.7 其他不同。
第三章 NASM语言
3.1 NASM源程序行的组成。
3.2 伪指令。
3.2.1 `DB'一类的伪指令: 声明已初始化的数据。
3.2.2 `RESB'类的伪指令: 声明未初始化的数据。
3.2.3 `INCBIN':包含其他二进制文件。
3.2.4 `EQU': 定义常数。
3.2.5 `TIMES': 重复指令或数据。
3.3 有效地址
3.4 常数
3.4.1 数值常数。
3.4.2 字符型常数。
3.4.3 字符串常数。
3.4.4 浮点常量
3.5 表达式
3.5.1 `|': 位或运算符。
3.5.2 `^': 位异或运算符。
3.5.3 `&': 位与运算符。
3.5.4 `<<' and `>>': 位移运算符。
3.5.5 `+' and `-': 加与减运算符。
3.5.6 `*', `/', `//', `%'和`%%': 乘除法运算符。
3.5.7 一元运算符: `+', `-', `~'和`SEG'
3.6 `SEG'和`WRT'
3.7 `STRICT': 约束优化。
3.8 临界表达式。
3.9 本地Labels
第四章 NASM预处理器。
4.1 单行的宏。
4.1.1 最常用的方式: `%define'
4.1.2 %define的增强版: `%xdefine'
4.1.3 : 连接单行宏的符号: `%+'
4.1.4 取消宏定义: `%undef'
4.1.5 预处理器变量 : `%assign'
4.2 字符串处理宏: `%strlen' and `%substr'
4.2.1 求字符串长度: `%strlen'
4.2.2 取子字符串: `%substr'
4.3 多行宏: `%macro'
4.3.1 多行宏的重载
4.3.2 Macro-Local Labels
4.3.3 不确定的宏参数个数.
4.3.4 缺省宏参数.
4.3.5 `%0': 宏参数个数计数器.
4.3.6 `%rotate': 循环移动宏参数.
4.3.7 连结宏参数。
4.3.8 条件代码作为宏参数。
4.3.9 禁止列表扩展。
4.4 条件汇编
4.4.1 `%ifdef': 测试单行宏是否存在。
4.4.2 `ifmacro': 测试多行宏是否存在。
4.4.3 `%ifctx': 测试上下文栈。
4.4.4 `%if': 测试任意数值表达式。
4.4.5 `%ifidn' and `%ifidni': 测试文本相同。
4.4.6 `%ifid', `%ifnum', `%ifstr': 测试记号的类型。
4.4.7 `%error': 报告用户自定义错误。
4.5 预处理器循环: `%rep'
4.6 包含其它文件。
4.7 上下文栈。
4.7.1 `%push' and `%pop': 创建和删除上下文。
4.7.2 Context-Local Labels
4.7.3 Context-Local单行宏。
4.7.4 `%repl': 对一个上下文改名。
4.7.5 使用上下文栈的例子: Block IFs
4.8 标准宏。
4.8.1 `__NASM_MAJOR__', `__NASM_MINOR__', `__NASM_SUBMINOR__'和
`___NASM_PATCHLEVEL__': NASM版本宏。
4.8.2 `__NASM_VERSION_ID__': NASM版本ID。
4.8.3 `__NASM_VER__': NASM版本字符串。
4.8.4 `__FILE__' and `__LINE__': 文件名和行号。
4.8.5 `STRUC' and `ENDSTRUC': 声明一个结构体数据类型。
4.8.6 `ISTRUC', `AT' and `IEND': 声明结构体的一个实例。
4.8.7 `ALIGN' and `ALIGNB': 数据对齐
4.9 TASM兼容预处理指令。
4.9.1 `%arg'操作符
4.9.2 `%stacksize'指令。
4.9.3 `%local'指令。
4.10 其他的预处理指令。
4.10.1 `%line'操作符。
4.10.2 `%!'`<env>': 读取一个环境变量。
第五章: 汇编器指令。
5.1 `BITS': 指定目标处理器模式。
5.1.1 `USE16' & `USE32': BITS的别名。
5.2 `SECTION'或`SEGMENT': 改变和定义段。
5.2.1 宏 `__SECT__'
5.3 `ABSOLUTE': 定义绝对labels。
5.4 `EXTERN': 从其他的模块中导入符中。
5.5 `GLOBAL': 把符号导出到其他模块中。
5.6 `COMMON': 定义通用数据域。
5.7 `CPU': 定义CPU相关。
第六章: 输出文件的格式。
6.1 `bin': 纯二进制格式输出。
6.1.1 `ORG': 二进制程序的起点位置。
6.1.2 `bin'对`SECTION'操作符的扩展。
6.1.3 `Multisection' 支持BIN格式.
6.2 `obj': 微软OMF目标文件
6.2.1 `obj' 对`SEGMENT'操作符的扩展。
6.2.2 `GROUP': 定义段组。
6.2.3 `UPPERCASE': 在输出文件中使大小写敏感无效。
6.2.4 `IMPORT': 导入DLL符号。
6.2.5 `EXPORT': 导出DLL符号.
6.2.6 `..start': 定义程序的入口点.
6.2.7 `obj'对`EXTERN'操作符的扩展.
6.2.8 `obj'对`COMMON'操作符的扩展.
6.3 `win32': 微软Win32目标文件
6.3.1 `win32'对`SECTION'的扩展.
6.4 `coff': 通用目标文件格式.
6.5 `elf': 可执行可连接格式目标文件.
6.5.1 `elf'对`SECTION'操作符的扩展.
6.5.2 地址无关代码: `elf'特定的符号和 `WRT'
6.5.3 `elf'对`GLOBAL'操作符的扩展.
6.5.4 `elf'对`COMMON'操作符的扩展.
6.5.5 16位代码和ELF
6.6 `aout': Linux `a.out' 目标文件
6.7 `aoutb': NetBSD/FreeBSD/OpenBSD `a.out'目标文件.
6.8 `as86': Minix/Linux `as86'目标文件.
6.9 `rdf': 可重定位的动态目标文件格式.
6.9.1 需要一个库: `LIBRARY'操作符.
6.9.2 指定一个模块名称: `MODULE'操作符.
6.9.3 `rdf'对`GLOBAL'操作符的扩展.
6.10 `dbg': 调试格式.
第七章: 编写16位代码 (DOS, Windows 3/3.1)
7.1 产生'.EXE'文件.
7.1.1 使用'obj'格式来产生'.EXE'文件.
7.1.2 使用’bin'格式来产生`.EXE'文件。
7.2 产生`.COM'文件
7.2.1 使用`bin'格式产生`.COM’文件。
7.2.2 使用`obj'格式产生`.COM'文件
7.3 产生`.SYS'文件
7.4 与16位C程序之间的接口。
7.4.1 外部符号名。
7.4.2 内存模式。
7.4.3 函数定义和函数调用。
7.4.4 存取数据元素。
7.4.5 `c16.mac': 与16位C接口的帮助宏。
第八章: 编写32位代码(Unix, Win32, DJGPP)
8.1 与32位C代码之间的接口。
8.1.1 外部符号名。
8.1.2 函数定义和函数调用。
8.1.3 获取数据元素。
8.1.4 `c32.mac': 与32位C接口的帮助宏。
8.2 编写NetBSD/FreeBSD/OpenBSD和Linux/ELF共享库
8.2.1 取得GOT中的地址。
8.2.2 寻址你的本地数据元素。
8.2.3 寻址外部和通用数据元素.
8.2.4 把符号导出给库用户.
8.2.5 从库外调用过程.
8.2.6 产生库文件.
第九章: 混合16位与32位代码
9.1 混合Size的跳转.
9.2 在不同size的段间寻址.
9.3 其他的混合size指令.
第十章: 答疑
10.1 普遍性的问题.
10.1.1 NASM产生了低效的代码.
10.1.2 我的jump指令超出范围.
10.1.3 `ORG'不正常工作.
10.1.4 `TIMES'不正常工作.
10.2 Bugs
附录A: Ndisasm
A.1 简介
A.2 开始: 安装.
A.3 运行NDISASM
A.3.1 COM文件: 指定起点地址.
A.3.2 代码前有数据: 同步.
A.3.3 代码和数据混合: 自动(智能)同步.
A.3.4 其他选项.
A.4 Bug和改进.
第一章: 简介
-----------------------
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:\nasm')
该包中会包含有四个可执行文件: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 <format> <filename> [-o <output>]
比如,
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 <format> -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 -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是短跳
转,如果可能,立即数在它们的短格式没有被指定的情况下使用长格式。
分享到:
相关推荐
NASM(Netwide Assembler)是一个流行的开源汇编器,主要用于编写x86架构的汇编语言程序。NASM的设计目标是提供高度的可移植性和模块化功能,支持多种目标文件格式,包括但不限于Linux下的ELF格式、NetBSD/FreeBSD下...
### NASM中文手册知识点概述 #### 一、NASM简介 **1.1 什么是NASM** NASM(Network Assembler)是一款专为可移植性和模块化设计的80x86汇编器。它支持多种目标文件格式,如Linux、NetBSD/FreeBSD、a.out、ELF、...
### Nasm中文手册知识点概述 #### 一、NASM简介 **1.1 什么是NASM** NASM(Network Assembler)是一款专为可移植性和模块化设计的80x86汇编器。它支持多种目标文件格式,如Linux、NetBSD/FreeBSD、a.out、ELF、...
通过这份详尽的NASM中文手册,无论是为了深入理解计算机底层运作,还是为了进行系统级编程或优化,读者都能找到所需的知识和指导。无论是初学者还是资深开发者,都应该充分利用这份资源,提升自己的汇编技能。
通过阅读和实践《nasm中文手册》,读者将能够熟练掌握汇编语言,编写高效、低级别的代码,这对于系统编程、驱动开发、性能优化等领域都有重要的应用价值。无论是为了学术研究,还是职业发展,深入理解并掌握NASM都是...
本压缩包“Nasm中文手册_和英文手册_两本_[Ch][En].zip”包含两份重要的学习资源:《NASM中文手册》和《nasmdoc.pdf》,后者是NASM的官方英文文档。这两份文档对于理解和掌握NASM汇编语言至关重要,无论你是初学者...
### Nasm中文手册知识点概述 #### 一、Nasm简介 **Nasm**(Netwide Assembler)是一款高性能的汇编器,适用于多种操作系统环境,包括但不限于Linux、NetBSD、FreeBSD等。它支持多种输出格式,如'a.out'、'ELF'、'...
在《NASM中文手册》中,读者可以深入学习汇编语言的基础知识,包括: 1. **基本概念**:了解什么是汇编语言,它与高级语言的区别,以及为什么在某些情况下需要使用汇编。 2. **NASM语法**:详述NASM的指令集,包括...
### NASM 中文手册知识点概览 #### 1.1 什么是 NASM - **定义**: NASM(Network Assembler)是一种专为可移植性和模块化设计的80x86汇编器。 - **目标文件格式支持**: - Linux 和 NetBSD/FreeBSD 的 `a.out`, `...
Nasm 中文 手册 PDF 格式 我用起来挺不错的
NASM的中文手册详细介绍了它的特点、安装方法以及使用指南,是学习和使用NASM的宝贵资源。手册不仅提供了技术细节,还阐述了NASM的设计哲学和社区支持的重要性。通过手册的学习,用户可以更好地理解NASM的架构和功能...
1.1 什么是NASM NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。 它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出纯二...
**NASM汇编语言简介** ...本手册详细涵盖了这些主题,并以中文形式解释,使中文读者能够轻松学习和掌握NASM汇编语言。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅,提升自己的汇编技能。
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得...
### NASM中文手册知识点概述 #### 一、NASM简介 **1.1 什么是NASM** NASM(Network Assembly Syscall Mnemonics)是一种专为可移植性和模块化设计的80x86汇编器。其目标是提供一个简洁易懂的汇编语言,与Intel...