奎克的藏经阁 · 原书印刷页

编码 隐匿在计算机软硬件背后的语言 · 第 297 页

PDF 物理页索引 313 · 编码隐匿在计算机软硬件背后的语言

书名
编码 隐匿在计算机软硬件背后的语言
作者
未记录
印刷页
297
PDF 物理页
313(从 0 开始)
章节
编码隐匿在计算机软硬件背后的语言
UUID
38270854-596f-4a26-8183-db8c968c6020
来源类型
original_book
页面 SHA-256
4ddd5cb013c1d7fa64486d5c7fdf4d019559598a9b8ab367cfbac061143e49a1

8080有5个标志位,其中有4个可用于条件跳转指令。8080支持9种不同的跳转指令,包括了非条件跳转指令,还包含根据 ZF(Zero Flag)、CF(Carry Flag)、PF(Parity Flag)以及 SF(Sign Flag)是否为1而跳转的条件跳转指令。

在介绍这些指令之前,首先来介绍与Jump指令相关的另外两种指令。第一种是Call(调用)指令,它和Jump指令类似,但是有所不同的是:执行Call指令后,程序计数器(Program Counter,在这部分讲解中简称PC)加载一个新的地址,而处理器会把原来的地址保存起来,保存到何处呢?最好的选择自然是堆栈了。

这种策略使 Call 指令有效地记录了“从何处跳转”(where it jumped from),即保存了跳转之前的相关信息。堆栈中保存的地址可以使处理器最后返回到转移之前的位置。用于返回的指令称为Return(返回)。Return指令从堆栈中弹出两个字节,并把它们加载到PC中,这样就完成了返回到跳转点的工作。

对于任何处理器来说,Call和 Return指令都非常重要。在它们的帮助下,程序员可以在程序中使用子程序(subroutine),子程序是一段频繁使用的完成特定功能的代码(这里的“频繁”意味着“不止一次”)。对于汇编语言来说,子程序是其基本的组成部分。

让我们来看一个使用子程序的例子。假设你在编写一个汇编语言程序,在程序的某个位置你需要把两个字节相乘,因此你编写了一段用于两个数相乘的代码,然后继续向下写,在程序的另一个位置你发现需要再一次对两个字节相乘。因为你已经写过把两个字节相乘的代码,所以只需要重复使用这些代码就可以了。但是怎么做呢?只是简单地把这些代码重复输入到存储器吗?我们希望不是,因为这样做不仅耽误时间而且浪费存储空间,一个更好的方法是跳转到先前写的那段乘法代码所在的位置。但是普通的Jump指令不能完成这个操作,因为在执行乘法之后不能准确地返回程序的当前位置。因此你需要使用Call指令和 Return指令来帮助你实现这个功能。

用来实现两个数相乘的一组指令可以作为一个子程序。下面我们将看到这个子程序。在第17章的乘法程序中,被乘数(还有乘积)被保存在存储器的特定位置;而在8080的子程序中,乘数和被乘数分别存放在寄存器B和寄存器C中,乘积保存到16位寄存器

19 两种典型的微处理器

297