购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 NASM 编译器

3.2.1 NASM 的下载和安装

每种处理器都可能会有自己的汇编语言编译器,而对于同一款处理器来说,针对不同的平台(比如Windows 和Linux),也会有不同版本的汇编语言编译器。

现存的汇编语言编译器有多种,用得比较多的有MASM、FASM、TASM、AS86、GASM等,每种汇编器都有自己的特色和局限性。特别是,有些还需要付费才能使用。不同于前面所列举的这些,在本书中,我们用的是另一款叫做NASM 的汇编语言编译器。

NASM 的全称是Netwide Assembler,它是可免费使用的开源软件。下面是它的下载地址:

通过以上地址可以找到所有平台上的NASM 版本,比如为16 位和32 位DOS、LINUX、OS/2等操作系统开发的版本。因为本书的读者一般在Windows 平台上工作,所以应当使用下面的链接来直接定位到Windows 平台上的NASM 版本:

通过以上链接,可以显示所有Windows 平台上的NASM 版本,应当选择最新版本下载。这本书出版的时候,最新的NASM 版本是2.07。

本书不配光盘,所以书中的所有源代码连同我自己写的小工具都只有通过网络下载方能使用。这是一个压缩文件,名字叫booktool.zip,可以通过下面这个链接来下载它:

如果此链接不可用,可以到电子工业出版社的网站上下载,或者直接给我写信,我会以最快的时间给予支持。

3.2.2 代码的书写和编译过程

和你已经司空见惯的其他Windows 应用程序不同,NASM 在运行之后并不会显示一个图形用户界面。相反地,它只能通过命令行使用。

比如,我们可以用Windows 记事本编写一个汇编语言源程序,并把它保存到NASM 工作目录下(就是在前面安装NASM 时所用的安装文件夹),文件名为exam.asm。作为惯例,汇编语言源程序文件的扩展名是“.asm”,不过,你当然可以使用其他扩展名。

一旦有了一个源程序,下一步就是将它的内容编译成机器代码。为此,可以从Windows 开始菜单里找到“Netwide Assembler xxx”,其中的“xxx”取决于你安装的NASM 版本。然后,选择其下的“Nasm Shell”,这将打开一个命令行窗口。

接着,在命令行提示符后输入“nasm –f bin exam.asm –o exam.bin”并按Enter 键,如图3-2所示。

图3-2 在命令行方式下使用NASM 编译一个汇编源程序

NASM 需要一系列参数才能正常工作。-f 参数的作用是指定输出文件的格式(Format)。这样,-f bin 就是要求NASM 生成的文件只包含“纯二进制”的内容。换句话说,除了处理器能够识别的机器代码外,别的任何东西都不包含。这样一来,因为缺少操作系统所需要的加载和重定位信息,它就很难在Windows、DOS 和Linux 上作为一个普通的应用程序运行。不过,这正是本书所需要的。

紧接着,exam.asm 是源程序的文件名,它是将要被编译的对象。

-o 参数指定编译后输出(Output)的文件名。在这里,我们要求NASM 生成输出文件exam.bin。

用来编写汇编语言源程序,Windows 记事本并不是一个好工具。同时,在命令行编译源程序也令很多人迷糊。毕竟,很多年轻的朋友都是用着Windows 成长起来的,他们缺少在DOS 和UNIX 下工作的经历。

为了写这本书,我一直想找一个自己中意的汇编语言编辑软件。互联网是个大宝库,上面有很多这样的工具软件,但大多都包含了太多的功能,用起来自然也很复杂。我的愿望很简单,能够方便地书写汇编指令即可,同时还具有编译功能。毕竟我自己也不喜欢在命令行和图形用户界面之间来回切换。

在经历了一系列的失望之后,我决定自己写一个,于是就有了Nasmide 这个小程序,它同样位于配书文件包中。不过遗憾的是,这个小程序却并非是用汇编语言书写的。

现在,你可以双击nasmide.exe 来运行它。启动之后,如图3-3 所示,Nasmide 的软件界面分为三个部分。顶端是菜单,可以用来新建文件、打开文件、保存文件或者调用NASM 来编译当前文档。

图3-3 Nasmide 程序的基本界面

中间最大的空白区域是编辑区,用来书写汇编语言源代码。

窗口底部那个窄的区域是消息显示区。在编译当前文档时,不管是编译成功,还是发现了文档中的错误,都会显示在这里。

基本上,你现在已经可以在Nasmide 里书写汇编语句了。不过,在此之前你最好先做一件事情。Nasmide 只是一个文本编辑工具,它自己没有编译能力。不过,它可以在后台调用NASM 来编译当前文档,前提是它必须知道NASM 安装在什么地方。

为此,你需要在菜单上选择“选项”→“编译环境设置”来打开如图3-4 所示的对话框。

如图3-4 所示,这个路径就是你在前面安装NASM 时,指定的安装路径,包括可执行文件名nasm.exe。

不同于其他汇编语言编译器,NASM 最让我喜欢的一个特点是允许在源程序中只包含指令,如图3-5 所示。用过微软公司MASM 的人都知道,在真正开始书写汇编指令前,先要穿靴戴帽,在源程序中定义很多东西,比如代码段和数据段等,弄了半天,实际上连一条指令还没开始写呢。

图3-4 为Nasmide 指定NASM 编译器所在路径

图3-5 NASM 允许在源文件中只包含指令

如图3-5 所示,用Nasmide 程序编辑源程序时,它会自动在每一行内容的左边显示行号。对于初学者来说,一开始可能会误以为行号也会出现在源程序中。不要误会,行号并非源程序的一部分,当保存源程序的时候,也不会出现在文件内容中。

让Nasmide 显示行号,这是一个聪明的决定。一方面,我在书中讲解源程序时,可以说第几行到第几行是做什么用的;另一方面,当编译源程序的时候,如果发现了错误,错误信息中也会说明是第几行有错。这样,因为Nasmide 显示了行号,这就很容易快速找到出错的那一行。

在汇编源程序中,可以为每一行添加注释。注释的作用是说明某条指令或者某个符号的含义和作用。注释也是源程序的组成部分,但在编译的时候会被编译器忽略。如图3-5 所示,为了告诉编译器注释是从哪里开始的,注释需要以英文字母的分号“;”开始。

当源程序书写完毕之后,就可以进行编译了,方法是在Nasmide 中选择菜单“文件”→“编译本文档”。这时,Nasmide 将会在后台调用NASM 来完成整个编译过程,不需要你额外操心。如图3-5所示,即使只有三行的程序也能通过编译。编译完成后,会在窗口底部显示一条消息。

检测点3.1

1. 在你的计算机中启动Nasmide 程序,输入图3-10 中的三行代码,然后编译它们。看看消息显示区是否有编译成功的提示。

2. 选择填空:指令mov ax,0xf5fc 中,“mov”指示这是一条( )指令,0xf5fc 是( )。指令执行后,寄存器AX 中的内容是( )。

A.立即数 B.传送 C.0xf5fc D.加法 E.0xfcf5 F.寄存器

3.2.3 用HexView 观察编译后的机器代码

编译成功完成之后,Nasmide 会在编辑窗口的底部显示相应的消息,同时显示了源文件名称和编译之后的文件名称(含路径)。

尽管我们强调源文件和编译之后的文件具有不同的内容,但如果能用工具看一看,相信印象更为深刻。在前面下载的配书源码和工具里,有一个名为HexView 的小程序,可以实现这个愿望。HexView 用于打开任意一个文件,以十六进制的形式从头到尾显示它每个字节的内容。

双击启动HexView,然后选择菜单“文件”→“打开文件以显示”,在文件选择对话框里找到你在3.2.4 节里编辑并保存的源程序文件。

如图3-6 所示,文件选择之后,HexView 程序将以十六进制的形式显示刚刚选择的文件。

图3-6 用HexView 程序显示源程序文件的内容

在HexView 中,文件的内容以十六进制的形式显示在窗口中间,以16 个字节为一行,字节之间以空白分隔,所以看起来很稀疏。如果文件较大的话,则会分成很多行。

作为对照,每个字节还会以字符的形式显示在窗口右侧,如果它确实可显示为一个字符的话。如果该字节并非一个可以显示的字符,则显示一个替代的字符“.”。因为源程序中还有汉字注释,所以,如果细心的话,从图中可以算出每个汉字的编码是两个字节,比如“将”字的编码是0xBD 0xAB。由于HexView 以单字节的形式来显示每个字符,所以无法显示汉字。

左边的数字,是每一行第一个字节相对于文件头部的距离(偏移),也是以十六进制数显示的。字母“m”是整个源程序文件内的第1 个字符,因此,它的偏移量是00000000(H),其他字符以此类推,最后一个字符“x”的偏移量是00000048(H)。

源程序很长,但是,编译之后的机器指令却很简短。

如图3-7 所示,编译之后的文件只有7 个字节,这才是处理器可以识别并执行的机器指令。

图3-7 用HexView 显示编译之后的文件内容 dHA6YHTF0i48Om2OUUV21EyrWDpsJDWOHAFjXlFpHuL7mU9YT2jjZrHa32Vrgz3G

点击中间区域
呼出菜单
上一章
目录
下一章
×