干货分享(1)——指令系统的那些个要点
直接上干货,废话不多说。
大纲:
1、机器指令的基本格式
2、地址码结构
3、扩展操作码
4、九种基本的数据寻址方式
5、存储器堆栈
详细内容:
机器指令基本格式
机器码字段 |
地址码字段 |
机器字长:值计算机能直接处理二进制数据的位数
指令字长:一条指令中包括二进制的位数
单字长指令:指令长度等于机器字长的指令
双字长指令:指令长度等于两个机器字长的指令
2.2 地址码结构
1)四地址指令
OP |
A1 |
A2 |
A3 |
A4 |
指令含义:(A1)OP(A2)->A3
A4=下一条将要执行指令的地址
注意:(A1)代表从A1地址中取出操作数,()代表取数值操作
2)三地址指令
OP |
A1 |
A2 |
A3 |
指令含义:(A1)OP(A2)->A3
(pc)+1->pc
注意:程序计数器(PC)用于指出下一条指令在主存中的存放地址
3)二地址指令
OP |
A1 |
A2 |
指令含义:(A1)+(A2)->A1
(pc)+1->pc
其中:A1为目的操作数地址,A2为源操作数地址
4)一地址指令
OP |
A1 |
指令含义:(Acc)OP(A1)->Acc
(pc)+1->pc
其中:Acc为;累加寄存器(Accumulator Acc)
5)零地址指令
OP |
实现这一构想的硬件结构是堆栈
小结:该知识点主要理解好指令的含义即可
例题1(14年选择题)
单地址指令中为了完成两个数的算术运算,除地址码指明的一个操作数外,另一个常需采用______
A.堆栈寻址方式 B.立即寻址方式
C.隐含寻址方式 D.间接寻址方式
分析:A选项是零地址指令的情况,堆栈成为提供操作数和保存运算结果的唯一场所。B,D选项不属于这5种指令的情况,因为Ai就代表了操作数地址,所以二地址、三地址、四地址指令都是直接寻址方式,正确答案是C,单地址指令的隐含操作数存放在专门的寄存器中,即Acc.
2.3 扩展操作码(重点)
优点:既能充分利用指令的各个字段,又能在不增加指令长度的情况下扩展操作码的位数,使它能表示更多的指令。
例题2(14年综合题)
设指令字长为16位,每个操作数的地址码为6位,指令有零地址,一地址、二地址3种格式
设指令系统的操作码长度和位置固定,若零地址指令有M中,一地址指令有N种,则二地址指令最多有几种?
若采用扩展操作码技术,二地址指令最多有几条?
采用扩展操作码技术,若二地址指令有P条,零地址指令有Q条,则一地址指令最多有几种?
解:(1)由题意知这是个定长操作码,指令字长16位,操作数地址码Ai为6位,因此可以画出零地址、一地址、二地址的指令格式
4位
OP |
指令格式: 零地址
4位 6位
OP |
A1 |
一地址
4位 6位 6位
OP |
A1 |
A2 |
二地址
其中零地址指令M条,一地址指令N条。我们知,指令的操作码长度固定为4位,最多可表示出2^4=16条指令。也即16条=M+N+P(其中P为二地址指令条数),因此P=16-M-N。
扩展操作码的指令格式:
16位
OP |
指令格式: 零地址
10位 6位
OP |
A1 |
一地址
4位 6位 6位
OP |
A1 |
A2 |
二地址
(2)采用扩展操作码,则操作码的长度不固定。二地址指令的操作码为4位,本来最多可表示16条二地址指令。但是由于是扩展操作码,至少要留一个二地址指令作为扩展窗口,来形成一地址指令。因此二地址指令最多有:
16-1=15条
(3)同样也是采用扩展操作码。我们知,每条二地址指令用来扩展形成一地址指令,可以造出2^6条一地址指令。同理,每条一地址指令用来扩展形成零地址指令,可以造出2^6条零地址指令。
现在题目问一地址指令最多有几种,那么我们应该转成求最多有多少条二地址指令可供扩展,因为每多一条二地址指令,就能多出2^6条一地址指令。
题目已经告诉我们有二地址指令P条,这P条是不能作为扩展窗口的,那么剩下的(2^4-p)条指令都能作为一地址的扩展窗口,也即最多可以造出(2^4-p)*2^6条一地址指令。
看似题目求到这就求完了,但是题目还告诉了我们零地址指令有Q条,说明同样需要用一地址指令用来扩展成零地址指令,那么不用来扩展的一地址指令条数记为R条才是我们最终要求的答案(因为用来扩展的一地址指令都成最后的零地址指令了)
这里满足一个等式:[(2^4-p)*2^6-R]*2^6=Q
由该等式求得R=(2^4-p)*2^6-ceil(Q/2^6),其中ceil代表向上取整
注:这道题非常有代表性,几乎涵盖的定长操作码和扩展操作码考题的知识点,务必要掌握并理解透彻,该题理解了,其他类似的题就很简单了。
练习题:
练习题1(05年真题问答题):设指令长度为二进制16位,地址长度为4位,请设计一指令系统,使分别具有零地址、一地址和二地址的指令(要求指令条数最多)
提示:要使指令条数最多,那么要求不进行扩展的指令要尽可能的多,也即二地址指令留一条指令作为扩展窗口,同理一地址指令也只留一条指令作为扩展窗口。
练习题2(06年综合题):假设某机器的指令的长度为16位,包括4位基本操作码字段和三个4位地址段,请设计具有15条三地址指令,15条二地址,15条一地址和16条零地址的指令格式。
提示:稍微分析一下题目条件,15条三地址指令,15条二地址,15条一地址,16条零地址,这不就是指令条数最多的情况吗,和05年的那题其实是一个意思,这两道题是同一道题,只不过换了一种说法。
2.4 基本的数据寻址方式(9种)【超级重点,必考考点】
寻址方式 |
有效地址 |
用途及特点 |
立即寻址 |
|
通常用于给寄存器赋初值 |
隐含寻址 |
|
缩短指令字长 |
直接寻址 |
EA=A |
|
间接寻址 |
EA=(A) |
扩大寻址范围,易于完成程序返回 |
寄存器寻址 |
EA=Ri |
减少指令字的长度,执行速度快 |
寄存器间接寻址 |
EA=(Ri) |
扩大寻址范围 |
基址寻址 |
EA=(Rb)+A |
适用于多道程序设计 |
变址寻址 |
EA=(Rx)+A |
处理数组问题和循环程序 |
相对寻址 |
EA=(PC)+A |
转移指令和程序浮动 |
先间址再变址 |
EA=(Rx)+(A) |
|
先变址再间址 |
EA=((Rx)+A) |
|
页面寻址 |
EA=PC//A |
|
说明: A为形式地址,EA为有效地址,操作数S=(EA)
注:1) 基址寻址与变址寻址的区别:基址寻址中,基址寄存器中的内容由操作系统确定,用户不可变,但偏移地址可变;
变址寻址中,变址寄存器是由用户设定的,其值可变,但指令字的形式地址A不可变
2)相对寻址是基于程序局部性原理
3)在各种寻址方式中,指令的地址码字段可能出现的情况:
a.寄存器编号 b.设备端口地址 c.存储器的单元地址 d.数据
寻址特点比较:
a.间接慢,直接快
b.内存慢,寄存器快,立即数更快
c.要运算的慢,不需要运算的快
d.间接的复杂,直接的简单
e.直接的死板,间接的灵活
f.内存地址长,寄存器地址短
几种数据寻址操作数存放位置比较:
1)立即寻址的操作数:存在于指令中,只要取出指令,也就取出了可以立即使用的操作数。
OP |
立即数 |
从立即寻址的指令格式可以发现,指令中在操作码字段后面的部分不是通常意义上的操作数地址,而是操作数本身。
2)寄存器寻址:操作数存放在寄存器中。根据寄存器编号Ri找到对应的操作数S=(Ri)
3)其他七种寻址:操作数都存放在主存。以直接寻址为例,通过指令的地址码到主存的相应位置取操作数。
说明:对该知识点,应该能做到很熟悉每种寻址方式的有效地址计算方式EA,以及操作数S=(EA)。该知识点直接点和第六章的数据通路直接挂钩,也是一个必考点,历年大题经常把这两个知识联合考察,还是有一定难度,复习时应高度重视。
例题3(13年选择题):若指令中地址码给出的是操作数的有效地址,这种寻址方式为()
A.立即寻址 B.直接寻址 C.间接寻址 D.相对寻址
答案:B
例题4:计算器指令中要用到的操作数一般可来自()部件
A.通用寄存器 B.内存存储单元 C.外设接口中的寄存器 D.以上情况均可
答案:D
例题5(选自高分笔记):某机器字长16位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一字节为操作码字段,第二字节为相对位移量字段。假定取指令时,每取一个字节PC自动加1.若某转移指令所在主存地址为2000H,相对位移量字段的内容为06H,则该转移指令成功转移后的目标地址是()
A.2006H B.2007H C.2008H D.2009H
分析:题目说的是相对寻址,因此先写出计算相对寻址的有效地址的式子:
EA=(PC)+A,而A是已知的,只需确定取值后PC的值。
我们知相对寻址由程序计数器(PC)提供基准地址,本题的(PC)=2000H
由题知,转移指令由两个字节组成,每取一个字节PC自动加1,由于每条指令由两个字节组成,因此取指令后PC值为2002H.[(PC)+2->PC]
故EA=(PC)+A=2002H+06H=2008H
注:看清题目是字编址还是字节编址。
说明:由该题我想再补充一点关于相对寻址的特点(课本P60):
对于指令地址而言,操作数地址可能在指令地址之前或之后,因此,指令中给出的位移量可负、可正,通常用补码表示。如果位移量为n位,则相对寻址的寻址范围为:(PC)-2(n-1)~(PC)+2(n-1)-1
这是个小知识点,在课本60页,去年综合题的一个小问考到了,注意这给的是补码的情况。
练习题(14年填空题):设相对寻址的转移指令占两个字节,第一字节是操作码,第二字节是用补码表示的相对位移量,若转移指令地址为200aH,要求转移到2002H,则该转移指令第二字节内容为_____
注:这里先不给出答案,自己看清题目再稍加思考,不难得出结果。
例题6(13年真题综合题):
设有一台计算机,其指令长度为16位,指令格式如下:
该指令的功能是(R) ← (R)OP(M/D)
其中OP为操作码,占5位;第一操作数R为寄存器直接寻址,第二操作数由M和D共同决定寻址方式(M为寻址方式,D为形式地址)且规定如下:
M=000,为立即寻址,D为立即数;
M=001,为相对寻址,D为位移量;
M=010,为基址寻址,D为位移量;
M=011,为寄存器间接寻址,D为寄存器号;
假定要执行的指令为加法指令(ADD),存放在002000单元中,D的值为02,该指令执行前存储器内容如图1所示;通用寄存器组、变址寄存器和基址寄存器内容如图2所示。问:当M分别为以下几种情况时,该指令执行后,结果是什么?(要求写出计算过程)(8分)
(1)当M=000 时,结果是什么?放在哪个寄存器中?
(2)当M=001时,结果是什么?放在哪个寄存器中?
(3)当M=010时,结果是什么?放在哪个寄存器中?
(4)当M=011时,结果是什么?放在哪个寄存器中?
图 1 存储器内容
图 2 寄存器内容
分析:本题考查的知识点是数据寻址,要求考生能十分熟悉每种数据寻址的特点,并能根据不同的数据寻址做出相应的运算。
先来罗列一下已知的条件:
1)
该指令的功能是(R) ← (R)OP(M/D)
其中OP为操作码,占5位;第一操作数R为寄存器直接寻址,第二操作数由M和D共同决定寻址方式(M为寻址方式,D为形式地址)
2)假定要执行的指令为加法指令(ADD),存放在002000单元中,D的值为02
根据2),我们知道OP是ADD操作,指令功能进一步写成:
(R) ← (R)ADD(M/D)
加法指令ADD有两个操作数,第一个操作数R为寄存器直接寻址,也就是说只要找到了所在的寄存器号Ri,那么第一操作数的值即为S1=(Ri);
指令的8-10位是寄存器,查看编号是001,即为R1
找到R1对应的值,即S1=(R1)=002004
第二个操作数是由(M/D)共同确定,这个就要回到问题里面去分析,总之就是再找到第二个操作数的值S2. 然后再(S1)+(S2)->(R1),也即把最终的结果存回到R1寄存器中。
因此,本题的关键点就是求第二操作数S2.带着这个问题方向回到题目中寻找答案。
(1)M=000,由题意知为立即寻址,D为立即数,且D=2.因此S2=D=2
结果S=S1+S2=002004+02=002006,结果存放在R1
(2) M=001,由题意知为相对寻址,D为位移量。
相对寻址的EA=(PC)+D,其中D=02
由内存地址图知,加法指令ADD在内存的初始地址是(PC)=002000.
而该指令是16位(说明是两个字节,PC需要增加两步),那么当把指令取出,要执行(PC)+2->PC操作,
故EA=002002+02=002004,则S2=(EA)=001150
故结果S=S1+S2=002004+001150=03154,结果存放在R1
当CPU从存储器中取出一个字节时,会自动执行(PC)+1→PC。程序计数器PC在取出指令后PC=PC+1
(3)M=010,为基址寻址,D为位移量
基址寻址的EA=(Rb)+D,其中D=02
由题目中的基址寄存器图知(Rb)=002004,由此得EA=002006
故S2=(EA)=001250,所以S=S1+S2=002004+001250=003254,存放在R1中。
(4)M=011, 为寄存器间接寻址,D为寄存器号;因为D=02,所以另一个寄存器是R2
寄存器间接寻址的EA=(Ri),故EA=(R2)=004004,则S2=(EA)=002016
所以S=S1+S2=002004+002016=00401A,存放在R1中。
练习题:某机的机器字长为16位,主存按字编址,指令格式如下:
15 10 9 8 7 0
操作码 |
X |
D |
其中,D为位移量,X为寻址特征位。
X=00:直接寻址
X=01:用变址寄存器X1进行变址
X=10:用变址寄存器X2进行变址
X=11:相对寻址
设(PC)=1234H, (X1)=0037H (X2)=1122H (H代表十六进制)
请确定下列指令的有效地址
(1)4420H (2)2244H (3)1322H (4)3521H (5)6723H
详解:
(1)4420=0100 01 00 0010 0000H
00表示直接寻址Addr=(A)=20H
(2)2244H=0010 00 10 0100 0100H
D=0100 0100H=44H
10表示变址寄存器X2,Addr=(X2)+D=1122H +44H
(3)1322H=0001 0 0 11 0010 0010 H
D=0010 0010 H=22H
11表示相对寻址, Addr=(PC)+D=1234H+22H
(4)3521H=0011 01 01 0010 0001H
(5))6723H=0110 01 11 0010 0011H
D=0010 0011H=23H
Addr=(X2)+D=1122H +44H
1.X=00,D=20H,EA=20H |
说明:这题比较死板,远不如真题的灵活,毕竟没有那么多图,这题只要对各种数据寻址比较熟悉,应该是比较简单的,先不提供答案,由自己完成。
2.5 存储器堆栈
(1)自底向上生成(向低地址方向生成)堆栈
进栈:
(SP)+1->SP ;修改栈指针
(A)->(SP) ;将A中的内容压入栈顶单元
出栈:
((SP))->A ;将栈顶单元内容弹出送入A中
(SP)+1->SP ;修改栈指针
(2)自顶向下生成(向高地址方向生成)堆栈
这种堆栈与自底向上堆栈正好相反,它的栈底地址小于栈顶地址。进栈时,先令(SP)+1->SP,然后再压入数据;出栈时,先将数据弹出,然后(SP)-1->SP
例题7(14年选择题):在向下生成的堆栈中,如果入栈指令PUSHX的操作定义为:(SP)+1->SP,M(X)->M(SP),则出栈指令POPX应定义为___
A.(SP)-1->SP, M(SP)->M(X) A.(SP)+1->SP, M(SP)->M(X)
C.M(SP)->M(X), (SP)-1->SP D..M(SP)->M(X), (SP)+1->SP
答案:C