本文简单介绍了汇编语言的历史,一个流行的开源汇编软件 NASM,和安装与文本编译器 NotePad++ 的方法。使用 NotePad 写了一个简单的汇编程序,并使用随书工具 HexView 查看。
汇编语言简介
在前面的章节里,我们讲到了处理器,也讲了处理器是如何进行算术逻辑运算的。为了实现自动计算,处理器必须从内存中取得指令,并执行这些指令。
指令和被指令引用的数据在内存中都是一些或高或低的电平,每一个电平都可以看成是一个二进制位(0 或者 1), 8 个二进制位形成一字节。
要解读内存中的东西,最好的办法就是将它们按字节转换成数字的形式。比如,下面这些数字就是存放在内存中的 8086 指令,我们用的是十六进制:
B8 3F 00 01 C3 01 C1
即使是很有经验的技术人员,要想用这种方式来编写指令,也是很困难的,而且很容易出错。所以,在第一个处理器诞生之后不久,如何使指令的编写变得更容易,就提上了日程。
为了克服机器指令难以书写和理解的缺点,人们想到可以用一些容易理解和记忆的符号,也就是助记符,来描述指令的功能和操作数的类型,这就产生了汇编语言(Assembly Language)。这样,上面那些指令就可以写成:
mov ax,3FH
add bx,ax
add cx,ax
对于第一句语句, mov 是 move 的简化形式,意思是“移动”或者“传送”。“ax”,很明显,指的就是 AX 寄存器。传送指令需要两个操作数,分别是目的操作数和源操作数,它们之间要用逗号隔开。在这里, AX 是目的操作数,源操作数是 3FH。
对于第二句语句,add 的意思是把一个数和另一个数相加。在这里,是把 BX 寄存器的内容和 AX 寄存器的内容相加。相加的结果在 BX 中,但 AX 的内容并不改变。
有了汇编语言所提供的符号,这只是方便了你自己。相反地,对人类来说通俗易懂的东西,处理器是无法识别的。所以,还需要将汇编语言源程序转换成机器指令,这个过程叫做编译(Compile)。
从字处理器软件生成的是汇编语言源程序文件。编译软件的任务是读取这些文件,将那些符号转变成二进制形式的机器指令代码。它把这些机器代码存放到另一个文件中,叫做二进制文件或者可执行文件,比如 Windows 里以“.exe”为扩展名的文件,就是可执行文件。当需要用处理器执行的时候,再加载到内存里。
NASM 编译器
现存的汇编语言编译器有多种,用得比较多的有 MASM、 FASM、 TASM、 AS86、 GASM等,每种汇编器都有自己的特色和局限性。特别是,有些还需要付费才能使用。不同于前面所列举的这些,在本书中,我们用的是另一款叫做 NASM 的汇编语言编译器。
NASM 的全称是 Netwide Assembler,它是可免费使用的开源软件。下面是它的下载地址 http://sourceforge.net/projects/nasm/files/。
下载第三方的文本编辑工具
本文选择使用 NotePas++ 作为文本编辑工具。最新下载链接如下:https://notepad-plus-plus.org/downloads/v7.8.5/。
下载之后,可以通过配置快捷键,将使用 NASM 进行编译用命令行的方式固定下来。在菜单上选择“运行(R)”->“运行(R)”。
在弹出的窗口内,输入:cmd /k pushd "$(CURRENT_DIRECTORY)" & D:ACERFILESOLDEPROGFILESNASMnasm.exe -f bin "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT 。其中,“D:ACERFILESOLDEPROGFILESNASMnasm.exe”应该改成你自己机器上实际的NASM安装路径。
点击“保存”,然后为这个运行命令起一个名字并分配一个快捷键,这样你下次就可以直接快速执行编译过程。
测试的汇编程序如下:

编译之后,得到 bin 格式的文件。可使用随书代码中的 HexView,查看十六进制格式的机器码,下载链接如下: http://www.lizhongc.com/x86asm/serv.asp 。
编译之后的文件只有 7 个字节,这才是处理器可以识别并执行的机器指令。

本文介绍了汇编语言的历史,重点讲解如何将二进制机器码转换成汇编指令。通过开源汇编软件NASM和文本编辑器NotePad++的使用方法,演示了汇编程序的编写和编译过程,帮助读者理解汇编语言与机器码之间的转换。

1万+

被折叠的 条评论
为什么被折叠?



