A扩展操作码不同的寻址方式会增加移码难度、因为需要根据不同的操作码进行不同的数据寻址方式
B正确,如寄存器寻址编址,缩短地址位数;寄存器间接寻址,扩大寻址空间
C程序的控制是通过转移指令实现的,寻址方式是用来获取操作数的
A虽然立即寻址在定长指令中执行速度最快,而在变长指令码中寄存器寻址是最快的,注意区分,但是相比于只需要寄存器编号即可的寄存器寻址的地址位数还是要大,因为立即数的指令码长;
注意的是:通常立即数、直接、间接指令码最长
B、C变址、基址、相对都是偏移寻址,偏移量用补码表示,形式地址形式地址A通常都是比较大的,需要多位来表示
D正确,只需要寄存器的编号即可
立即数寻址在指令中包含操作数,操作数以补码的形式表示,无需访存
注意区分基址寻址、变址寻址:
基址寻址:EA=(BR)+A A为偏移量可变,而BR寄存器的内容不可变为起始地址,而且基址寻址有利于多道程序并发 且整个代码在内存里浮动,是面向操作系统的
变址寻址:EA=(IX)+A A为基址不可变,而IX寄存器的内容可变为偏移量,而且变址寻址有利于解决数组问题,适合编址循环程序,是面向用户的
A正确
在多道程序设计中,需要程序段在内存中浮动,而选项中并没有基址寻址,那么就要退而求其次,基址寻址是可以让整个代码在内存中浮动,而相对寻址是让一段代码在程序内部浮动,也是在内存中浮动只是范围小
A正确
该题目为二地址指令,因为有源操作数和目的操作数
①有16个通用寄存器那么都要标记到需要用到log2 (16)=4bit
②OP、寻址方式8位
③源操作数直接寻址
④目的操作数基址寻址
①机器字长–计算机进行一次整数运算所能处理的二进制位数 --那么参与运算的就只有ALU、X通用寄存器了 这两个的位数与机器字长相同
②指令字长—与IR位数相关,一条指令的位数
③MDR与IR位数,因为取指阶段M(MAR)->MDR后需要把MDR的内容放入IR指令寄存器进行分析
④PC的位数与存储器的字长/字数、指令字长、存储字长、存储器容量都相关–因为一条指令占多少位可以用存储器的容量除以/指令字长即可获得地址需要占用的位数,而MAR通常与PC位数相同,那么PC位数就取这两者的最小值即可。
各个存储器的透明性
举例例题
王道P193 T23题
这题中MDR=32位;4GB的主存=2^32B ; 指令字长=32位=4B
地址位数= 2^32B/4B
所以地址位数=30位 且PC通常与指令字长相同,但是这里采用了字边界对齐存放,一个字30位,所以PC位数=30位
A:取反、移位只需要一个数据A错
B:左移右移的一位 A<<1,只要 一个操作数 shl A
C:转移资料不是为了数据调用的次序,而是指令执行的次序
D:正确
这题我傻了当时,2100H-2000H=100H,我用了100/8B 忘记100H是16进制了,我傻了。。。
100H=256B
256B/8B=32
所以偏移量=32
B:正确
这题的话我也傻了,我首先是用扩展FF12H->FFFFFF12H
F0000000H+FFFFFF12H=EFFFFF12H
48条指令的OP操作码需要用几位来表示呢? 26>48>25 所以需要用6位表示
4种寻址方式 log2 (4)=2位表示
所以正确答案为A 8位无符号数原码0<=x<=255 共256个
总结:
①立即数寻址:A为操作数,无需访存,表示方式为补码
②直接寻址、间接寻址的A都采用无符号数原码表示 我认为是因为直接寻址、间接寻址都是在访问存储单元的地址,而地址是无符号数,所以就采用无符号数原码表示了
③偏移寻址:相对寻址、基址寻址、变址寻址 的偏移量都是采用补码表示
1)EA=A 注意不是201 因为201是load指令的操作数即为地址部分A为201的内容 EA=500 所以装入ACC的内容为主存地址为500的内容 装入ACC的值=800
2) Load指令种的地址部分即为操作数 EA=201 装入ACC的值=500
3)间接寻址:EA=(A),这个为一次间接寻址 A的内容为操作数的地址,而A为操作数地址的地址,注意区分
4)相对寻址:EA=(PC)+A这个很重要,考试经常考,因为很多人会忽略PC的偏移量是当前指令的下一条指令的偏移量,因为当计算机取指令后PC会自增,PC=PC+指令字长,所以偏移量是下一条指令的偏移量
如这题所示PC=200,那么取指令后PC=200+2=202,那么为什么加2呢?这是因为,题目中给出了这是一条双字长指令,那么PC=(PC)+2,A=500所以 PC=202+500=702,如果题目中再加上一条坑人的700H的地址内容会有人跳吗? 所以装入ACC的值为=325
扩展:
这是双字长指令,那么如果其他指令都是双字长指令,这个系统就是RISC,因为定长指令
但若是其他指令有些不是双字长指令,那么这些指令长度就是不一致的,那么就是CISC指令集系统
5)变址寻址:EA=(XR)+A,A为基址,XR的内容为偏移量,EA=600,所以装入ACC的值=900
6)EA=R1,寄存器寻址,寄存器中的内容即为操作数,而EA有效地址即为寄存器的编号,所以装入ACC的值=400
7)EA=(R1)=400,寄存器间接寻址,是寄存器+访问主存,寄存器的内容是指向主存的地址的,所以操作数是在主存中的 ,因此装入ACC的值=700
这里我傻了!!居然忘记了机器字长只与ALU、X通用寄存器的位数有关,我承认我入坑了
这里主存按字编指,注意不是字节编址,我是这里看错入坑了,偏移量为8位=1B,一条指令16位=2B,一个字长度=机器字长位数=16位,所以一条指令与内存的一个地址对应,所以PC自增是PC=(PC)+1
因此需要注意的是
③1322H,第8~9位为11 所以为相对寻址,
PC=(PC)+1+D=1+1234H+22H=1257H
⑤6723H 第8~9位为11 所以为相对寻址,PC=(PC)+1+D=1+1234H+23H=1258H
3、P173 T5
这里的指令各段定义很容易让人一头雾水,其实看了定义后,再看看寻址方式表就知道这个结构式怎么样的了,MS/MD都占3位,所以0~5是包含Rd和Md的,Md占三位,Rd,而不是Rd 0~4,md 5这是错的,同样的,Ms、Rs占6~11位,Ms占三位,Rs=6-3=3位,源操作数、目的操作数各占6位
主存地址空间=128KB=217B,主存按字编址,一个字长度=机器字长=16bit=2B,所以有多少个地址的?=217B/2B=216个地址,需要16位表示所以MAR=16位,MDR=16位 至少与机器字长相同
到这里该题目的结构逻辑就理解了
1)12~15,OP占4位,最多就只有24=16条指令
2)因为MAR=16位,地址宽度16位可以表示0~216-1的范围
3)这题虽然表达得很长,其实挺简单的
①add (R4),(R5)+ 看表做题,R4采用寄存器间接寻址,寄存器编号为4=100B,R5采用寄存器间接+自增寻址,R5寄存器编号位5=101
因此机器码二进制为:0010 001 100 010 101 =2315H
②R5改变了内容!注意的是看表中得知,寄存器间接、自增寻址方式,是取出操作数后,在自增,所以说R5改变后内容变为68ACH(这题我是错了这个问,没有认真审题看表,就写了先自增后取数,哎!傻了!)
4、P17 T7
此题重点考察:PWS状态位:OF、SF、ZF、CF的值、相对寻址、存储器编址判断
此题是重点,因为这题很考逻辑,也非常值得总结归纳(已经归纳到导图中)
(这题看了咸鱼学长的王道强化课后就可以自己做出来,理清思路,满分到手)
首先先理解题目的意思:16位的定长指令字结构, CF、SF/NF、ZF存储在PSW中,用于判断溢出、比较正负大小、判断是否转移
而题目中的C、Z、F是在指令中的,用于检验PSW中对应的值,只要有一个为1则转移,说明最后的输出是或操作输出,而检验位则必定是与CF、SF/NF、ZF进行与操作。
1)①由PC的顺序执行和转移PC的变化可知,顺序执行时PC=(PC)+2,而16位的指令字长=2B,刚好就是偏移了2B的大小,说明该存储器时按字节编址的,由此得出该计算机存储器是按字节编址的,若改成PC=(PC)+1则说明该存储器是按字编址的
②由题目的指令格式OFFSET在0~7共8bit表示,按补码表示-128<=OFFSET<=127,注意的是PC取指令后PC自增2,那么偏移量是PC自增2后的偏移量,即为当前指令的下一条指令的偏移量,所以PC=(PC)+2-2128 可得表达式 PC=(PC)-254,因此本条指令可以向上偏移-254B/2B=-127条,所以最多可以跳转127条指令
2)这问理解原理后so case
①因为CF=0,ZF=0,NF=1与C,Z,N分别&相与后,为001,所以跳转,OFFSET为补码且要左移,先将OFFSET左移得11000110=C6H=-3AH,PC=(PC)+2-3AH=200CH+2-3AH=1FD4H
②CF=1,ZF=0,NF=0,与C、Z、N相与后为000,所以不跳转,所以PC=(PC)+2=200EH
3)<=,if(xx<=XX),cmp指令本质就是减法,无符号数OF、SF无意义,所以O、S/N检验位=0即可,无符号数加法判断溢出、无符号数减法判断是否借位看CF,CF=1加法溢出,减法借位
因为是<=,A<=B 用A-B,A比B小的话,肯定会借位,判断相等看ZF,相减后所有位全位0,ZF=1,所以C=1,Z=1,N=0(N为有符号数判断正负的,对于无符号数来说无意义),因此为110
4)由前面题目的逻辑,这个填空题就是前面小问的逻辑变硬件化
①因为OP C Z N OFFSET都是在指令中的,因此取指令的操作肯定是在IR寄存器中,所以为指令寄存器
②OFFSET再左移后才能和(PC)+2相加,因此②为移位寄存器
③PC与加法器进行+2操作后又与②的2OFFSET有一个操作,由转移指令可得,该操作应该为加法,因此③为加法器
5、P17 T9
此题重点考察:CISC/RISC的区别、PWS状态位:OF、SF、ZF、CF的值
1)CISC(Complex Instruction System Computer),因为图中的55、39 4D F4等等这些机器指令长度不一,所以是CISC指令集系统
总结:能看出来CISC与RISC指令集系统的方法通常就两种
①看指令长度是否一致
②RISC指令只能通过Load和Store指令访存,而CISC没有限制
2)0040107F-00401020+1=0000005F+1=60H=96B
3)①CF=1,②因为:通过CMP的i-(n-1)比较i和n-1,i=0,所以i=0000 0000H,因为n=0,所以n-1=-1=FFFF FFFFH,所以i-(n-1)=0000 0001H,CF=Sub⊕Cout(n),Cout(n)=0,Sub=1;CF=1;
4)这题当时不会写,乱写了个左移会导致阶码溢出,但是这个本来就是错的,因为阶码左移只会变小,右移才会变大,左移右边加0,右移左边添1,其实是浮点数中的包含了数符、阶码、尾数,整体左移并不能达到2的目的,因为浮点数的真值是通过特定的公式计算的,存储的只是浮点数的格式,而int类型存储的二进制数直接转换为十进制数就是其真值,所以int类型左移可以达到2的目的
1)①第一问就是送分题,f(10)肯定是调用了10次啊!,因为题目中<=1已经返回 1了,而如果改一下题目,把if条件改成if(n>=1),则需要调用11次
②call指令是一定会改变PC的值的,一定跳转,所以call指令会递归调用f1
2)①条件转移指令jle、jmp
②jmp、call、ret一定会使得程序跳转执行
总结:①jxx。。指令除了jmp这个无条件转移指令外,都是条件转移指令
②:jmp、ret、call所以一定会是程序跳转,一定会改变PC值
3)①按图中所示,16行的机器指令有5个字节大小的指令、且计算机M按字节编址,所以PC=(PC)+5
②偏移量:取值后PC自增指向下一条指令。所以PC=(PC)+5=0040102A
00401000-004012A=-2AH=D6H
总结:根据题目的条件可以判断出:①该指令集系统是CISC
②该偏移量没有乘指令字长,是因为每一条的指令长度都不一致,所以PC=(PC)+本条指令字长+偏移量(补码)(该偏移量是总的偏移量从第17行偏移到第1行),如果是RISC指令集系统,那么就可以使用MOFFSET(M与指令字长、字节/字编址有关),PC=PC+M+MOFFSET,因为每一条指令的长度是定长的