计算机组成原理 知识点文档
[TOC]
指令系统
指令设计中的常见问题:
1、指令格式反映了指令执行过程的处理方法; 如变字长,识别操作码,寻址,取操作数等。 2、指令格式的选择直接影响到编程,存储空间的利用。 3、指令系统规定的操作,直接决定了ALU的构成方式及规模。 4、指令系统,它们指定的操作数及其存取方式,在极大程度上影响了主存 的规模及结构。 5、指令系统规定的寻址方式对处理机的速度有很大的影响。 6、指令系统规定的程序控制功能对程序编程灵活性有很大的影响。 7、输入、输出的处理 功能将规定CPU对输入输出操作控制的广度和深度。 8、指令类型反映全机具备的功能及总体结构。 9、指令的能力将影响到中断响应和处理,以及程序嵌套的浓度。
地址码结构
1、四地址指令
功能:第一个操作数和第二个操作数按所规定的操作OP执行,结果放在D3单元。(D4)单元给出下条指令的地址。
2、三地址指令
功能:采用一个程序计数器PC(一个特定的寄存器),在程序正常执行过程中,当前指令执行完毕,计数器加1,即(PC)+1 → PC (设每条指令只占一个单元,下同)。如遇转移或跳步,指令计数器的内容需要进行修正。由于后继指令地址采用这种隐含方式给出,于是D4 地址字段就无意义了,这时四地址变为三地址结构。
注意:采用三地址指令格式时,
第一、指令必须按顺序执行; 第二、每条指令执行完毕后,程序计数器(PC)加1; 第三、如果改变程序流动方向,必须使用一条转移命令。
3、二地址指令
功能:依然使用程序计数器PC存放下一条指令的地址,结果数地址隐含地由D1或D2给出,这时三地址变成二地址结构。
分类: (按操作数地址分)
存储器-存储器(SS)型指令:参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中。因此机器执行这种指令需要多次访问内存。
寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器中。机器执行这种指令的速度很快,不需要访问内存。
寄存器-存储器(RS)型指令:执行此类指令,既要访问内存单元,又要访问寄存器。
4、单地址指令
功能:地址指令明确访问的操作数只有一个,该操作数可以在主存或某一寄存器中。如果某些操作只对一个数加工,那么操作数源地址 和目的地址完全可合用一个。
5、零地址指令
功能:如果指令操作数的地址都能隐含的给出,那么单地址就变成零地址了。实现这一构想的硬件结构是栈。
操作码结构
1、统一编码
说明:统一编码:把指令系统的操作用N位二进制数码表示,有 2N不同操作。早期计算机由于成本高,多采用将一种指令长度固定的格式,即固定数目的操作码字段和地址字段,多采用统一编码方式。
缺点:操作码较少而译码线路复杂。为了在控制上得到某种简化,可以通过适当的逐位定义。
实际中两种方式(操作码定长与不定长)混合使用。
2、逐位定义方式
说明:将操作码分成几部分,分别表示几个方面的操作,他们的组合表示一个复杂的操作含义。
这种采用以基本操作为主,加相应的辅助性操作的方法,就使基本指令条数不多的指令系统具有相当多的实际组合。
3、扩展操作码
说明:当采用统一操作码长度与各类指令的地址长度发生矛盾时,通常采用“扩展操作码”技术加以解决。
扩展操作码是一种指令优化技术,即让操作码的长度随地址数的减少而增加(即扩展)。根据不同的地址指令格式,如三地址、二地址、单地址指令等,操作码的位数可以有几种不同的选择,从而在满足需要的前提下,有效地缩短指令长度。
例题
设某指令系统指令字长为16位,地址码长度为4位,试提出一种分配方案,使该指令系统有15条三地址指令,14条两地址指令,31条单地址指令,并留有表示零地址的可能。
解:
OP4位
0000
0001 三地址指令15条
…
1110
1111 扩展后 OP 8 位
1111 0000
1111 0010
…. 二地址指令14条
1111 1101
1111 1110 扩展后 OP 12 位
1111 1110 0000
1111 1110 0001 单地址指令16条
…
1111 1110 1111
1111 1111 扩展后 OP 12 位
1111 1111 0000
1111 1111 0001 单地址指令15条
…
1111 1111 1110
指令格式小结
1、操作码:
固定长度 (IBM/PC)
扩展长度 (PDP-11)
交叉安排 (NOVA)
2、按操作数划分:
四地址
三地址
二地址
单地址
零地址 ### 指令寻址方式 #### 立即寻址 ***(操作数在指令中)***
说明:立即寻址是一种特殊的寻址方式,指令中操作码后不是操作数地址,而是操作数本身,这样的数称为立即数。
特点:在取指令时,操作码和操作数同时取出;指令执行过程中不访问存储器,提高了指令的执行速度;但是,立即数的位数限制了数的表示范围。 用于:设置常数(地址常数、数据常数)。
例子:
MOV BX,2000H, BX ← 2000H (设置地址常数)
MOV CX,100, CX ← 100 (设置数据常数)
直接寻址
(操作数在内存中)
特点: 不需作任何寻址运算,简单直观便于硬件实现; 指令执行过程中,访问一次存储器; 但是,A的位数决定了操作数的寻址范围; 寻找不同操作数必须通过编程改变A。
用于: 顺序程序设计中涉及到的单独变量或数值。
例子:
;写出求5+7程序
MOV AL, A; AL←(A)
ADD AL, B; AL←(AL)+(B)
MOV C, AL;
HLT
寄存器直接寻址
(操作数在寄存器中)
特点: 指令执行过程中,不需要访问内存,提高指令执行速度; 寄存器号位数少,缩短指令长度。
用于:操作数已在寄存器中,可直接进行操作。
例如:
ADD AX,BX; (AX)+(BX)→AX
隐含寻址
(操作数在累加器中)
说明:一些特殊指令的操作数地址隐含在操作码中,指令字中少了一个地址字段,可缩短指令字长。
例子:
movs ;源操作数的地址隐含在 SI 中
;目的操作数的地址隐含在 DI 中
间接寻址
(操作数地址、操作数均在内存中)
说明:操作数的有效地址EA=(A)(A为操作数地址的地址)
特点: 指令执行过程中,需要两次访存,指令执行速度慢; 扩大了操作数的寻址范围; 便于编程。
主要用于:查表
通过间接寻址方式,我们可以写一个程序去访问一个有效的地址表,
地址表的每一项实际上就是间接指示器。
在程序执行前可以对这个表的每一项进行修改,这样无论哪种执行情
况,程序本身不必修改。
多重间址
寄存器间接寻址
(操作数地址在寄存器中,操作数在内存中)
特点: 这种寻址方式指令短,指令执行过程中,只需一次访存; 便于循环程序编程。
例如:求SUM=1+2+3+…+100
XOR AX;// AX清0
MOV CX,N; //CX=100设循环次数
MOV BX,OFFSET NUM1;
// BX=第一个数地址
OK: ADD AX, [BX]; // 寄存器间接寻址
INC BX; // BX=BX+1
LOOP OK; // 条件判断 CX=CX-1=0?
MOV SUM, AX; // AX送到SUM存储单元
HLT // 结束
;通过修改寄存器BX(操作数的地址),
;使它形成数组元素的连续地址,
;加第1个后加第2个…最后实现循环程序。
相对寻址
(相对当前指令地址)
说明:操作数的有效地址EA = (PC) ± A(形式地址)
特点: A 的位数决定操作数的寻址范围; 解决了程序浮动搬家的问题:编程时只要保证其相对距离不变, 就可在主存中任意浮动,源程序不改仍能保证程序正确执行; 广泛用于转移指令。
变址寻址
说明:操作数有效地址 EA = A(形式地址) ±(IX ) 变址寄存器IX内容:由程序员设定,程序执行过程中可变。 形式地址A:在程序执行过程中不可变。 特点: 比相对寻址扩大了寻址范围; 是循环程序设计的需要,主要针对数组进行快速的重复运算, 数据块的传递等。(设A为数组的首地址)
例如: SUM=1+2+3+…+100 (大数组进行快速重复计算)
程序:
XOR AX; //AX=0
MOV CX,100;//CX计数器=100
MOV IX,0; //IX变址寄存器=0
START: ADD AX, NUM1 [IX];// 变接寻址: NUM1+(IX)
INC IX; //IX=(IX)+1
LOOP START;//判断CX=CX-1=0?
MOV SUM,AX;
HLT
例如:将DA1单元起100个数据传送到DA2单元起的存储区中。
程序:
MOV CX,100
MOV IX,0
MOV DI,0
LOP: MOV AL,DA1 [IX]
//DA1+(IX)
MOV DA2 [DI],AL
//DA2+(DI)
INC IX //IX=(IX)+1
INC DI //DI=(DI)+1
LOOP LOP //判断CX=CX-1=0?
HLT
基址寻址
说明:操作数有效地址EA = ( BR ) ± A(形式地址) 基址寄存器BR起始地址由操作系统确定,程序执行中不可变。 形式地址A是一个偏移量(可正、可负),程序执行过程中可变。
特点:可扩大寻址范围; 有利于多道程序。
用于: 基址寻址方式,主要用来解决程序的动态定位问题。 在多道程序的环境下,用户不可决定自己使用的主存区,因而在 编程时常按(以零为基准地址)相对地址来编写,当程序被放入 主存时,操作系统根据主存空间情况给基址寄存器赋值,从而将 虚地址转化为实地址。
堆栈寻址
用于:(1)子程序嵌套、子程序递归和可再入性。 (2)多重循环 (3)中断程序的链接 (4)逆波兰表达式求值
举例:
子程序嵌套(指子程序可以再次调用子程序。)
递归调用子程序需保证每次调用时不能破坏前面调用时所用到的参数和产生的结果,递归子程序又必须有递归结束条件,以防止调用无法嵌套。
为保证调用时不破坏前面调用时所用到的参数和产生的结果,要求每次调用时将要用到的参数和中间结果不存放到存储区中,也就是每次调用时都应重新分配存放参数及结果存储区,实现这一点的最好方法是采用栈(后进先出)。
小结
1)立即寻址 指令中
2)隐含寻址 隐含指定某寄存器号 特定寄存器
3)直接寻址 存储单元地址 内存
4)寄存器直接寻址 寄存器号 寄存器
5)间接寻址 存储单元地址——存储单元地址 内存
6)寄存器间接寻址 寄存器号——存储单元地址 内存
7)相对寻址 PC + A(可变) 内存
8)基址寻址 基址寄存器 + A(可变) 内存
9)变址寻址 A + 变址寄存器(可变) 内存
10)堆栈寻址 SP 堆栈
补充习题
什么是数据寻址和指令寻址?简述它们的区别.
数据寻址是指确定本条指令的数据地址;
指令寻址是确定下一条将要执行的指令地址。
指令寻址和数据寻址的区别在于寻址的对象不同,一个是确定程序计数器PC的内容,
另一个是寻找指令中的操作数所在的地址,并以此找到操作数。
另外,指令寻址比较简单,分为顺序寻址和跳跃寻址两种,
而数据寻址种类较多;常用的有立即寻址、寄存器寻址、寄存器间接寻址、基址寻址、变址寻址等。
根据操作数所在的位置,指出其寻址方式:
操作数在寄存器中, 为 ? 寻址方式
操作数地址在寄存器中, 为 寻址方式
操作数在指令中, 为 ? 寻址方式
操作数地址在指令中, 为 ? 寻址方式
操作数地址等于某一寄存器内容与位移量之和,为 ? , ? , ? 寻址方式
1、直接寻址
2、寄存器直接寻址
3、寄存器间接寻址
4、基址寻址
5、变址寻址
6、相对寻址
7、堆栈寻址
8、立即数寻址
例2)指令格式如下所示,其中OP为操作码,试分析指令格式的特点。 (一个机器字两字节)
15 9 7 4 3 0
|OP | ….. | 源寄存器 | 目标寄存器 |
解:
1)此指令等于一个机器字长,是单字长二地址指令
2)操作码字段OP共7位,可以指定128条指令。
3)源寄存器和目标寄存器都是通用寄存器(可分别指定16个),
所以是RR型指令,两个操作数均在寄存器中。
4)这种指令结构常用于算术逻辑运算类指令。
例3)指令格式如下所示,OP为操作码字段,试分析指令格式特点。 (一个机器字两字节) 15 10 7 4 3 0
| OP | …… | 源寄存器 | 目标寄存器 |
解:
1)该指令32位,是双字长二地址指令,用于访问存储器。
2)操作码字段OP为6位,可以指定64种操作。
3)一个操作数在源寄存器(共16个),另一个操作数在存储器中
(变址寻址:由变址寄存器+位移量A决定)所以是RS型指令。
例5)设相对寻址的转移指令占2个字节,第1个字节是操作码,第2个 字节是相对位移量A(用补码表示)。每当CPU从存储器取出一个字节 后,(PC)+1 = PC
1)设当前PC的内容为2003H,要求转移到200AH地址,则该转移指
令第2个字节的内容是什么?
解: 200A – (2003 + 2)= 05 H
2)设当前PC的内容为2008H,
要求转移到2001H地址,
求该转移指令第2个字节内容。
解:2001 – (2008+2)= - 9 (补码 F7H)
例6)设字长和指令长度均为24位,若指令系统可完成108种操作,且具 有直接、间接、变址、基址、相对、立即等6种寻址方式,则在直接寻址 范围最大化的前提下,指令字中操作码占几位?寻址特征位占几位? 可直接寻址的范围是多少?一次间接寻址的范围是多少?
解:指令系统可完成108种操作,所以指令字种操作码至少占7位,
6种寻址方式,所以指令寻址特征至少3位,
24 – 7 – 3 = 14,所以可直接寻址范围是214,
字长位24位,一次间接寻址的地址范围是224
例7)某机器采用一地址格式的指令系统,允许直接和间接寻址。 机器配备有如下寄存器,均为16位: ACC(累加器), PC(程序计数器), MDR(数据缓冲寄存器), MAR(地址寄存器), RX(变址寄存器), RB(基址寄存器) IR(指令寄存器)
1)若采用单字长指令,共能完成105种操作,求最大直接寻址范围
与间接寻址范围?
解:因为MDR数据缓冲寄存器16位,所以一机器字长16位,
因为IR指令寄存器为16位,且单字长指令,所以一条指令16位,
完成105种操作,所以操作码7位,
寻址方式有:直接、间接,寄存器有:变址寄存器,基址寄存器
所以寻址特征位2位,
16 – 7 – 2 = 7 , 所以直接寻址范围27,一次间接寻址范围216。
2)若采用双字长指令,格式如下,其中操作码与寻址特征位数不变,
求最大直接寻址范围?
|操作码7 | 寻址特征2 | 地址码7|
| 地址码16 |
解: 32 – 7 – 2 = 23 , 所以最大直接寻址范围为2 23 。