组成原理(四)指令系统
第四章 指令系统
4.1 指令格式
-
指令的最基本格式
【操作码 | 地址码】
(1)操作码: 反应机器做什么操作
操作码的长度在RISC中固定,而在CISC中长度可变。CISC的长度可变是指利用指令的其他字段对操作码字段进行扩展
(2)一条指令至少需要至少包含以下几个信息
1. 操作码
2. 操作数地址
3. 操作结果的存储地址
4. 下一条指令的地址
指令的设计极为灵活,只要包含以上4点信息,就能构成一条指令,而不必在意其字段个数。
指令的操作码表示指令要完成的操作,指令的地址码描述指令操作的对象 -
指令的分类(按照地址码字段的个数)
(1)零地址指令:(关机指令)
格式:OPCODE - 操作码
指令中只有操作码,而没有地址码
(2)一地址指令:(取反)
格式:【 OPCODE | A 】
A:操作数的存储器地址或寄存器编号。A即可以是操作数地址,又是操作结果的存储地址
(3)二地址指令:add r1 r2
格式:【 OPCODE | \(A_1\) | \(A_2\) 】
OPCODE -- 操作码
\(A_1\):第一个操作数的存储器地址或寄存器地址
\(A_2\):第二个操作数的存储器地址或寄存器地址
(4)三地址指令
指令:【 OPCODE | \(A_1\) | \(A_2\) | \(A_3\) 】
\(A_1\):第一个操作数的存储器地址或寄存器地址
\(A_2\):第二个操作数的存储器地址或寄存器地址
\(A_3\):操作结果的存储器地址或寄存器地址
(5)多地址指令:
用于大中型机甚至高档小型机中,用于处理成批的数据。 -
操作码定长指令的格式
(1)指令字长决定于三个部分:
操作码长度:f
操作数地址的长度:n
操作地址的个数:m
(2)指令字长固定
若操作码长度为k位,则最多能有\(2^k\)条不同指令
指令字长 = 存储字长
(3)指令字长可变
按字节的倍数变化 -
扩展操作码指令的格式
(1)所谓扩展操作码指令,就是扩展了操作码的长度,从而增加了操作码的个数。这些扩展的位来自于指令中的其他字段
(2)扩展操作码指令通常由一个固定长度的基本操作码,和几个地址码字段组成。对于一部分不需要的地址码指令,把他们的操作码扩充到该地址码字段。如下指令字段分配:15 ~ 12 11 ~ 8 7 ~ 4 3 ~ 0 OPCODE \(A_1\) \(A_2\) \(A_3\)
如图所示:若都是三地址指令,则操作码占4位,有16条指令、
当以上指令格式,通过变长操作码,把地址码\(A_1\)的4bit也扩展成指令的操作码时,指令集中就包含三地址指令和二地址指令。此时,虽然三地址下的操作码有4为,但是三地址指令只有15条,需要留出1位作为二地址指令的前缀。
即:三地址指令的操作码范围:0000~1110
二地址指令的操作码范围:0001 0000 ~ 0001 1110
若继续扩展1地址和0地址指令,则1地址指令有15条,0地址指令16条
(0地址指令不需要在为了扩展保留一位作为其他指令格式操作码的前缀)
- 操作类型
涉及到具体指令集中的汇编指令,如MIPS或x86指令集
4.2 指令的寻址格式
有效地址:EA 操作数的真实地址称为有效地址
寻址方式:指令寻址,数据寻址
- 指令寻址
(1)顺序:(PC)+1 -> PC
(2)跳跃:由跳转指令给出跳转后的地址
LDA
ADD
DEC:减1
JMP:跳转
LDA
SUB:减法
INC:加1
STA:
LDA:
条件转移:while,
无条件转移:goto
- 数据寻址
(1)数据寻址的指令格式
~ 形式地址:指令字中的地址
~ 有效地址:操作数的真实地址
~ 约定:指令字长 = 存储字长 = 机器字长
(以下几种寻址方式都是这个结构的指令格式)
(2)数据寻址有多种寻址方式,如何区分这些寻址方式
~ 1. 有的指令集中,没有专门的寻址方式位,由操作码确定寻址方式
~ 2. 有专门的寻址方式位
(eg:X86指令集中,一条指令中有多个操作数,且寻址方式各不相同,需要指明寻址方式,因此每个操作数有专门的寻址方式位)
(3)数据寻址方式:立即寻址
形式地址A就是操作数(地址即内容)
指令执行阶段不访存
A的位数限制了立即数的大小
eg:执行 a + 5 指令 (add 5)
(4)数据寻址方式:直接寻址
EA = A : 有效地址由形式地址给出
c = a + b
执行阶段访问一次存储器
形式地址A的位数限制了该指令操作数的寻址范围。但是操作数大小的范围扩大了
(5)数据寻址方式:隐含寻址
操作数的地址隐含在操作码里,比如对于操作码ADD,其中一个操作数的地址在ACC寄存器里,所以指令中不用给出这个操作数的主存地址。当然另一个操作数还是要在指令中给出地址,去主存寻找。
(6)间接寻址
EA = (A)
(7)数据寻址方式:寄存器寻址
(8)数据寻址方式:寄存器间接寻址
(9)数据寻址方式:基址寻址
基址默认放在基址寄存器BR中,当基址放在其他通用寄存器中时,指令中要给出这个寄存器的编号。
EA=(B)+ A
(10)变址寄存器
IX是变址寄存器,这个地址是可变的
扩大寻址范围。IX的内容可被用户调用。便于处理数组问题
(11)相对寻址
相对于pc寄存器寻址。A的数值由指令中给出
值得注意的是:PC寄存器的自增操作要早于相对寻址的计算
(1)某机器字长16位,主存按照字节编址,转移指令采用相对寻址,由两个字节组成。第一个字节为操作码,第二个字节为相对偏移量个字段。若某转移指令所在主存的地址为2000H,相对偏移量字段的内容为06H,则该指令成功跳转后的目标地址是(2008H)
解:题中给出,采用相对寻址方式,所以EA = (PC)+n。这个n是一条指令跨过的地址编号。机器字长=指令字长=16byte=2字节,而主存地址按照字节编址,所以一次执行指令,地址号向后加2,所以为2000H+06H+2H = 2008H
---------------------------------------------------------------------------------------------------------------------
(2)某计算机字长16位,主存地址空间大小为128K,按字编址。采用单字长指令格式,指令字段定义如下:
转移指令采用相对寻址方式,相对变异量用补码表示,寻址方式定义为如下表:
问:(1)该指令系统最多有多少条指令,该计算机最多有多少个通用寄存器,存储器地址寄存器和存储器数据寄存器至少各占多少位?
(2)转移指令的目标地址范围是多少
(3)若操作码0010B表示加法操作(助记符为add),寄存器R4和R5的编号分别为100B和101B,R4的内容为123H,R5的内容为5678H。地址1234H中的内容为5678H,地址5678H的内容为1234H。则汇编语句“add (R4),(R5)+”(逗号前为操作数,逗号后为目的操作数)对应的机器码是什么?
(4)该指令执行后,哪些寄存器和存储单元的值会改变,改变后的内容是什么。
解:(1)因为op占4位,所以指令最多16条。
因为机器字长16位,所以MDR至少16位
因为存储空间128K,且按字编址,所以地址范围是128/2=64k,即\(2^{16}\),所以MAR占16位
(2)因为寄存器占16位(等于机器字长),所以PC占16位,其地址范围为0 ~ \(2^{16}\)-1
(3)途中的的m和r分别表示m:mode。r:register寄存器。所以图中给出指令格式为:
即:0010 001 100 010 101
(4)R5和地址5678H的主存块内容变化。R5变为5678+1=5679H,5678H单元的内容变为1234H+5678H=68ACH
4.3 CISC与RISC
-
处理器编程模型 (C=B+A)
(1)我们要定义一套规则,让计算机理解人的意图
(2)ABC称作操作数,+号称作操作码。处理其中做运算的单元称作ALU。距离ALU很近的地方纺织了一些寄存器,这样中间结果都放在寄存器中,而不用每次都经过存储器。
(3)于是,把C=B+A分解成一系列的指令执行.指令就是编程模型 -
CISC:复杂指令集
(1)计算机发展早期,人们用汇编语言进行编程,自然喜好强大好用的指令集。于是处理器设计人员把指令设计的强大而灵活
(2)CISC指令集中包含高级语言的某些特性,如复杂的寻址模式,直接对应指针的运算
(3)那时的存储器速度慢且昂贵,因此CISC的指令是变长指令,以节约存储空间。由一条指令完成很多功能,对内存访问减少了 -
RISC:精简指令集
(1)IBM发现,CISC中的大量复杂寻址方式和大量指令不会被经常用到。常用的指令只占20%
(2)于是重新设计指令集,来去除cpu中,用于做复杂又很少用到的功能的晶体管
(3)RISC的指令大部分时间能在一个cycle内完成,因此处理器频率得到大幅度提升
(4)RISC利于扩展,但RISC采用定长指令,使得存储空间变大。程序空间较大会降低cache的命中率,降低程序的执行效率 -
intel对CISC的改造
(1)intel意识到CISC架构的cpu,很难有性能上的提升,但要适配CISC设计的程序,又不能直接采用RISC,于是intel把CISC的指令先解析为微指令(micro-operations,简称ups)。以后的执行采用RISC处理 。
(2)intel把cisc转化为risc的操作是借助于微程序控制器:将大指令翻译为多个小指令,放在控制存储器中。因此一个微程序包含多个微指令,每条微指令发出微命令进行微操作。 -
机器字长
(1)机器字长:处理器一次处理的数据长度,由运算器,寄存器决定。eg: 32位的处理器,每个寄存器能存储32bit的数据
(2)32位cpu的地址总线长为32位,而数据总线一般采用64bit和128bit长度,这样可以一次读取更多数据。 -
操作数个数
(1)早期晶体管紧张,寄存器数目较少,指令集设计时,只采用2个寄存器:ADD AX,BX(源和目的操作数采用一个寄存器)
(2)intel后来扩充了SSE指令,采用3个操作数:源,目的,掩码
(3)后来的RISC采用3操作数:2个源操作数,1个目的操作数
(4)x86指令格式的目的操作数在最前:ADD BX,AX:结果放在BX中。MIPS的3操作数,目的操作数也在第一个 -
二进制存储顺序-大小端
0x12345678在大端字节序和小端字节序的存储形式。小端:存储位越来越低。大端:存储位越来越高
-
指令类型
cpu要完成各种运算,需要3中类型的指令
(1)算数逻辑指令:移位,加减法
(2)控制指令:跳转指令
(3)数据传送指令:数据导入导出。load:数据从存储器到寄存器,store:方向相反
题目侧重考察构造指令集
(1)c语言中,a = i + 5用到的寻址方式:
i : 直接寻址, 5 : 立即数寻址 , a = *i + 5间接寻址