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

3.1 汇编语言简介

在前面的章节里,我们讲到了处理器,也讲了处理器是如何进行算术逻辑运算的。为了实现自动计算,处理器必须从内存中取得指令,并执行这些指令。

指令和被指令引用的数据在内存中都是一些或高或低的电平,每一个电平都可以看成是一个二进制位(0 或者1),8 个二进制位形成一字节。

要解读内存中的东西,最好的办法就是将它们按字节转换成数字的形式。比如,下面这些数字就是存放在内存中的INTEL8086 指令,我们用的是十六进制:

对于大多数人来说,他们很难想象上面那一排数字对应着下面几条8086 指令:

即使是很有经验的技术人员,要想用这种方式来编写指令,也是很困难的,而且很容易出错。所以,在第一个处理器诞生之后不久,如何使指令的编写变得更容易,就提上了日程。

为了克服机器指令难以书写和理解的缺点,人们想到可以用一些容易理解和记忆的符号,也就是助记符,来描述指令的功能和操作数的类型,这就产生了汇编语言(Assembly Language)。这样,上面那些指令就可以写成:

对于那些有点英语基础的人来说,理解这些汇编语言指令并不困难。比如这句

首先,mov 是move 的简化形式,意思是“移动”或者“传送”。至于“ax”,很明显,指的就是AX 寄存器。传送指令需要两个操作数,分别是目的操作数和源操作数,它们之间要用逗号隔开。在这里,AX 是目的操作数,源操作数是3FH。汇编语言对指令的大小写没有特别的要求。所以你完全可以这样写:

在很多高级语言中,如果要指示一个数是十六进制数,通常不采用在后面加“H”的做法,而是为它添加一个“0x”前缀。像这样:

你可能想问一下,为什么会是这样,为什么会是“0x”?答案是不知道,不知道在什么时候,为什么就这样用了。这不得不让人怀疑,它肯定是一个非常随意的决定,并在以后形成了惯例。如果你知道确切的答案,不妨写封电子邮件告诉我。注意,为了方便,我们将在本书中采用这种形式。

在汇编语言中,使用十进制数是最自然的。因为3FH 等于十进制数63,所以你可以直接这样写:

当然,如果你喜欢,也可以使用二进制数来这样写:

一定要看清楚,在那串“0”和“1”的组合后面,跟着字母“B”,以表明它是一个二进制数。

至于这句:

情况也是一样。add 的意思是把一个数和另一个数相加。在这里,是把BX 寄存器的内容和AX 寄存器的内容相加。相加的结果在BX 中,但AX 的内容并不改变。

像上面那样,用汇编语言提供的符号书写的文本,叫做汇编语言源程序。为此,你需要一个字处理器软件,比如Windows 记事本,来编辑这些内容。如图3-1 所示,相信这些软件的使用都是你已经非常熟悉的。

图3-1 用Windows 记事本来书写汇编语言源程序

有了汇编语言所提供的符号,这只是方便了你自己。相反地,对人类来说通俗易懂的东西,处理器是无法识别的。所以,还需要将汇编语言源程序转换成机器指令,这个过程叫做编译(Compile)。在编译的时候,汇编语言编译器的作用是将mov、add、ax、bx 等这些符号组合起来,转换成类似于数值的机器指令,这个过程叫做汇编,这就是汇编语言的由来,也有人称之为组合语言。

编译肯定还需要依靠一个软件,称为编译器,或编译软件。因为如果需要人类自己去做,还费这周折干嘛。另一方面,想想看,一个帮助人类生产软件的工具,自己居然也是一个软件,这很有意思。

从字处理器软件生成的是汇编语言源程序文件。编译软件的任务是读取这些文件,将那些符号转变成二进制形式的机器指令代码。它把这些机器代码存放到另一个文件中,叫做二进制文件或者可执行文件,比如Windows 里以“.exe”为扩展名的文件,就是可执行文件。当需要用处理器执行的时候,再加载到内存里。 8qlY1eWqqM2glhstchSvRObf6oyaIKXXPsQZ2p0g7iIa7BN8ZrqMPpgJ+rfrr5OA

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