Chinaopub.com 第19章两种典型的微处理器 微处理器一集成计算机中央处理器(CPU)的所有组件在一个硅芯片上—诞生于1971 年。它的产生有一个很好的开端:第一个微处理器是 Intel4004,其中有2300个晶体管。今天 差不多30年过去了,为家用计算机所制造的微处理器中将近有10000000个晶体管 微处理器实际的作用基本上保持不变。现在的芯片上附加的上百万个晶体管可以做许多有 趣的事情,但在微处理器最初的探索过程中,这些事情更多的是分散我们的注意力而不是给我 们以启迪。为了对微处理器的工作情况获得更清晰的认识,让我们先看一下最初的微处理器。 这些微处理器出现在1974年。在该年度, Intel公司在4月推出了8080, Motorola(摩托罗 拉)一从20世纪50年代开始生产半导体和晶体管产品的公司一在8月份推出了6800。它们 并非是那年仅有的微处理器。同样是在1974年,德克萨斯仪器公司推出了4位的TMS1000,用 在许多计算器、玩具和设备上: National Semiconductor(国家半导体公司)推出了PACE,它 是第一个16位的微处理器。然而,回想起来,8080和6800是两个最具有重大历史意义的芯片。 Intel设定8080最初价格为$360,这是对 IBM System/360的一个讽刺。 IBM System/360是 个大型机系统,由许多大公司使用,要花费几百万美元。(今天,你只花$195就可以买到 个8080芯片。)这并不是说8080可以与 System/360相提并论,但不用几年,IBM公司也将会 正视这些很小的计算机。 8080是一个8位的微处理器,有6000个晶体管,时钟频率为2MHz,可寻址64KB的存储空 间。6800(今天也只卖$195)有大约4000个晶体管,也可寻址64KB的存储空间。第1代6800 的时钟频率为1MHz,但到1977年 Motorola公司发布新款的6800时,其时钟频率已为1.5MHz 和2MHz。 这些芯片称作“单芯片微处理器”,不太准确的名称为“一个芯片上的计算机”。处理器 只是整个计算机的一部分。此外,计算机至少还需要一些随机访问存储器(RAM)、供人们 输入信息到计算机的方法(输入设备),供人们从计算机获取信息的方法(输出设备),以及 其他可把所有这些东西连接在一起的芯片。这些组件将在第21章详细介绍。 从现在起,我们只考察微处理器。描述微处理器时,通常是用框图来画微处理器的内部 组件及它们是如何连接的。但在第17章已有够多的图了,现在,我们将通过观察处理器与外 界的相互作用来了解它的内部。换句话说,为了弄清楚它的作用,可以把微处理器看成是 个黑盒子,它的内部操作不需要做详细研究。我们可以通过测试芯片的输入和输出信号,特 别是芯片的指令集来掌握微处理器的功能 8080和6800都是40管脚的集成电路。这些芯片最普通的IC封装大约是2英寸长,半英寸宽 1/8英寸厚
下载 第19章 两种典型的微处理器 微处理器—集成计算机中央处理器( C P U)的所有组件在一个硅芯片上—诞生于1 9 7 1 年。它的产生有一个很好的开端:第一个微处理器是 Intel 4004,其中有2 3 0 0个晶体管。今天, 差不多3 0年过去了,为家用计算机所制造的微处理器中将近有 10 000 000个晶体管。 微处理器实际的作用基本上保持不变。现在的芯片上附加的上百万个晶体管可以做许多有 趣的事情,但在微处理器最初的探索过程中,这些事情更多的是分散我们的注意力而不是给我 们以启迪。为了对微处理器的工作情况获得更清晰的认识,让我们先看一下最初的微处理器。 这些微处理器出现在 1 9 7 4年。在该年度,I n t e l公司在4月推出了8 0 8 0,M o t o r o l a(摩托罗 拉)—从2 0世纪5 0年代开始生产半导体和晶体管产品的公司—在8月份推出了6 8 0 0。它们 并非是那年仅有的微处理器。同样是在 1 9 7 4年,德克萨斯仪器公司推出了4位的TMS 1000,用 在许多计算器、玩具和设备上; National Semiconductor(国家半导体公司)推出了 PA C E,它 是第一个1 6位的微处理器。然而,回想起来, 8 0 8 0和6 8 0 0是两个最具有重大历史意义的芯片。 I n t e l设定8 0 8 0最初价格为$ 360,这是对IBM System/360的一个讽刺。IBM System/360是 一个大型机系统,由许多大公司使用,要花费几百万美元。(今天,你只花 $ 1 . 9 5就可以买到 一个8 0 8 0芯片。)这并不是说8 0 8 0可以与S y s t e m / 3 6 0相提并论,但不用几年, I B M公司也将会 正视这些很小的计算机。 8 0 8 0是一个8位的微处理器,有6 0 0 0个晶体管,时钟频率为 2 M H z,可寻址6 4 K B的存储空 间。6 8 0 0(今天也只卖$ 1 . 9 5)有大约4 0 0 0个晶体管,也可寻址6 4 K B的存储空间。第1代6 8 0 0 的时钟频率为1 MHz,但到1 9 7 7年M o t o r o l a公司发布新款的6 8 0 0时,其时钟频率已为 1 . 5 M H z 和2 MHz。 这些芯片称作“单芯片微处理器”,不太准确的名称为“一个芯片上的计算机”。处理器 只是整个计算机的一部分。此外,计算机至少还需要一些随机访问存储器( R A M)、供人们 输入信息到计算机的方法(输入设备),供人们从计算机获取信息的方法(输出设备),以及 其他可把所有这些东西连接在一起的芯片。这些组件将在第 2 1章详细介绍。 从现在起,我们只考察微处理器。描述微处理器时,通常是用框图来画微处理器的内部 组件及它们是如何连接的。但在第 1 7章已有够多的图了,现在,我们将通过观察处理器与外 界的相互作用来了解它的内部 。换句话说,为了弄清楚它的作用,可以把微处理器看成是一 个黑盒子,它的内部操作不需要做详细研究。我们可以通过测试芯片的输入和输出信号,特 别是芯片的指令集来掌握微处理器的功能。 8 0 8 0和6 8 0 0都是4 0管脚的集成电路。这些芯片最普通的I C封装大约是2英寸长,半英寸宽, 1 / 8英寸厚:
inaopul.com 第9章两种典型的微处理189 下载 当然,你看到的只是外包装。位于其内部的硅晶片非常小,就拿早期的8位微处理器来说, 其硅晶片小于1/4平方英寸。外包装保护硅晶片并通过管脚提供对芯片的输入和输出点的访问。 下图显示了8080的40个管脚的功能: GND 14 DDDDDD 51 11 Intel 606030 RESET HoLD→-13 +12 INT 2 DBIN 670543 WAr READY SYNC 7B90 22 21 HLD& 本书的所有电气或电子设备都需要某种电源供电。8080的一个特别之处在于它需要三种 电源电压:管脚20必须连到5伏电源上,管脚11连到-5伏电源上,管脚28连到12伏电源上:管 脚2接地(1976年, Intel发布了8085芯片,简化了这些电源需求)。 其余管脚都画有箭头。从芯片中出来的箭头表示输出信号,这是由微处理器控制的信号, 计算机中其余芯片对此作出响应。指向芯片的箭头表示输入信号,这是来自于其他芯片的信 号,8080对它们做出响应。有些管脚既是输入又是输出。 第17章的处理器需要振荡器使它工作。8080需要两个不同的2MHz同步时钟输入,在22 和15管脚上分别标记为②,和②。这些信号可以很方便地由 Intel公司生产的8224时钟信号发生 器提供。给这个芯片连上一个18MHz的石英晶体,剩下的工作它基本上可以完成。 个微处理器通常有多个输出信号来寻址存储空间,这种信号的数目与微处理器可寻址 的存储器空间的大小直接相关。8080有16个地址信号,标为A0~A15,具有寻址21即65536 字节的存储空间的能力 8080是一个8位微处理器,一次可从存储器中读出、写入8位数据。它包括8个数据信号 D。D2,这些信号是在此芯片中仅有的几个既作为输入又作为输出的信号。当微处理器从存储 器读数据时,这些管脚作为输入:当微处理器向存储器写数据时,这些管脚作为输出。 微处理器的另外10个管脚是控制信号。例如, RESET输入用来复位微处理器。输出信号 WR表示微处理器要向RAM中写数据。(WR信号对应于RAM阵列的写入输入。)另外,当芯 片读取指令时,其他控制信号会在某个时候出现在D~D管脚。由8080构成的计算机系统通常 使用8228系统控制芯片来锁存这些附加的控制信号。后面将会讲述一些控制信号。由于8080 的控制信号非常复杂,因此,除非你想基于8080芯片来实际设计计算机,否则最好不要用这 些控制信号来折磨自己
第19章 两种典型的微处理器 189 下载 当然,你看到的只是外包装。位于其内部的硅晶片非常小,就拿早期的 8位微处理器来说, 其硅晶片小于1 / 4平方英寸。外包装保护硅晶片并通过管脚提供对芯片的输入和输出点的访问。 下图显示了8 0 8 0的4 0个管脚的功能: 本书的所有电气或电子设备都需要某种电源供电。 8 0 8 0的一个特别之处在于它需要三种 电源电压:管脚2 0必须连到5伏电源上,管脚11连到- 5伏电源上,管脚2 8连到1 2伏电源上;管 脚2接地(1 9 7 6年,I n t e l发布了8 0 8 5芯片,简化了这些电源需求)。 其余管脚都画有箭头。从芯片中出来的箭头表示输出信号,这是由微处理器控制的信号, 计算机中其余芯片对此作出响应。指向芯片的箭头表示输入信号,这是来自于其他芯片的信 号,8 0 8 0对它们做出响应。有些管脚既是输入又是输出。 第1 7章的处理器需要振荡器使它工作。 8 0 8 0需要两个不同的 2 MHz同步时钟输入,在 2 2 和1 5管脚上分别标记为 Æ1和Æ2。这些信号可以很方便地由 I n t e l公司生产的8 2 2 4时钟信号发生 器提供。给这个芯片连上一个 18 MHz的石英晶体,剩下的工作它基本上可以完成。 一个微处理器通常有多个输出信号来寻址存储空间,这种信号的数目与微处理器可寻址 的存储器空间的大小直接相关。 8 0 8 0有1 6个地址信号,标为 A 0~A 1 5,具有寻址2 1 6即65 536 字节的存储空间的能力。 8 0 8 0是一个 8位微处理器,一次可从存储器中读出、写入 8位数据。它包括 8个数据信号 D0 ~ D7,这些信号是在此芯片中仅有的几个既作为输入又作为输出的信号。当微处理器从存储 器读数据时,这些管脚作为输入;当微处理器向存储器写数据时,这些管脚作为输出。 微处理器的另外 1 0个管脚是控制信号。例如, R E S E T输入用来复位微处理器。输出信号 -W R表示微处理器要向 R A M中写数据。(- WR信号对应于R A M阵列的写入输入。)另外,当芯 片读取指令时,其他控制信号会在某个时候出现在 D0 ~ D7管脚。由8 0 8 0构成的计算机系统通常 使用8 2 2 8系统控制芯片来锁存这些附加的控制信号。后面将会讲述一些控制信号。由于 8 0 8 0 的控制信号非常复杂,因此,除非你想基于 8 0 8 0芯片来实际设计计算机,否则最好不要用这 些控制信号来折磨自己
190编的 Chia°dow 下载 假定8080微处理器连接了64KB的存储器,这样可以不通过微处理器来读写数据 8080芯片复位后,它从存储器的地址o000h处读取该字节,送到微处理器中。这可以通过 在地址信号端A。~A输出16个0来实现。它读取的字节必须是8080指令,这种读取字节的过 程叫作取指令。 在第17章构造的计算机里,所有指令(除了停止指令HLT)都是3个字节长,包括一个操 作码和两个字节的地址。在8080中,指令长度可以是1个字节、2个字节或3个字节。有些指令 可使8080从存储器的某一位置处读出一个字节送到微处理器中;有些指令可使8080从微处理 器中把数据写入存储器的某一位置处:其他指令可使8080不使用RAM而在内部执行。第一条 指令执行完后,8080访问存储器中的第二条指令,依此类推。这些指令组合在一起构成一个 计算机程序,用来完成一些自己感兴趣的事情 当8080运行在最高速度即2MHz时,每个时钟周期为500纳秒(1除以2000000周等于 0000000秒)。第17章中的每条指令都需要4个时钟周期,8080的每条指令则需要4~18个 时钟周期,这意味着每条指令的执行时间为2~9微秒(即百万分之一秒)。 了解微处理器功能的最好方法可能是在系统方式下测试其完整的指令集。 第17章最后出现的计算机仅有12条指令。一个8位微处理器很容易就有256条指令,每个操 作码对应于某个8位值。(如果一些指令有2个字节的操作码,则实际会有更多的指令)。8080虽 没有那么多,但它也有244条操作码。这看起来似乎很多,但总的来说,却又不比第17章中的 计算机功能多多少。例如,如果想用8080做乘法或除法,仍然需要写一段小程序来实现。 第17章中讲过,处理器指令集的每个操作码都和某个助记符相联系,有些助记符之后可 能还有操作数。但这些助记符仅用来方便地表示操作码。处理器只读取字节,它并不懂组成 这些助记符的字符的含义 第17章中的计算机有两条很重要的指令,称作装载(Load)和保存( Store)指令。这些 指令都占用三个字节的存储空间。装载指令的第一个字节是操作码,操作码后的两个字节表 示16位地址。处理器把在此地址中的字节送到累加器。同样,保存指令把累加器中的内容存 储到指令指定的地址处。 下面,我们用助记符来简写这两个操作 OD A, aaaaI STo aaaa,A 在此,A表示累加器(装载指令的目的操作数,保存指令的源操作数),aa表示一个16 位的存储器地址,通常用4位十六进制数来表示。 8080中的8位累加器称作A,就像第17章中的累加器。正如第17章中的计算机一样,8080 也有两条与装载和保存指令功能一样的指令。8080中这两条指令的操作码为32h和3Ah,每个 操作码后有一个16位地址。8080的助记符为STA(代表存储累加器的内容)和LDA(代表装 载到累加器) 操作码 指令 32 STA aaaa, A 3A LDA A,aaaa 除了累加器,8080微处理器内部还包括6个寄存器( register),每个寄存器可以保存8位的 值。这些寄存器和累加器非常相似,事实上,累加器被看作是一种特殊的寄存器。和累加器
190 编码的奥秘 下载 假定8 0 8 0微处理器连接了6 4 K B的存储器,这样可以不通过微处理器来读写数据。 8 0 8 0芯片复位后,它从存储器的地址 0 0 0 0 h处读取该字节,送到微处理器中。这可以通过 在地址信号端 A0~A1 5输出1 6个0来实现。它读取的字节必须是 8 0 8 0指令,这种读取字节的过 程叫作取指令。 在第1 7章构造的计算机里,所有指令(除了停止指令 H LT)都是3个字节长,包括一个操 作码和两个字节的地址。在 8 0 8 0中,指令长度可以是 1个字节、2个字节或3个字节。有些指令 可使8 0 8 0从存储器的某一位置处读出一个字节送到微处理器中;有些指令可使 8 0 8 0从微处理 器中把数据写入存储器的某一位置处;其他指令可使 8 0 8 0不使用R A M而在内部执行。第一条 指令执行完后, 8 0 8 0访问存储器中的第二条指令,依此类推。这些指令组合在一起构成一个 计算机程序,用来完成一些自己感兴趣的事情。 当8 0 8 0运行在最高速度即 2 MHz时,每个时钟周期为 5 0 0纳秒(1除以2 000 000周等于 0 . 0 0 0 0 0 0 5 0 0秒)。第1 7章中的每条指令都需要 4个时钟周期,8 0 8 0的每条指令则需要 4~1 8个 时钟周期,这意味着每条指令的执行时间为 2~9微秒(即百万分之一秒)。 了解微处理器功能的最好方法可能是在系统方式下测试其完整的指令集。 第1 7章最后出现的计算机仅有1 2条指令。一个8位微处理器很容易就有2 5 6条指令,每个操 作码对应于某个8位值。(如果一些指令有2个字节的操作码,则实际会有更多的指令)。8 0 8 0虽 没有那么多,但它也有 2 4 4条操作码。这看起来似乎很多,但总的来说,却又不比第 1 7章中的 计算机功能多多少。例如,如果想用8 0 8 0做乘法或除法,仍然需要写一段小程序来实现。 第1 7章中讲过,处理器指令集的每个操作码都和某个助记符相联系,有些助记符之后可 能还有操作数。但这些助记符仅用来方便地表示操作码。处理器只读取字节,它并不懂组成 这些助记符的字符的含义。 第1 7章中的计算机有两条很重要的指令,称作装载( L o a d)和保存(S t o r e)指令。这些 指令都占用三个字节的存储空间。装载指令的第一个字节是操作码,操作码后的两个字节表 示1 6位地址。处理器把在此地址中的字节送到累加器。同样,保存指令把累加器中的内容存 储到指令指定的地址处。 下面,我们用助记符来简写这两个操作: LOD A ,[aaaa] STO [aaaa],A 在此,A表示累加器(装载指令的目的操作数,保存指令的源操作数),a a a a表示一个1 6 位的存储器地址,通常用4位十六进制数来表示。 8 0 8 0中的8位累加器称作A,就像第1 7章中的累加器。正如第 1 7章中的计算机一样, 8 0 8 0 也有两条与装载和保存指令功能一样的指令。 8 0 8 0中这两条指令的操作码为 3 2 h和3 A h,每个 操作码后有一个 1 6位地址。8 0 8 0的助记符为S TA(代表存储累加器的内容)和 L D A(代表装 载到累加器): 操作码 指令 3 2 S TA [aaaa],A 3 A LDA A,[aaaa] 除了累加器,8 0 8 0微处理器内部还包括6个寄存器(r e g i s t e r),每个寄存器可以保存8位的 值。这些寄存器和累加器非常相似,事实上,累加器被看作是一种特殊的寄存器。和累加器
Chinapub.com 第9章两种典至的微处理器191 下载 样,这6个寄存器也是锁存器。处理器可以把数据从存储器传送到寄存器,也可以把数据从 寄存器送回到存储器。然而,这些寄存器没有累加器的功能强大。例如,当两数相加时,其 结果通常送往累加器而非其中一个寄存器。 在8080中,除累加器外的6个寄存器的名字分别为B,C,D,E,H和L。人们通常问的第 个问题是“用F和G干什么?”,第二个问题是“用I,J和K又要做什么?”,答案是使用寄 存器H和L具有某种特殊的含义。H代表高(High),L代表低(Low)。通常把H和L的8位合起来 记作HL来表示一个16位寄存器对,H作为高位字节,L作为低位字节。这个16位值通常用来寻 址存储器。后面我们将看到它的简单用法。 所有这些寄存器都是必需的吗?为什么不在第17章中的计算机中用到它们呢?从理论上 说,它们并非必需,但是使用它们会很方便。许多计算机程序在同一时刻要用到几个数据, 如果所有这些数据都存储在微处理器的寄存器中而非存储器中,执行程序将会更快,因为程 序访问存储器的次数越少,那么它的运行速度也就越快。 8088指令中,有一个至少63个指令码供一条8080指令使用的指令,它就是MOV指令,即 Move的简写。该条指令只有一个字节,用于把一个寄存器中的内容传送到另一个寄存器中 (或同一个寄存器中)。使用大量MOⅤ指令是设计带有7个寄存器(包括累加器)的微处理器 的正常结果。 下面是前32条MOV指令。记住目的操作数在左边,源操作数在右边 操作码 操作码 MOVE. B MOV D, B 4423 MOVB, C 51 MOVD, C MOVB, D MOVD, D MOVB, E MOVD, E MOVB. H MOVB, L MOVD, L MOVB, HLI 789 MOVB, A MOV C, B 23456789 MOVC. C MOVE. C MOVC. D MOVE. D MOV C, E MOVC, H MOVE, H MOVC. L MOVE, L MOV C, [ HLI BcDEF MoE,田HL] MOVC,A MOVE.A 这些都是很方便的指令。当一个寄存器中有值时,可以把它传送到其他寄存器中。注意, 上述指令中有四条指令用到HL寄存器对,如: 前面列出的LDA指令把一个字节从存储器中传送到累加器中,这个字节的16位地址直接 跟在LDA操作码的后面。这里的MOV指令把一个字节从存储器中传送到寄存器B中,但被装 载到寄存器中的字节的地址是保存在寄存器对HL中。HL寄存器是怎样得到16位存储器地址 呢?它可以通过多种方法来实现,或许是通过某种方法计算出来的
一样,这6个寄存器也是锁存器。处理器可以把数据从存储器传送到寄存器,也可以把数据从 寄存器送回到存储器。然而,这些寄存器没有累加器的功能强大。例如,当两数相加时,其 结果通常送往累加器而非其中一个寄存器。 在8 0 8 0中,除累加器外的6个寄存器的名字分别为 B,C,D,E,H和L。人们通常问的第 一个问题是“用 F和G干什么?”,第二个问题是“用 I,J和K又要做什么?”,答案是使用寄 存器H和L具有某种特殊的含义。H代表高(H i g h),L代表低( L o w )。通常把H和L的8位合起来 记作H L来表示一个1 6位寄存器对,H作为高位字节,L作为低位字节。这个1 6位值通常用来寻 址存储器。后面我们将看到它的简单用法。 所有这些寄存器都是必需的吗?为什么不在第 1 7章中的计算机中用到它们呢?从理论上 说,它们并非必需,但是使用它们会很方便。许多计算机程序在同一时刻要用到几个数据, 如果所有这些数据都存储在微处理器的寄存器中而非存储器中,执行程序将会更快,因为程 序访问存储器的次数越少,那么它的运行速度也就越快。 8 0 8 8指令中,有一个至少 6 3个指令码供一条8 0 8 0指令使用的指令,它就是 M O V指令,即 M o v e的简写。该条指令只有一个字节,用于把一个寄存器中的内容传送到另一个寄存器中 (或同一个寄存器中)。使用大量M O V指令是设计带有 7个寄存器(包括累加器)的微处理器 的正常结果。 下面是前3 2条M O V指令。记住目的操作数在左边,源操作数在右边: 操作码 指令 操作码 指令 4 0 MOV B,B 5 0 MOV D,B 4 1 MOV B,C 5 1 MOV D,C 4 2 MOV B,D 5 2 MOV D,D 4 3 MOV B,E 5 3 MOV D,E 4 4 MOV B,H 5 4 MOV D,H 4 5 MOV B,L 5 5 MOV D,L 4 6 MOV B,[ H L ] 5 6 MOV D,[ H L ] 4 7 MOV B,A 5 7 MOV D,A 4 8 MOV C,B 5 8 MOV E,B 4 9 MOV C,C 5 9 MOV E,C 4 A MOV C,D 5 A MOV E,D 4 B MOV C,E 5 B MOV E,E 4 C MOV C,H 5 C MOV E,H 4 D MOV C,L 5 D MOV E,L 4 E MOV C,[ H L ] 5 E MOV E,[ H L ] 4 F MOV C,A 5 F MOV E,A 这些都是很方便的指令。当一个寄存器中有值时,可以把它传送到其他寄存器中。注意, 上述指令中有四条指令用到 H L寄存器对,如: MOV B,[HL] 前面列出的L D A指令把一个字节从存储器中传送到累加器中,这个字节的 1 6位地址直接 跟在L D A操作码的后面。这里的 M O V指令把一个字节从存储器中传送到寄存器 B中,但被装 载到寄存器中的字节的地址是保存在寄存器对 H L中。H L寄存器是怎样得到1 6位存储器地址的 呢?它可以通过多种方法来实现,或许是通过某种方法计算出来的。 第19章 两种典型的微处理器 191 下载
192 编码的奥秘 Chinaopub.com 下载 总之,这两条指令 LDA A, [aaaa] 都把一个字节从存储器中装载到微处理器中,但它们用两种不同的方法来寻址存储器地 址。第一种方法叫作直接寻址方式,第二种方法叫作间接寻址方式。 第二批32条MOV指令表明用HL寻址的存储器地址也可以作为目的操作数 操作码 指令 MOVH, B MOVH, C MOV (HL], C 62 MOVH, D MOV(HLJ, D MOVH, E MOVH, H MOV HLI, H MOVH, L MOV [HL], L MOVH, HL 01234567 MOVH,A MOVL. B MOV L, C MOVA, C MOVL. D MOVA. D MOVL, E MOV L, H 7C MOVA, H MOVA, HL MOVL, A MOVA, A 其中一些指令如 做的是无用的事,而像: 这样的指令是不存在的。和这条指令相对应的操作码实际上是停止指令 观察这些MOV操作码更明显的方法是考察它的位模式,MOV操作码由8位组成 其中字母d代表指代目的操作数的位代码,ss代表指代源操作数的位代码。这3位代码是: 存器 001=寄存器C 010=寄存器D 011=寄存器E 00=寄存器 101=寄存器L 110=HL中保存的存储器地址中的内容 111=累加器A 例如,指令: 相应的操作码表示为01101011,或6Bh。可以通过检查前面的表来验证
总之,这两条指令 LDA A,[aaaa] MOV B,[HL] 都把一个字节从存储器中装载到微处理器中,但它们用两种不同的方法来寻址存储器地 址。第一种方法叫作直接寻址方式,第二种方法叫作间接寻址方式。 第二批3 2条M O V指令表明用H L寻址的存储器地址也可以作为目的操作数: 操作码 指令 操作码 指令 6 0 MOV H,B 7 0 MOV [HL],B 6 1 MOV H,C 7 1 MOV [HL],C 6 2 MOV H,D 7 2 MOV [HL],D 6 3 MOV H,E 7 3 MOV [HL],E 6 4 MOV H,H 7 4 MOV [HL],H 6 5 MOV H,L 75 MOV [HL],L 6 6 MOV H,[ H L ] 7 6 H LT 6 7 MOV H,A 7 7 MOV [HL],A 6 8 MOV L,B 7 8 MOV A,B 6 9 MOV L,C 7 9 MOV A,C 6 A MOV L,D 7 A MOV A,D 6 B MOV L,E 7 B MOV A,E 6 C MOV L,H 7 C MOV A,H 6 D MOV L,L 7 D MOV A,L 6 E MOV L,[ H L ] 7 E MOV A,[ H L ] 6 F MOV L,A 7 F MOV A,A 其中一些指令如: MOV A, A 做的是无用的事,而像: MOV [HL],[HL] 这样的指令是不存在的。和这条指令相对应的操作码实际上是停止指令。 观察这些M O V操作码更明显的方法是考察它的位模式, M O V操作码由8位组成: 01dddsss 其中字母ddd 代表指代目的操作数的3位代码,s s s代表指代源操作数的3位代码。这3位代码是: 000= 寄存器 B 001= 寄存器 C 010= 寄存器 D 0 11= 寄存器 E 100= 寄存器 H 101= 寄存器 L 110= HL中保存的存储器地址中的内容 111= 累加器A 例如,指令: MOV L , E 相应的操作码表示为0 11 0 1 0 11,或6 B h。可以通过检查前面的表来验证。 192 编码的奥秘 下载
Chinaopub.com 第9章两种典至的微处理器193 下载 因此可能在8080内部某个地方,标有ss的3位标识用在8-1数据选择器中,标有dd的3位 标识用于控制3-8译码器,此译码器用来决定哪一个寄存器锁存了一个值。 也可能使用寄存器B和C来构成一个16位寄存器对BC,用寄存器D和E来构成一个16位寄 存器对DE。如果每一个寄存器对都包含用于装载或保存一个字节的存储器地址,则可以使用 述指令 操作码 指令 STAX IBC], A LDAXA, BC] STAX IDEJ, A IA LDAXA, DEJ 另一种类型的传送指令叫做传送立即数,指定的助记符为MVI。传送立即数指令占两个 字节,第一个是操作码,第二个是1个字节的数据。此字节从存储器中传送到一个寄存器中或 由HL寻址的存储单元中。 操作码 06 MVI B, xx MVI C, xX 16 MVI MVI E, xx mVI MVI [HLI,xx E MVI A, xx 例如,当指令: MVI E, 37h 执行后,寄存器E中包含有字节37h。这就是第三种寻址方式,即立即数寻址方式 个操作码的集合完成四种基本算术运算,那是在第17章开发处理器时我们就已熟悉的 运算,即加法(ADD)、进位加法(ADC)、减法(SUB)和借位减法(SBB)。所有情况中 累加器是两个操作数之一,也是结果的目的地址。 操作码 指令 操作码 ADDA, B SUB A ADDA, C SUB A, C ADDA, D 92 SUBA. D SUBA,E SUBA.H A, HL] SUB A, HL] SBBA, B 99 ADC A, D SBBA, E ADCA. H SBBA,H ADCA. L 91 SBBA, L ADC A, HLI SBB A, HL] ADCA.A SBBA.A
第19章 两种典型的微处理器 193 下载 因此可能在8 0 8 0内部某个地方,标有 s s s的3位标识用在8 - 1数据选择器中,标有 d d d的3位 标识用于控制3 - 8译码器,此译码器用来决定哪一个寄存器锁存了一个值。 也可能使用寄存器 B和C来构成一个1 6位寄存器对B C,用寄存器D和E来构成一个1 6位寄 存器对D E。如果每一个寄存器对都包含用于装载或保存一个字节的存储器地址,则可以使用 下述指令: 操作码 指令 操作码 指令 0 2 S TAX [BC],A 0 A LDAX A,[ B C ] 1 2 S TAX [DE],A 1 A LDAX A,[ D E ] 另一种类型的传送指令叫做传送立即数,指定的助记符为 M V I。传送立即数指令占两个 字节,第一个是操作码,第二个是 1个字节的数据。此字节从存储器中传送到一个寄存器中或 由H L寻址的存储单元中。 操作码 指令 06 MVI B,x x 0 E MVI C,x x 16 MVI D,x x 1 E MVI E,x x 26 MVI H,x x 2 E MVI L,x x 3 6 MVI [HL],x x 3 E MVI A,x x 例如,当指令: MVI E,37h 执行后,寄存器E中包含有字节3 7 h。这就是第三种寻址方式,即立即数寻址方式。 3 2个操作码的集合完成四种基本算术运算,那是在第 1 7章开发处理器时我们就已熟悉的 运算,即加法(A D D)、进位加法(A D C)、减法(S U B)和借位减法(S B B)。所有情况中, 累加器是两个操作数之一,也是结果的目的地址。 操作码 指令 操作码 指令 8 0 ADD A,B 9 0 SUB A,B 8 1 ADD A,C 9 1 SUB A,C 8 2 ADD A,D 9 2 SUB A,D 8 3 ADD A,E 9 3 SUB A,E 8 4 ADD A,H 9 4 SUB A,H 8 5 ADD A,L 9 5 SUB A,L 8 6 ADD A,[ H L ] 9 6 SUB A,[ H L ] 8 7 ADD A,A 9 7 SUB A,A 8 8 ADC A,B 9 8 SBB A,B 8 9 ADC A,C 9 9 SBB A,C 8 A ADC A,D 9 A SBB A,D 8 B ADC A,E 9 B SBB A,E 8 C ADC A,H 9 C SBB A,H 8 D ADC A,L 9 D SBB A,L 8 E ADC A,[ H L ] 9 E SBB A,[ H L ] 8 F ADC A,A 9 F SBB A,A
194的 China-pub.com 下载 假设A中是35h,寄存器B中是22h,当指令: 执行后,累加器中的结果为13h。 若A中的值为35h,寄存器H中的值为10h,L中的值为7Ch,存储器地址107Ch中的值为4A 则指令: 把累加器中的内容(35h)和通过寄存器对HL寻址得到的值(4Ah)相加,并把结果 (7Fh)保存到累加器中。 ADC和SBB指令允许8080加/减16位、24位、32位和更多位的数。例如,假设寄存器对BC 和DE都包含16位数,你想把它们相加,并把结果存到BC中。下面是具体做法: MOv A, C 低位字节 MOV C, A MovA,B:高位字节 MOV B, A 其中有两条加法指令,ADD指令用于低位字节相加,ADC指令用于高位字节相加。第 条加法指令的进位位包含在第二条加法指令中。因为只能利用累加器进行加法运算,所以在 这么短的代码中也需要至少4条MOⅤ指令。许多MOV指令常常出现在8080代码中 该是谈论8080标志位的时候了。在第17章的处理器中,已有进位标志位CF和零标志位ZF 8080还有3个标志位,即符号标志位SF、奇偶标志位PF和辅助进位标志位AF。所有标志位都 保存在另一个叫作程序状态字(PSw: program status word)的8位寄存器中。像LDA、STA 和MOV这样的指令不影响标志位,而ADD、SUB、ADC和SBB指令却要影响标志位,影响的 方式如下: 当运算结果最高位为1时,符号标志位SF为1,表示结果为负 当结果为0时,零标志位ZF为1 当运算结果中“1”的个数为偶数时,奇偶标志位PF=1:当运算结果中“1”的个数为 奇数时,奇偶标志位PF=0。PF有时用来粗略地检测错误,此标志位在8080程序中不常 用 ·当ADD或ADC运算产生进位或SUB与SBB运算不发生借位时,进位标志位CF=1。(这点 不同于第17章中的计算机进位标志的实现。) ·当操作结果的低4位向高4位有进位时,辅助进位标志位AF=1。此标志位只用在DAA (十进制调整累加器)指令中 有两条指令直接影响进位标志位CF 操作码 含义 置CF为1 CMC 第17章中的计算机可执行ADD、ADC、SUB和SBB指令(尽管没什么灵活性),但8080还 可以进行逻辑运算AND(与)、OR(或)和ⅹOR(异或)。算术运算和逻辑运算都可通过处理 器的算术逻辑单元(ALU)来执行
194 编码的奥秘 下载 假设A中是3 5 h ,寄存器B中是2 2 h ,当指令: SUB A,B 执行后,累加器中的结果为 1 3 h。 若A中的值为3 5 h ,寄存器H中的值为1 0 h,L中的值为7 C h,存储器地址1 0 7 C h中的值为4 A h,则指令: ADD A,[HL] 把累加器中的内容( 3 5 h)和通过寄存器对 H L寻址得到的值( 4 A h)相加,并把结果 (7 F h)保存到累加器中。 A D C和S B B指令允许8 0 8 0加/减1 6位、2 4位、3 2位和更多位的数。例如,假设寄存器对 B C 和D E都包含1 6位数,你想把它们相加,并把结果存到 B C中。下面是具体做法: MOV A,C ;低位字节 ADD A,E MOV C,A MOV A,B ;高位字节 ADC A,D MOV B,A 其中有两条加法指令, A D D指令用于低位字节相加, A D C指令用于高位字节相加。第一 条加法指令的进位位包含在第二条加法指令中。因为只能利用累加器进行加法运算,所以在 这么短的代码中也需要至少 4条M O V指令。许多M O V指令常常出现在8 0 8 0代码中。 该是谈论8 0 8 0标志位的时候了。在第1 7章的处理器中,已有进位标志位C F和零标志位Z F。 8 0 8 0还有3个标志位,即符号标志位 S F、奇偶标志位P F和辅助进位标志位 A F。所有标志位都 保存在另一个叫作程序状态字( P S W:program status word)的8位寄存器中。像L D A、S TA 和M O V这样的指令不影响标志位,而 A D D、S U B、A D C和S B B指令却要影响标志位,影响的 方式如下: • 当运算结果最高位为1时,符号标志位S F为1,表示结果为负。 • 当结果为0时,零标志位Z F为1。 • 当运算结果中“ 1”的个数为偶数时,奇偶标志位 P F = 1;当运算结果中“ 1”的个数为 奇数时,奇偶标志位 P F = 0。P F有时用来粗略地检测错误,此标志位在 8 0 8 0程序中不常 用。 • 当A D D或A D C运算产生进位或S U B与S B B运算不发生借位时,进位标志位 C F = 1。(这点 不同于第1 7章中的计算机进位标志的实现。) • 当操作结果的低 4位向高4位有进位时,辅助进位标志位 A F = 1。此标志位只用在 D A A (十进制调整累加器)指令中。 有两条指令直接影响进位标志位 C F: 操作码 指令 含义 3 7 S T C 置C F为1 3 F C M C C F取反 第1 7章中的计算机可执行A D D、A D C、S U B和S B B指令(尽管没什么灵活性),但8 0 8 0还 可以进行逻辑运算A N D(与)、O R(或)和X O R(异或)。算术运算和逻辑运算都可通过处理 器的算术逻辑单元(A L U)来执行:
第9章两种典至的微处理器195 下载 操作码 指令 操作码 指令 ANDA, B ORA, B ANDA, C ORA, C ANDA, D B2 ORA. D ANDA, E ORA, E ANDA, H ORA, H B OR A AND A, HLI OR A, HLJ ANDA, A B7 ORA, A R∠ CMPA, B CMPA. C XOR A. D CMP A, D XORA, E XORA, H BC CMPA, H XORA,L CMPA, HL AND、XOR和OR指令按位运算,即逻辑操作只是单独地在对应位之间进行。例如: MVI A. oFh AND A. Bh 累加器中的结果将为05h。如果第三条指令为OR运算,则结果为5Fh;如果第三条指令为 XOR运算,则结果为5Ah CMP(比较)指令与SUB指令基本上一样,除了结果不保存在累加器中。换句话说 CMP执行减法操作再把结果扔掉。这是为什么?是因为标志位。根据标志位的状态可知道所 比较的两数之间的关系。例如,当如下指令: MVI B, 25h CMP A, B 执行完时,A中的内容没有改变。然而,若A中的值为25h,则ZF标志置位:若A中的值 小于25h,则CF=1 这8个算术逻辑运算也可以对立即数进行操作: 操作码 指令 操作码 指令 ADI A, xx ANI A, xx ACIA SUIA, xx SBIA, xI CPIA 例如,上面列出的两条指令也可以用下面的指令来替换: 下面是其他两条8080指令: 操作码指令 DAA CMA CMA即 complement accumulator,它对累加器中的值进行取反操作。每个0变为1,每个1
第19章 两种典型的微处理器 195 下载 操作码 指令 操作码 指令 A 0 AND A,B B 0 OR A,B A 1 AND A,C B 1 OR A,C A 2 AND A,D B 2 OR A,D A 3 AND A,E B 3 OR A,E A 4 AND A,H B 4 OR A,H A 5 AND A,L B 5 OR A,L A 6 AND A,[ H L ] B 6 OR A,[ H L ] A 7 AND A,A B 7 OR A,A A 8 XOR A,B B 8 CMP A,B A 9 XOR A,C B 9 CMP A,C A A XOR A,D B A CMP A,D A B XOR A,E B B CMP A,E A C XOR A,H B C CMP A,H A D XOR A,L B D CMP A,L A E XOR A,[ H L ] B E CMP A,[ H L ] A F XOR A,A B F CMP A,A A N D、X O R和O R指令按位运算,即逻辑操作只是单独地在对应位之间进行。例如: MVI A,0Fh MVI B,55h AND A,Bh 累加器中的结果将为0 5 h。如果第三条指令为 O R运算,则结果为5 F h;如果第三条指令为 X O R运算,则结果为5 A h。 C M P(比较)指令与 S U B指令基本上一样,除了结果不保存在累加器中。换句话说, C M P执行减法操作再把结果扔掉。这是为什么?是因为标志位。根据标志位的状态可知道所 比较的两数之间的关系。例如,当如下指令: MVI B,25h CMP A, B 执行完时,A中的内容没有改变。然而,若 A中的值为2 5 h,则Z F标志置位;若 A中的值 小于2 5 h,则CF = 1。 这8个算术逻辑运算也可以对立即数进行操作: 操作码 指令 操作码 指令 C 6 ADI A,x x E 6 ANI A,x x C E ACI A,x x E E XRI A,x x D 6 SUI A,x x F 6 ORI A,x x D E SBI A,x x F E CPI A,x x 例如,上面列出的两条指令也可以用下面的指令来替换: CPI A,25h 下面是其他两条8 0 8 0指令: 操作码 指令 2 7 D A A 2 F C M A C M A即complement accumulator,它对累加器中的值进行取反操作。每个 0变为1,每个1
196的 Chinaopub.com 下载 变为0。如果累加器中的值为01100101,CMA指令使它变为10011010。也可以用下述指令来 使累加器按位取反: A, FEh DAA即 Decimal Adjust Accumulator,如前所述,它可能是8080中最复杂的一条指令。微 处理器中有一个完整的小部件专门用于执行这条指令 DAA指令帮助程序员用BCD码表示的数来进行十进制算术运算。在BCD码中,每一小块 数据的范围在000~1001之间,对应于十进制的0~9。利用BCD码格式,每8位字节可存储两 个十进制数字。 假设累加器中的值为BCD码的27h。由于是BCD码,则它实际上指的是十进制的27。(十 六进制的2hh等于十进制的39。)再假定寄存器B中的值为BCD码的94h。如果执行指令: MOv A, 27 h MOV ADD A, B 累加器中的值将为BBh,当然,它不是BCD码,因为BCD码中的每一块不能超过9。但是, 现在执行指令 则累加器中的值为21h,且CF=1,这是因为27和94的十进制和为121。如果想进行BCD 码的算术运算,这样做是相当方便的 经常需要对一个数进行加1或减1操作。在第17章的乘法程序中,我们需要对一个数减1 使用的方法是加上FFh,它是-1的2的补码。8080中包含特殊的用于寄存器或存储单元的加1 指令(称作增量)和减1指令(称作减量) 操作码 指令 操作码 指令 INR B DCR B NRC DCR C NRD DCR D INRE DCR E INR H DCR H DCR L INR [ HLI DCR HL] DCR A 单字节指令INR和DCR可影响除CF外的所有标志位。 8080也包含4个循环移位指令,这些指令可使累加器中的内容左移或右移1位 操作码 指令 含义 RLC 累加器循环左移 累加器循环右 累加器带进位循环左移 RAR 累加器带进位循环右移 这些指令只影响CF 假定累加器中的值为A7h,即二进制的10100111。RLC指令使A中的内容向左移位,最高 位(移出顶端)成为最低位(移进底端),同时决定进位标志位CF的状态。其结果为01001ll 且CF=1。RRC指令用同样的方法向右移位。开始为10100111,执行RRC指令后,其结果为
196 编码的奥秘 下载 变为0。如果累加器中的值为 0 11 0 0 1 0 1,C M A指令使它变为1 0 0 11 0 1 0。也可以用下述指令来 使累加器按位取反: XRI A,FFh, D A A即Decimal Adjust Accumulator,如前所述,它可能是 8 0 8 0中最复杂的一条指令。微 处理器中有一个完整的小部件专门用于执行这条指令。 D A A指令帮助程序员用 B C D码表示的数来进行十进制算术运算。在 B C D码中,每一小块 数据的范围在0 0 0 0~1 0 0 1之间,对应于十进制的0~9。利用B C D码格式,每8位字节可存储两 个十进制数字。 假设累加器中的值为 B C D码的2 7 h。由于是B C D码,则它实际上指的是十进制的 2 7。(十 六进制的2 7 h等于十进制的3 9。)再假定寄存器B中的值为 B C D码的9 4 h。如果执行指令: MOV A, 27 h MOV B, 94 h ADD A, B 累加器中的值将为BB h,当然,它不是B C D码,因为B C D码中的每一块不能超过9。但是, 现在执行指令: DAA 则累加器中的值为 2 1 h,且CF = 1,这是因为2 7和9 4的十进制和为1 2 1。如果想进行B C D 码的算术运算,这样做是相当方便的。 经常需要对一个数进行加 1或减1操作。在第1 7章的乘法程序中,我们需要对一个数减 1, 使用的方法是加上 FFh ,它是- 1的2的补码。8 0 8 0中包含特殊的用于寄存器或存储单元的加 1 指令(称作增量)和减1指令(称作减量): 操作码 指令 操作码 指令 0 4 INR B 0 5 DCR B 0 C INR C 0 D DCR C 1 4 INR D 1 5 DCR D 1 C INR E 1 D DCR E 2 4 INR H 2 5 DCR H 2 C INR L 2 D DCR L 3 4 INR [HL] 3 5 DCR [HL] 3 C INR A 3 D DCR A 单字节指令I N R和D C R可影响除C F外的所有标志位。 8 0 8 0也包含4个循环移位指令,这些指令可使累加器中的内容左移或右移 1位: 操作码 指令 含义 0 7 R L C 累加器循环左移 0 F R R C 累加器循环右移 1 7 R A L 累加器带进位循环左移 1 F R A R 累加器带进位循环右移 这些指令只影响C F。 假定累加器中的值为 A 7 h,即二进制的1 0 1 0 0 111。R L C指令使A中的内容向左移位,最高 位(移出顶端)成为最低位(移进底端),同时决定进位标志位C F的状态。其结果为0 1 0 0 1111 且CF = 1。R R C指令用同样的方法向右移位。开始为 1 0 1 0 0 111,执行R R C指令后,其结果为
Chinaopup.com 第19章两种典型的微处理器 197 下载 l1010011且CF=1。 RAL和RAR指令有些不同。当向左移位时,RAL指令把CF移入累加器的最低位,而把最 高位移入CF中。例如,如果累加器的内容为10100111,CF=0,RAL指令执行的结果是累加 器的内容变为01001110,且CF=1。同样,在相同的初始条件下,RAR指令使累加器的内容 变为01010011,CF=1 对于乘2(左移1位)和除2(右移一位)操作,移位指令非常方便。 把微处理器寻址的存储器叫作随机访问存储器(RAM)是有原因的:微处理器可以简单 地根据提供的地址访问某一存储位置。RAM就像一本书一样,我们可以打开它的任何一页 它并不像做在微缩胶片上的一个星期的报纸,要找到周六版,需扫过大半周。同样,它也不 同于磁带,要播放磁带上的最后一首歌需快进整个一面。微缩胶片和磁带的存储不是随机 问的,而是顺序访问的 RAM确实效果不错,对于微处理器来说更是如此。但在使用存储器时有所差别是有好处 的,下面就是一种既非随机又非顺序访问的存储方式:假定你在一个办公室里,人们到你桌 前给你分配工作,每个工作都需要某种文件夹。通常你会发现你在继续某项工作之前,必须 使用另外一个文件夹先做一些相关的工作。因此你把第一个文件夹放在桌子上,又拿出第 个文件夹放在它上面进行工作。现在又有一个人来让你做一个优先权高于前面工作的工作, 你拿来一个新文件夹放在那两个上面继续工作。而此项工作又需要另外一个文件夹,这样在 你的桌子上很快就摆了一堆文件夹了。 注意,这个堆非常明确地、有序地保存了你正在做的工作的轨迹。最上面的文件夹总是 最高优先权的工作,去掉这个以后,下一个肯定是你就要做的,如此类推。当你最终去掉了 桌子上的最后一个文件夹后(你开始的第1项工作),你就可以回家了 以这种方式工作的存储器技术叫做作堆栈( stack)。从底向上压入堆栈,从顶向下弹出堆 栈,因此这也叫后进先出存储器,或LIFO。最后放入堆栈中的数据最先被取出,最先放入堆 栈中的数据最后被取出 计算机中也可以使用堆栈,不是用来保存工作而是用来存储数据,且已被证明使用起来 非常方便。向堆栈中放入数据叫作push(压入),从堆栈中取走数据叫作pop(弹出)。 假定你正在用汇编语言设计程序,程序中使用了寄存器A、B和C。但在编程过程中,你 发现此程序需要去做另一件事 个小的计算,其中也要使用寄存器A,、B、C。而你最终 要回到先前的程序,并使用A、B、C中原有的值 当然,你能做的工作只是简单地把寄存器A、B、C中的值保存到存储器中的不同位置 以后再把这些位置的值装载到寄存器中,但这样做需要保存值被保存的位置。一个显然的方 法是把寄存器压入堆栈: 会儿再解释这些指令的作用。现在,我们只需要知道它们以某种方式把寄存器的内容 保存在一个后进先出的存储器中。一旦这些语句执行了,你的程序就可以毫无顾虑地利用这 些寄存器来做其他工作。为了得到原来的值,只需简单地按与压入堆栈相反的顺序把它们从 堆栈中弹出即可,如下所示:
第19章 两种典型的微处理器 197 下载 11 0 1 0 0 11且CF = 1。 R A L和R A R指令有些不同。当向左移位时, R A L指令把C F移入累加器的最低位,而把最 高位移入C F中。例如,如果累加器的内容为 1 0 1 0 0 111,CF = 0,R A L指令执行的结果是累加 器的内容变为0 1 0 0 111 0,且CF = 1。同样,在相同的初始条件下, R A R指令使累加器的内容 变为0 1 0 1 0 0 11,CF = 1。 对于乘2(左移1位)和除2(右移一位)操作,移位指令非常方便。 把微处理器寻址的存储器叫作随机访问存储器( R A M)是有原因的:微处理器可以简单 地根据提供的地址访问某一存储位置。 R A M就像一本书一样,我们可以打开它的任何一页。 它并不像做在微缩胶片上的一个星期的报纸,要找到周六版,需扫过大半周。同样,它也不 同于磁带,要播放磁带上的最后一首歌需快进整个一面。微缩胶片和磁带的存储不是随机访 问的,而是顺序访问的。 R A M确实效果不错,对于微处理器来说更是如此。但在使用存储器时有所差别是有好处 的,下面就是一种既非随机又非顺序访问的存储方式:假定你在一个办公室里,人们到你桌 前给你分配工作,每个工作都需要某种文件夹。通常你会发现你在继续某项工作之前,必须 使用另外一个文件夹先做一些相关的工作。因此你把第一个文件夹放在桌子上,又拿出第二 个文件夹放在它上面进行工作。现在又有一个人来让你做一个优先权高于前面工作的工作, 你拿来一个新文件夹放在那两个上面继续工作。而此项工作又需要另外一个文件夹,这样在 你的桌子上很快就摆了一堆文件夹了。 注意,这个堆非常明确地、有序地保存了你正在做的工作的轨迹。最上面的文件夹总是 最高优先权的工作,去掉这个以后,下一个肯定是你就要做的,如此类推。当你最终去掉了 桌子上的最后一个文件夹后(你开始的第 1项工作),你就可以回家了。 以这种方式工作的存储器技术叫做作堆栈( s t a c k)。从底向上压入堆栈,从顶向下弹出堆 栈,因此这也叫后进先出存储器,或 L I F O。最后放入堆栈中的数据最先被取出,最先放入堆 栈中的数据最后被取出。 计算机中也可以使用堆栈,不是用来保存工作而是用来存储数据,且已被证明使用起来 非常方便。向堆栈中放入数据叫作 p u s h(压入),从堆栈中取走数据叫作p o p(弹出)。 假定你正在用汇编语言设计程序,程序中使用了寄存器 A、B和C。但在编程过程中,你 发现此程序需要去做另一件事—一个小的计算,其中也要使用寄存器 A,、B、C。而你最终 要回到先前的程序,并使用 A、B、C中原有的值。 当然,你能做的工作只是简单地把寄存器 A、B、C中的值保存到存储器中的不同位置, 以后再把这些位置的值装载到寄存器中,但这样做需要保存值被保存的位置。一个显然的方 法是把寄存器压入堆栈: PUSH A PUSH B PUSH C 一会儿再解释这些指令的作用。现在,我们只需要知道它们以某种方式把寄存器的内容 保存在一个后进先出的存储器中。一旦这些语句执行了,你的程序就可以毫无顾虑地利用这 些寄存器来做其他工作。为了得到原来的值,只需简单地按与压入堆栈相反的顺序把它们从 堆栈中弹出即可,如下所示: