指令格式
一条指令由操作码和地址码组成,其中地址码可能有0~4个
按地址码数目分类
-
零地址指令
- 不需要地址码,如空操作、停机、关中断等指令
-
一地址指令
- 只需要单操作数,如加1、减1、取反、求补等
- 指令含义:OP(A1)→A1,完成一条指令需要3次访存:取指→读A1→写A1
- 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC)
- 指令含义:(ACC)OP(A1)→ACC,完成一条指令需要2次访存:取指→读A1
- 注:A1指某个主存地址,(A1)表示A1所指向的地址中的内容
- 只需要单操作数,如加1、减1、取反、求补等
-
二地址指令
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
- 指令含义:(A1)OP(A2)→A1,完成一条指令需要访存4次,取指→读A1→读A2→写A1
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
-
三地址指令
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
- 指令含义:(A1)OP(A2)→A3,完成一条指令需要访存4次,取指→读A1→读A2→写A3
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
-
四地址指令
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
- 指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址,完成一条指令需要访存4次,取指→读A1→读A2→写A3
- 正常情况下:取指令之后PC+1,指向下一条指令;四地址指令:执行指令后,将PC的值修改为A4所指地址
- 常用于需要两个操作数的算术运算、逻辑运算相关指令
按指令长度分类
- 定长指令字结构:指令系统中所有指令的长度都相等
- 变长指令字结构:指令系统中各种指令的长度不等
指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一次存储单元中的二进制代码位数(通常和MDR位数相同)
半字长/单字长/双字长指令:指令长度是机器字长的多少倍
指令字长会影响取指所需时间(访存)
按操作码长度分类
- 定长操作码:指令系统中所有指令的操作码长度都相同
- 可变长操作码:指令系统中各指令的操作码长度可变
按操作类型分类
- 数据传送类:进行主存与CPU之间的数据传送
- LOAD:将存储器中的数据放到寄存器中
- STORE:将寄存器中的数据放到存储器中
- 运算类
- 程序控制类:改变程序执行的顺序
- 输入输出类:进行CPU与I/O设备之间的数据传送
扩展操作码指令格式
定长指令字结构+可变长操作码→扩展操作码指令格式
扩展操作码指令格式:不同地址数的指令使用不同长度的操作码
- 不允许短码是长码的前缀。即短操作码不能与长操作码的前面部分的代码相同
- 各指令的操作码一定不能重复
指令寻址
- 指令寻址:确定下一条要执行的指令的存放地址。由程序计数器PC指明。
- 顺序寻址:(PC)+"1"→PC
- 此处的"1"理解为1个指令字长
- 每次取指结束后,一定会PC+"1"
- 跳跃寻址:执行转移类指令导致的PC值改变( JMP、CALL)
注:每一条指令的执行都分为”取指令“、”执行指令“两个阶段
数据寻址
- 数据寻址:确定本条指令的地址码指明的真实地址
操作数的真实(有效)地址:EA
表中访存次数不包括取指
立即数寻址中地址码为补码,EA=当前指令所在地址
隐含寻址:操作数地址不是显式地给出,如单地址指令中一个操作数在ACC累加寄存器中
偏移寻址包括:基址寻址、变址寻址、相对寻址。区别在于偏移的”起点“不同。
- 基址寻址:以程序的起始存放地址作为”起点“。基址寄存器中存放程序起始存放地址,偏移量是指令中的形式地址。优点:便于实现多道程序并发运行,可用于编制浮动程序(整个程序在内存中浮动)。
- 变址寻址:程序员自己决定从哪里作为"起点"。变址寄存器内容可由用户改变,偏移量是变址寄存器。通过不断改变IX的内容,形成数组中任一数据的地址,适合编制循环程序。
- 相对寻址:以程序计数器PC所指地址作为”起点“。A是相对于下一条指令地址的偏移量,可正可负,补码表示。应用于转移指令,便于程序浮动(一段代码在程序中浮动)。
数的比较:PSW标志寄存器,有几个比特位记录相减后的运算结果。
硬堆栈:寄存器;软堆栈:主存中一块区域
CISC和RISC
CISC:Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能
代表:X86架构,主要用于笔记本、台式机等
RISC:Reduced Instruction Set Computer
设计思路:一条指令完成一个基本”动作“,多条指令组合完成一个复杂的基本功能
代表:ARM架构,主要用于手机、平板
80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令
习题
1.设某台计算机有100条指令,要求:
(1)采用固定长度操作码编码,试设计其操作码编码。
(2)假设这100条指令中有10条指令的使用概率达到90%,其余 90 条指令的使用概率达到10%,试采用不等长编码设计一种操作码编码的方案,并求出操作码的平均长度
解析:
(1)采用固定长度操作码编码,需要7位操作码。取其中100个代码作为操作码。
000 0000-110 0011之间的代码代表100条指令。其余的110 0100-111 1111共28个代码可用于增加新的指令。
(2)
采用不固定长度操作码编码,可以用4位代码对10条指令进行编码,用8位代码对90条指令进行编码。
0000~1001对应10条常用的指令;1010~1111之间的代码扩展4位,1010 0000~1111 1001之间的90个代码表示其余90条 指令。
平均长度:4×90%+8×10%=4.4
2.设有一台简单计算机的指令系统共有10条指令,各指令的使用频率如 下: I1 20%,I2 12%, I3 11%, I4 15%, I5 8%,I6 3%,I7 2%, I8 18%, I9 10%, I10 1%
(1) 用霍哈夫曼编码设计这10条指令的操作码,并计算操作码的平均长度;
(2) 设计只有两种长度,且平均长度不大于3.20位的等长扩展操作码,并计算操作码平均长度
解析:
(1)
-
把出现次数(概率)最小的两个相加,并作为左右子树(左小右大),重复此过程,直到概率值为1
-
将每个二叉树的左边指定为0,右边指定为1
-
沿二叉树顶部到每个字符路径,获得每个符号的编码
按概率从大到小排列:I1 0.2,I8 0.18,I4 0.15,I2 0.12,I3 0.11,I9 0.10,I5 0.08,I6 0.03,I7 0.02,I10 0.01
平均代码长度:2×0.2+3×0.18+0.15×3+0.12×3+0.11×3+0.1×3+0.08×4+0.03×5+0.02×6+0.01×6=3.03
(2)一种设计方案是取3位和4位两种长度,如
000 001 010 011 100 101 1100 1101 1110 1111
平均长度 =3×(0.20+0.18+0.15+0.12+0.11+0.10)+4×(0.08+0.03+0.02+0.01) = 3×0.86 + 4×0.14 = 3.14
另一种方案是取3和5两种长度,如
000 001 010 011 100 101 110 11100 11101 11110
平均长度 =3×(0.20+0.18+0.15+0.12+0.11+0.10+0.08)+5×(0.03+0.02+0.01) = 3×0.94 + 5×0.06 = 3.12
3.某计算机要求如下形式的指令:三地址指令4条,单地址指令254条,零地址指令16条,设指令字长12位,每个地址码3位,设计其编码。
解析:
三地址指令 | 000-011 | A1 | A2 | A3 | |
---|---|---|---|---|---|
单地址指令 | 100 xxxxxxxxx | 100 000000-111 111101 | A1 | ||
零地址指令 | 11111111 xxxx | 11111111 0000-11111111 1111 |
4.计算机指令长度为20位,有2地址指令,1地址指令,0地址指令。地址码长度6位,问若操作码字段固定长度为8位,现设计出m条2地址指令,n条0地址指令,此时该计算机最多可以设计出多少条1地址指令
解析:
操作码字段固定长度为8位。最多可以设计出1地址指令为28-m-n条=256-m-n 条
5.计算机指令长度为16位,有2地址指令,1地址指令,0地址指令。地址码长度6位,若m条2地址指令,n条0地址指令,问此时该计算机最多可以设计出多少条1地址指令。
解析:
先编2地址指令,有24种状态 ,编完留出24 - m种状态;再编1地址指令,可扩展出(24 - m)×26种状态,编完留出(24 - m)×26 - x 种状态;最后编0地址指令,可扩展出[(24 - m)×26 - x]×26种状态=n;所以1地址指令条数x为(24 - m)×26 - n/26
6.某16位计算机指令格式如下所示,其中OP为操作码,试分析指令格式的特点。
解析:
(1)单字长二地址指令。
(2)操作码字段OP为7位,操作码字段OP可以指定128条指令。
(3)源寄存器和目标寄存器都是通用寄存器(共16×2个寄存器 ),所以是RR型指令,两个操作数均在寄存器中。
(4)这种指令结构常用于算术逻辑运算类指令。
7.某16位机指令格式如下所示,OP为操作码字段,试分析指令格式特点。
解析:
(1)双字长二地址指令,用于访问存储器。
(2)操作码字段OP为6位,可以指定64种操作。
(3)一个操作数在源寄存器(共16个寄存器 ),另一个操作数在存储器中(由变址寄存器和位移量决定)所以是RS型指令。
8.
解析:
(1)立即寻址(2)相对寻址(3)变址寻址(4)寄存器间接寻址(5)间接寻址(6)基址寻址
9.一条指令存储在存储器中地址为300的地方,其操作数地址字段为301,地址字段的值为400,处理器中寄存器R1中包含数据200,在以下指令寻址方式下,求操作数的有效地址。
(1)直接寻址
(2)立即数寻址
(3)相对寻址
(4)寄存器(R1)间接寻址
(5)以R1为变址寄存器的变址寻址
解析:
300中是操作码 301是地址码说明占两个地址
300|301|400
R1 200
(1)EA=400(2)EA=301(3)EA=(PC)+400(4)EA=200(5)EA=600
10.假设寄存器R中的数值为1000,地址为1000的存储器中存储的数据为 2000,地址2000的存储器中存储的数据为3000,pc的值为4000,问在以下寻址方式下访问的指令操作数的值是什么?
(1)寄存器寻址R
(2)寄存器间接寻址(R)
(3)直接寻址1000
(4)存储器间接寻址(1000)
(5)相对寻址 -2000
(6)立即数寻址 #2000
解析:
1000|2000
2000|3000
PC|4000
R|1000
(1)1000(2)2000(3)2000(4)3000**(5)3000**(6)2000
11.某机器字长16位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一字节为操作码字段,第二字节 为相对位移量字段。假定取指令时,每取一个字节PC自动加1。若某转移指令所在主存地址为2000H,相对位移量字 段的内容为06H,则该转移指令成功转以后的目标地址是 ()
A.2006H
B.2007H
C.2008H
D.2009H
解析:
转移指令由两个字节组成,每取一个字节PC自动加1,则取一个指令PC应该加2,所以目标地址为主存地址+增加量+偏移量=2000H+02H+06H=2008H
所以答案为C
12.偏移寻址通过将某个寄存器内容与一个形式地址相加而生成有效地址。下列寻址方式中,不属于偏移寻址方式的是()
A.间接寻址
B.基址寻址
C.相对寻址
D.变址寻址
解析:
偏移寻址包括:基址寻址、变址寻址、相对寻址。区别在于偏移的”起点“不同。
所以答案为A
13.例:假设变址寄存器的内容为1000H,指令中的形式地址为2000H,地址1000H的内容为2000H,地址 2000H的内容为3000H,地址3000H的内容为4000H, 则变址寻址方式下访问到的操作数是( )
A.1000H
B.2000H
C.3000H
D.4000H
解析:
EA=2000H+1000H=3000H
操作数值=4000H
所以答案为D
14.某指令格式如下所示。 其中M为寻址方式,I为变址寄存器编号,D为形式地址。若采用先变址后间址的寻址方式,则操作数的有效地址是 ()
A. I+D
B. (I)+D
C. ((I)+D)
D. ((I))+D
解析:
先变址:EA=(I)+D;后间址:EA=((I)+D)
所以答案为C
15.下列寻址方式中,最适合按下标顺序访问一维数组元素的是()
A. 相对寻址
B. 寄存器寻址
C. 直接寻址
D. 变址寻址
解析:
- 基址寻址:以程序的起始存放地址作为”起点“。基址寄存器中存放程序起始存放地址,偏移量是指令中的形式地址。优点:便于实现多道程序并发运行,可用于编制浮动程序(整个程序在内存中浮动)。
- 变址寻址:程序员自己决定从哪里作为"起点"。变址寄存器内容可由用户改变,偏移量是变址寄存器。通过不断改变IX的内容,形成数组中任一数据的地址,适合编制循环程序。
- 相对寻址:以程序计数器PC所指地址作为”起点“。A是相对于下一条指令地址的偏移量,可正可负,补码表示。应用于转移指令,便于程序浮动(一段代码在程序中浮动)。
所以答案为D
16.某16位机器所使用的指令格式和寻址方式如下所示,该机有两个20位基址寄存器,四个16位变址寄存器,十六个16位通用寄存器,指令汇编格式中的S(源),D(目标)都是通用寄存器,M是主存中的一个单元。 三种指令的操作码分别是MOV(OP)=(A)H ,STA(OP)=(1B) H ,LDA(OP)=(3C)H。MOV是传送指令,STA为写数指令,LDA 为读数指令。
⑴分析三种指令的指令格式与寻址方式特点。
⑵CPU完成哪一种操作所花时间最短?哪一种操作所花时间最长?第二种指令的执行时间有时会等于第三种指令的执行时间吗?
⑶下列情况下每个十六进制指令字分别代表什么操作?其中如果有编码不正确,如何改正才能成为合法指令?
①(F0F1)H (3CD2)H
②(2856)H
③(6FD6)H
④(1C2)H
解析:
(1)第一种指令是单字长二地址指令,RR型;第二种指令是双字长二地址指令,RS型,其中S采用基址寻址或变址寻址,R由源寄存器决定;第三种也是双字二地址指令,RS型,其中R由目标寄存器决定,S由20位地址(直接寻址)决定。
(2)处理器完成第一种指令所花的时间最短,因为是RR型指令,不需要访问存储器。第二种指令所花的时间最长,因为是RS型指令,需要访问存储器,同时要进行寻址方式的变换运算(基址或变址),这也要时间。第二种指令的执行时间不会等于第三种指令,因为第三种指令虽也访问存储器,但节省了求有效地址运算的时间开销。
(3)MOV(OP)=(A)H=001010
STA(OP)=(1B)H =011011
LDA(OP)=(3C)H=111100
①(F1F1)h(3CD2)h=1111 0000 1111 0001 0011 1100 1101 0010正确,将主存(13CD2)H地址单元的内存取至15号寄存器
②(2856)H=0010 1000 0101 0110正确,单字长指令,将寄存器6的内容传送到寄存器5
③(6FD6)H=0110 1111 1101 0110,操作码不对,应修改为单字长指令0010 1000 1101 0110(28D6)H
④(1C2)H=0000 0001 1100 0010,操作码不对,应修改为(28C2)H
17.一台处理器具有如下指令格式:
格式表明有8个通用寄存器(长度为16位),X指定寻址方式,主存实际容量为256K字。
(1)假设不用通用寄存器也能直接访问主存中的每一个单元,并假设操作码域OP=6位,请问地址码域应分配多少位?指令字长度应有多少位?
(2)假设X=11时,指定的某个通用寄存器用作基址寄存器,请提出一个硬件设计规则,使得被指定的通用寄存器能访问1M主存空间中的每一个单元。
解析:
(1)要能直接访问主存中的每一个单元,主存地址范围256K=218(一个字就是一个存储单元),地址码域18位;指令字长度6+2+3+3+18=32位
(2)此时指定的通用寄存器用作基址寄存器,长度为16位,不能覆盖1M字空间,可采用通用寄存器左移4位,低位补0,形成20位的基地址, 然后与指令字形式地址相加得到有效地址,可以访问1M字空间的任意一 个单元。
18.某机的16位单字长访内存指令格式如下:
其中,A为形式地址,补码表示(其中一位为符号位):
I为直接/间接寻址方式:I=1为间接寻址,I=0为直接寻址方式;
M为寻址模式:0为绝对地址,1为基地址寻址,2为相对寻址,3为立即寻址;
X为变址寻址。
设PC,Rx,Rb分别为指令计数器,变址寄存器,基地址寄存器,E为有效地址,请回答以下问题:
(1)该指令格式能定义多少种不同的操作?立即寻址操作数的范围是多少?
(2)在非间接寻址情况下,写出各计算有效地址的表达式
(3)设基址寄存器为14位,在非变址直接基地址寻址时,确定存储器可寻址的地址范围
(4)间接寻址时,寻址范围是多少?
解析:
(1)操作码4位,16种不同的操作;形式地址8位(1位为符号位),立即寻址操作数范围-128~+127
(2)绝对(直接)寻址E=A;基地址寻址E=Rb+A;相对寻址E=PC+A;立即寻址D=A;变址寻址E=Rx+A
(3)直接基地址寻址E=Rb+A,14位,214=16K,可寻址的地址范围0-16K-1
(4)间接寻址E=(A),16位,寻址范围64K
19.某计算机字长为16位,主存地址空间大小为128KB, 按字编址。采用单字长指令格式,指令各字段定义如下
转移指令采用相对寻址,相对偏移是用补码表示,寻址方式定义如下:
注:(X)表示有存储地址X或寄存器X的内容,请回答下列问题:
(1)该指令系统最多可有多少指令?该计算机最多有多少个通用寄存器?存储地址的寄存器(MAR)和存储数据的寄存器 (MDR)至少各需多少位?
(2)转移指令的目标地址范围是多少?
(3)若操作码0010B表示加法操作(助记符为add),寄存器R4和R5得编号分别为100B何101B,R4的内容为1234H,R5的 内容为5678H,地址1234H中的内容为5678H,5678H中的内容为1234H,则汇编语言为
add (R4),(R5) +
(逗号前为源操作符,逗号后目的操作数)
对应的机器码是什么(用十六进制)?该指令执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?
解析:
(1)OP4位,最多16条指令;Rs/Rd3位,最多8个通用寄存器;某计算机字长为16位,主存地址空间大小为128KB, 按字编址,MAR16位;MDR16位
(2)主存地址,转移指令的目标地址16位,范围0~216-1
(3)机器码:0010 001 100 010 101=0010 0011 0001 0101=2315H
该指令的功能是将R4中所指地址中数据(源)与R5中所指地址中数据(目标)的内容相加后,写到R5中地址所指的存储单元
(R5)、((R5))会改变;((R5))=5678H+1234H=63ACH,(R5)=5678H+1=5679H