1、“821.2016T1(1)”,表示821真题,2016年的题,T1是 选择题/填空题/大题 的第一题,其他类似标记也是相通
2、个人小白总结自用,不一定适用于其他人,请自行甄别
3、有任何疑问,欢迎私信探讨,看到后会及时回复
4、另外,想要获取 NUDT 计算机相关的资料,建议加官方QQ群756084430,群里有超级热心的吴彦祖和刘亦菲~
选择题
- (2017.T5)算术右移指令:符号位不变,算术右移1位,最低位移到进位标志位
- (2005.T4)跳跃指令给出的转移目标地址是:隐含的下下条指令的地址
原本PC顺序执行已经+1,而跳跃指令再次改变了PC的值
- 取出指令后,程序计数器PC的内容是:下条指令的地址
- 计算机区分指令还是数据的2种方法
不同的指令周期,取指周期就是指令,执行周期就是数据
地址来源区分,来自PC寄存器的,是主存的指令地址,来自指令译码器的指令地址码部分的是数据
- 扩展操作码的设计,是为了在相同的指令位数下,有更多的指令数量(来源慕课)
- 能区分指令和数据的部件:控制器(控制器能通过总线和指令周期区分地址和非地址数据(来源慕课)
- (2013.T8)Add R4, 100(R1) 用到了:
寄存器直接寻址R4
立即数寻址100
寄存器间接寻址(R1)
- 寄存器寻址(源操作数不在存储器),立即数寻址(源操作数在指令中,而指令取自存储器,所以源操作数也来自存储器)
- 程序控制指令:转移/分支/跳转指令、跳越指令、子程序调用和返回指令、循环控制指令
- 转移指令和跳越指令的区别:
转移指令:让CPU执行指令的顺序发生变化,包括无条件转移和条件转移2种
跳越指令:通常只跳越一条指令。跳越指令中隐含(实际上没有)了一个地址,即下下条地址,跳越指令不需要目标地址字段
填空题
- 微指令的指令格式3种:水平型微指令、垂直型微指令、混合型微指令
- 微指令编码的4个方式:直接控制法、字段直接编码法、字段间接编码法、垂直编码法
字段直接编码法,重要原则:能同时进行的微操作,是相容微操作,组合在不同字段(821.16.T4、821.13.T7、821.11.T5(答案有误))
- PC+1的相对寻址,通常用在转移指令中
- 一个指令周期 = 若干个机器周期
取指周期、间指周期、执行周期、中断周期
取指、译码、执行、访存、写结果
- 取指阶段的微操作:
T0:PC->MAR
T1:MAR->MDR, PC+1->PC // M(MAR)->MDR
T2:MDR->IR
- 执行阶段微操作:
T0:SP->MAR
T1:MAR->MDR
T2:MDR->PC, SP+1->SP
简答题
计算机采用二进制表达信息的原因:(3点)
- 制造2种稳定状态的物理元器件比较容易
- 二进制的编码、计数、运算方式比较简单
- 二进制的1/0对应逻辑的真/假,方便逻辑电路的实现
指令系统&操作系统
- 指令系统:是软硬件的接口和界面(软件通过指令系统调用硬件)
- 操作系统:是软硬件的资源管理
指令的3种冒险,以及相关的解决方式,要求画出解决前后的流水线时空图(九三P56)
大题
- MIPS标准的5级流水线:
取指令IF
指令译码ID
读(指令)寄存器的内容
执行EX
访存MEM
结果写回WB
写到寄存器中
- 同一个时钟周期
WB&ID、ID&IF可在同一个时钟周期
产生,数据冒险
1个时钟周期,分为0.5个周期
前半周期写,后半周期就可以读出写的内容
所以,这就支持,上一个指令的WB与本条指令的ID在同一个时钟周期里面
- 5级流水线,为了统一,减少工作量的判断,所有的指令,每一级都需要经过,只是可能没有具体操作
比如Add没有MEM访存阶段,但是还是要经过MEM阶段
- 5级流水线的每一级,耗时都是一样的(未特别说明的情况下)
所以,一级流水线的消耗时间 = 一条指令的执行时间 / 5
- 流水线,执行程序
消耗总时间 = 一条指令执行的时间 + (指令个数 - 1) x 一级流水线的消耗时间
8个指令进入5级流水线
在不阻塞的情况下,需要:5 + (8-1) = 12个时钟周期
5,第一个指令所需的时钟周期
8-1,减掉第一个指令,其余指令都只要1级流水线,消耗1个时钟周期,即可完成指令
1级流水线,消耗1个时钟周期
- 非流水线,执行程序
消耗总时间 = 一条指令执行的时间 x 指令个数
- 加速比 = 非流水线 / 流水线
理想情况下,流水线比非流水线处理快多少倍,就是求加速比
- 流水线时空图
指令编号
时钟周期
1
2
3
4
5
6
I1
IF
ID
EX
MEM
WB
12
IF
ID
EX
MEM
WB
- 看程序和汇编代码判断编址单位
看每条指令地址之间的间隔
- 程序左移的位数,可以看出:
数组中1个元素的大小
补充知识点
6种寻址方式
2种汇编指令格式比较
2种汇编指令格式 | AT&T | Intel |
字母 | 只能小写 | 大小写不敏感 |
格式 | 指令 源操作数 目的操作数 从左到右 | 指令 目的操作数 源操作数 |
操作数要求 | 寄存器加前缀 % 立即数加前缀 $ | / |
内存寻址 | () 小括号 | [] 中括号 |
指定数据长度 | byte ptr word ptr dword ptr |
3种常用指令举例
数据传送 | mov | 1、将寄存器、内存地址的数据,复制到其他地方 2、不可以直接将内存的数据复制到内存 | |
push | ESP寄存器的值-4,然后将数据放到对应的堆地址的内存中入栈 | ||
pop | 放到对应的堆地址的内存中的数据出栈,然后ESP寄存器的值+4 | ||
算术与逻辑运算 | add/sub | 加/减 | subtract |
inc/dec | 自增1/自减1 | increase/decrease | |
imul | 1、带符号整数乘法 2、所保存的目的地址必须是寄存器 | integer multiply | |
idiv | 1、带符号整数除法,只需要一个操作数,作为除数 2、被除数在EDX:EAX,商放在EAX,余数放在EDX | integer divide | |
and/or/xor | 逻辑与、逻辑或、逻辑异或 | 1&&2=1/true | |
not | 每一位 1 0 互换/翻转 | ||
neg | 取负 | negative | |
shl/shr | 逻辑左移、逻辑右移 | shift left/right | |
控制流指令 | jmp | 无条件转移 | |
je/jne/jz/jg/jge/jl/jle | 条件转移 | jcondition | |
cmp/test | 1、cmp 比较两个操作数的值 2、test 按位与 | compare 1&2=0 | |
call/ret | 1、call 子程序的调用 2、ret 返回 | return |
x86处理器通用寄存器