上篇:第六章、计算机的运算方法
计算机能解题是由于机器本身存在一种语言,它既能理解人的意图,又能被机器自身识别。机器语言是由一条条语句构成的,每一条语句又能准确表达某种语义。计算机就是连续执行每一条机器语句而实现全自动工作的。人们习惯把每一条机器语言的语句叫机器指令
,而又将全部机器指令的集合叫做机器的指令系统
。因此机器的指令系统集中反映了机器的功能。
指令是由操作码
和地址码
两部分组成:
1. 操作码
操作码
是用来指明该指令所要完成的操作,如加法、减法、传送、移位、转移等等。通常,其位数反映了机器的操作种类,也即机器允许的指令条数,如操作码占 7 位,则该机器最多包含 27=128 条指令。
操作码长度可以是固定的,也可以是变化的:
为了支持操作码的长度可变,通常采用扩展操作码技术
。
扩展操作码技术
能够使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
扩展方法有两种:
以方式一进行举例来探究操作码如何进行扩展:
图中指令字长为 16 位,其中 4 位为基本操作码字段 OP,另外三个 4 位长的地址字段为 A1、A2、A3。如果不采用扩展操作码技术,可以根据 OP 的字节长度计算出操作码最多只能有 24 条,根本无法满足计算机系统编写复杂程序的要求,所以指令必须进行扩展。当操作码 4 位时,从 0000
~ 1111
有 16 种编码,可以将 0000
~ 1110
这 15 个编码作为指令,剩下一个 1111
作为扩展标志,如果前 4 个编码为 1111
时,则表明这条指令操作码长度至少为 8 位,依次类推,可以看出随着地址数的减少,操作码增加。扩展标志可以有多个,比如将 1110
也作为扩展标志的话,那么指令的个数也会随之增加。
在设计操作码不固定的指令系统时,应尽量考虑安排指令使用频度(即指令在程序中出现的概率)高的指令占用短的操作码,对使用低的指令可占用较长的操作码,以缩短经常使用的指令译码时间。
2. 地址码
地址码用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及下一条指令的地址。这里的 “地址” 可以是主存的地址,也可以是寄存器的地址,甚至可以是IO设备的地址。
(1)四地址指令
该指令完成 (A1) OP (A2) —> A3
操作,会进行 4 次访存。假设指令字长为 32 位,操作码固定 8 位,4 个地址字段各占 6 位,则指令的直接寻址范围是 26=64,这么短的地址码,如果是寄存器尚且可行,如果是内存的话,这样的指令几乎是不可用的,那要如何通过减少地址码的个数来增加地址码的长度,从而增加寻找范围。
因为程序种大多数指令是按顺序执行的,而程序计数器 PC 既能存放当前欲执行指令的地址,又有计数功能,因此它能自动形成下一条指令的地址,这样,指令中的第四地址字段 A4 便可省去,即得三地址指令格式。
(2)三地址指令
它完成 (A1) OP (A2) —> A3
操作,也会进行 4 次访存。但是由于地址吗个数减少,每个地址字段各占 8 位,其寻址范围也变成了 28=256。
其实,机器在运行过程中,没有必要将每次运算结果都存入主存,中间结果可以暂时存放在 CPU 的寄存器(如 ACC )中,这样又可省去一个地址字段 A3,从而得出二地址指令。
(3)二地址指令
它进行的操作是 (A1) OP (A2) —> A1
或者 (A1) OP (A2) —> A2
,仍需进行 4 次访存。但是地址码从 3 个变为 2 个,每一个地址码的长度从 8 位增加到 12 位,寻址范围变为 212=4K。
如果将一个操作数的地址隐含在运算器的 ACC 中,则指令字中只需给出一个地址码,构成了一地址指令。
(4)一地址指令
其执行的操作为 (ACC) OP (A1) —> ACC
,ACC 既存放参与运算的操作数,又存放运算的中间结果,这样,完成一条一地址指令只需 2 次访存,其寻址范围达到 224=16M。
在指令系统中,还有一种指令可以不设地址字段,即所谓零地址指令。
(5)零地址指令
零地址指令在指令字中无地址码,例如进栈(PUSH)、出栈(POP)这类指令,其操作数的地址隐含在堆栈指针 SP 中。
指令字长取决于 操作码的长度
、操作数地址的长度
和 操作数地址的个数
。不间机器的指令字长是不相同的。
早期计算机指令字长是 固定的
,指令字长可以等于存储字长。随着计算机的发展,指令字长 可变
,通常情况下长度的变化都是按字节倍数变化。
机器中常见的操作数类型有:
在 第四章、存储器 有提到过,主存中数据的存放可以按照:① 以高位字节地址为字地址;② 以低位字节地址为字地址。两种方式进行存放。
其中 (a) 表示低字节为低地址,(b) 表示高字节为低地址。
由于不同的数据字长不同,每台机器处理的数据字长也不统一,在内存要如何进行存储呢?
不同的机器操作类型也是不同的,但几乎所有的机器都有以下几类通用的操作。
1. 数据传送
数据传送包括寄存器与寄存器、寄存器与存储单元、存储单元与存储单元之间的传送。如从源到目的之间的传送、对存储器读(LOAD)和写(STORE)、交换源和目的的内容、置 1、清 0 、进栈、出栈等。
2. 算术逻辑操作
这类操作可实现算术运算(加、减、乘、除、增1、减1、取负数即求补)和逻辑运算(与、或、非、异或)。对于低档机而言,一般算术运算只支持最基本的二进制加减、比较、求补等,高档机还能支持浮点运算和十进制运算。
有些机器还具有位操作功能,如位测试(测试指定位的值)、位清除(清除指定位)、位求反(对指定位求反)等。
3. 移位
移位可分为算术移位、逻辑移位和循环移位三种。
4. 转移
在多数情况下,计算机是按顺序执行程序的每条指令的,但有时需要改变这种顺序,此刻可采用转移类指令来完成。转移指令按其转移特征又可分为无条件转移、条件转移、跳转、过程调用与返回、陷阱(Trap)与陷阱指令等几种。
5. 输入输出
对于 IO 单独编址的计算机而言,通常没有输入输出指令,它完成从外设中的寄存器读入一个数据到 CPU 的寄存器内,或将数据从 CPU 的寄存器输出至某外设的寄存器中。
6. 其它
其他包括等待指令、停机指令、空操作指令、开中断指令、关中断指令、置条件码指令等等。
寻址方式是指确定本条指令的数据地址,以及下一条将要执行的指令地址的方法,它与硬件结构紧密相关,而且也直接影响指令格式和指令功能。
寻址方式分为指令寻址
和数据寻址
两大类。
指令寻址可分为:
如果程序的首地址为 0,只要先将 0 送至程序计数器 PC 中,启动机器运行后,程序便按0、1、2、3、7、8、… 序执行。其中第1、2、3号指令地址均由 PC 自动形成。因第 3 号地址指令为 JMP 7, 故执行完第 3 号指令后,便无条件将 7 送至 PC,因此,此刻指令地址跳过 4、5、6三条,直接执行第 7 条指令,接着又顺序执行第 8 条、第 9 条等等指令。
数据寻址方式种类较多,在指令字中必须设一字段来指明属哪一种寻址方式。指令的地址码字段,通常都不代表操作数的真实地址,把它称作形式地址
,记作 A
。操作数的真实地址叫做有效地址
,记作 EA
,它是由寻址方式和形式地址共同来确定的。
为了便于分析研究各类寻址方式,假设指令字长、存储字长、机器字长均相同。
1. 立即寻址
立即寻址的特点是操作数本身设在指令字内,即形式地址 A 不是操作数的地址,而是操作数本身,又称之为立即数。
它的优点在于只要取出指令,便可立即获得操作数,这样指令在执行阶段不必再访问存储器。
2. 直接寻址
直接寻址的特点是,抬令字中的形式地址 A 就是操作数的真实地址 EA
E A = A EA=A EA=A
它的优点是寻找操作数比较简单,也不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次。它的缺点在于 A 的位数限制了指令的寻址范围,而且必须修改 A 的值,才能修改操作数的地址。
3. 隐含寻址
隐含寻址是指指令字中不明显地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中。
例如,一地址格式的加法指令只给出一个操作数的地址,另一个操作数隐含在累加器 ACC 中,这样累加器 ACC 成了另一个数
的地址。
由于隐含寻址在指令字中少了一个地址,因此,这种寻址方式的指令有利于缩短指令字长。
4. 间接寻址
倘若指令字中的形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,也就是说,有效地址是由形式地址间接提供的,故为间接寻址。即
E A = ( A ) EA=(A) EA=(A)
这种寻址方式与直接寻址相比,它扩大了操作数的寻址范围,其第二个优点在于它便于编制程序,不过间接寻址的指令执行阶段需要访存两次(一次间址)或多次(两次间址),致使指令执行时间延长。
5. 寄存器寻址
在寄存器寻址的指令字中,地址码字段直接指出了寄存器的编号,即 E A = R i EA=R_{i} EA=Ri
其操作数在由 R i R_{i} Ri 所指的寄存器内。由于操作数不在主存中,故寄存器寻址在指令执行阶段无须访存,减少了执行时间。由于地址字段只需指明寄存器编号(计算机中寄存器数有限),故指令字较短,节省了存储空间,因此寄存器寻址在计算机中得到广泛应用。
6. 寄存器间接寻址
R i R_{i} Ri 中的内容不是操作数,而是操作数所在主存单元的地址号,即有效地址 E A = ( R i ) EA=(R_{i}) EA=(Ri)。与寄存器寻址相比,指令的执行阶段还需访问主存。与图 一次间址
相比,因有效地址不是存放在存储单元中,而是存放在寄存器中,故称其为寄存器间接寻址,它比间接寻址少一次访存。便于编写循环程序。
7. 基址寻址
基址寻址需设有基址寄存器 BR,其操作数的有效地址 EA 等于指令字中的形式地址与基址寄存器中的内容(称作基地址)相加。即:
E A = A + ( B R ) EA=A+(BR) EA=A+(BR)
基址寄存器可采用 隐式
的和 显式
的两种。所谓隐式是在计算机内专门设有一个基址寄存器 BR,使用时用户不必明显指出该基址寄存器,只需由指令的寻址特征位反映出基址寻址即可。显式是在一组通用寄存器里,由用户明确指出哪个寄存器用作基址寄存器,存放基地址。
基址寻址可以扩大指令对主存的寻址范围,在多道程序和浮动程序编制时极为有用。
8. 变址寻址
变址寻址与基址寻址极为相似。其有效地址 EA 等于指令字中的形式地址 A 与变址寄存器 IX 的内容相加之和。即
E A = A + ( I X ) EA=A+(IX) EA=A+(IX)
显然只要变址寄存器位数足够,也可扩大指令的寻址范围,IX 的内容由用户给定,在程序的执行过程中 IX 内容可变,形式地址 A 不可变,便于处理数组问题。
9. 相对寻址
相对寻址的有效地址是将程序计数器 PC 的内容(即当前指令的地址)与指令字中的形式地址 A 相加而成。即
E A = A + ( P C ) EA=A+(PC) EA=A+(PC)
相对寻址常被用于转移类指令,转移后的目标地址与当前指令有一段距离,叫做相对位移量,它由指令字的形式地址 A 给出,故 A 又可称位移量,位移量 A 可正可负。
相对寻址的最大特点是转移地址不固定,它可随 PC 值的变化而变,因此,无论程序在主存的哪段区域,都可正确运行,对于编写浮动程序特别有利,广泛应用于转移指令。
10. 堆栈寻址
在堆栈寻址的指令字中没有形式地址码字段,它是一种零地址指令。堆栈寻址要求计算机中设有堆栈。
堆栈一般可分为 硬堆栈(用寄存器组来实现)
和 软堆栈(利用主存的一部分存储空间实现)
。
堆栈的运行方式为先进后出或先进先出两种,先进后出型堆栈的操作数只能从一个个进行读或写。
以软堆栈为例,可用堆栈指针 SP(Stack Point)指出栈顶地址,也可用 CPU 中一个或两个寄存器作为 SP。 操作数只能从栈顶地址指示的存储单元存或取。可见堆栈寻址也可视为一种隐含寻址,其操作数的地址总被隐含在 SP 中。堆栈寻址就其本质也可视为寄存器间址,因 SP 可视为寄存器,它存放着操作数的有效地址。
1. IBM 360
IBM360属系列机,所谓系列机是指其基本指令系统相同,基本体系结构相同的一系列计算机,IBM370 对 IBM360 是向上兼容的。
2. Interl 8086
Intel 8086/80486 系列微机的指令字长为 1 ~ 6 个字节,即不定长。如零地址格式的空操作指令 NOP 只占一个字节;地址格式的 CALL 指令可以是 3 字节(段内调用)或5字节(段间调用);二地址格式指令中的两个操作数,既可以是寄存器一寄存器型、寄存器—存储器型,也可以是寄存器一立即数型或存储器一立即数型,它们所占的字节数分别为2、2 ~ 4、2 ~ 3、 3 ~ 6个字节。
RISC 是精简指令系统计算机的英文缩写,即Reduced Instruction Set Computer,与其对应的是 CISC,即复杂指令系统计算机(Complex Instruction Set Computer)。
计算机发展至今,硬件功能越来越强,但也越来越复杂。为了节省开销,人们希望新机种能兼容旧机种的软件,于是出现了同类型的系列机。然而,随着指令系统的发展,机器指令变得越来越复杂,导致编译器编写和代码执行效率下降。人们发现典型程序中只有 20% 的指令被频繁使用,而这些指令都是简单指令。因此,复杂指令的增加并不能提高执行速度。为解决这些问题,人们开始研究 CISC,并发现了 80-20 规律。
人们从 80-20 规律中得到启示:能否仅仅用最常用的 20% 的简单指令,重新组合不常用的 80% 的指令功能呢?这便引发出 RISC 技术。
上篇:第六章、计算机的运算方法