一、拓展操作码指令格式
【2017 统考】某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令29条、二地址指令107条,每个地址字段6位,则指令字长至少应该是( A)
A、24位 B、26位 C、28位 D、32位
解析:
OP(5位) | A1(6位) | A2(6位) | A3(6位) |
三地址指令共29条,操作码位,留了32 - 29 = 3条操作码给二地址.
分别是 111101、111110、111111
此时的二地址位为位,所以方案可行,所以指令字长为5 + 3 * 6 = 23位,因为按字节编址,所以取8的整数倍等于24位。
tips:三地址的位数决定着操作码最短位数
二、指令寻址方式
1、偏移量
【2014统考】某计算机有16个通用寄存器,采用32位定长指令字,操作码字段(含寻址方式位)为8位,Store指令的源操作码和目的操作数分别采用寄存器直接寻址和基质寻址方式。若基质寄存器可使用任一通用寄存器,且偏移量用补码表示,则Store指令中偏移量的取值范围是(A)
A、-32768~+32767 B、-32767~+32768
C、-65536~+65535 D、-65535~+65536
解析:
(本题考查数据表示和指令系统)
共32位
操作码:8位
寄存器直接寻址:4位
寄存器基址寻址:4位 + x位(偏移量) 8 + 4 + 4 + x =32 解得x = 16 位
16位补码能表示的最小负数为 最大正数
tips: n位补码能表示的最小负数 ,最大正数
2、基质寻址、大端存储
【2019统考】某计算机采用大端方式,按字节编址。某指令中操作数的机器数为1234 FF00H,该操作数采用基质寻址方式,形式地址(用补码表示)为FF12H,基址寄存器的内容为
F000 0000H, 则该操作数的LSB(最低有效字节)所在地址是(D)
A、F000 FF12H B、F000 FF15H C、EFFF FF12 D、EFFF FF15H
解析:
大端存储:
FF12H | FF13H | FF14H | FF15H |
12H | 34H | FFH | 00H |
补码:FF12H 原码:00EEH
基址寻址: EA = (R) + A
**形式地址R是无符号数,但偏移量(R)是有符号数,原数是负的,所以这里要减去原码**
F000 0000H - 00EEH = F000 0000H + [-0000 00EEH]补 = F000 0000 + FFFF FF12H
=EFFF FF12H,所以,所在的地址为EFFF FF15H
tips:大端存储是顺着,小端则是逆着存
3、地址格式
【2020统考】某计算机采用16位定长指令字格式,操作码位数和寻址方式位数固定,指令系统有48条指令,支持直接、间接、立即、相对4种寻址方式。在单地址指令中,直接寻址方式的可寻址范围是(A)
A、0~255 B、0~1023 C、-128~127 D、-512 ~ 511
解析:
*寻址方式位 2位
*操作码位数固定,所以48条指令需要6位操作码
地址位 16 - 6 - 2 = 8 位 地址是无符号数,大于0排除C、D,8位二进制数所能表示的最大正数= 2^8 - 1 = 255
(1)操作码 4位 ,共16条指令。(操作码位数决定了指令条数)
(Ms/Md,这是Ms或Md)操作数位寻址方式位:3位,所以Rs/Rd位:3位,共2^3 = 8 个寄存器。
MAR : 字长16位 = 2B,128KB / 2B = 2^16,所以16位 (MAR:地址范围,主存的容量决定了地址的范围)
MDR = 机器字长16位(MDR:数据大小)
(2)寄存器字长16位,PC的地址范围0 ~ 2^16 - 1,Rn可表示的相对偏移量(有符号数)为-2^15 ~ 2^15 - 1,而主存地址空间为2^16,所以转移指令的目标地址范围为0000H ~ FFFFH(0~2^16 -1 )
(3)
寄存器间接寻址:Ms = 001 寄存器间接、自增: Md = 010
机器码:0010 001 100 010 101B (通过题目寻址方式,寄存器号码得出机器码)
执行结果:R5发生变化,先执行加法操作,5678H + 1234H = 68ACH,后进行自增。
执行后:R5、5678H的存储单元发生变化
R5中的内容:5678H 变为 5679H 【(R5) + 1 —— R5:带括号的是地址指向的地址的内容5678H,不带括号的是该地址】
存储单元5678H:变为该结果68ACH
1)按字节编址,8位补码能表示的最大负数为1-2^7,最多跳转2^7 - 1条指令。
2)
200CH + 2 + 2 * (- 29) = 0001 1111 1110 0100(A—B = A + B补)
200CH + 2 = 0010 0000 0000 1110
3)C = 1 , Z = 1 , N = 1
4)1:指令寄存器,存放指令
2:移位寄存器,左移一位
3:加法器,与PC + 2相加(上面的加法器是用来PC + 2)
1)16位,2^20字节;指令寄存器16位,MAR:20位,MDR:8位
2)R:0000~1111,2^4种,I:2^6 - 1种,J:2^6 - 1种。通用寄存器4个(前6位全0的编码已被R型格式占用,所以减少一种)
3)01B2H = 0000 0001 1011 0010B 带符号数减法,将1号寄存器中的内容减2号寄存器中的内容得到的结果放到3号寄存器中。R[3] <—— R[1] - R[2]。
01B2H:
B052H - 0008H = B04AH
01B3H:
B052H * 0008H = 8290H,溢出(8290 < B052)
4)符号拓展,imm为带符号整数,可以向前或向后偏移,所以需要符号拓展
5)J型
1)CISC,因为指令种类多,指令字长不定
2)0040107F - 00401020 + 1= 60H = 6 * 16 + 0 = 96B
3)CF = 1,i = 0000 0000H n - 1 = FFFF FFFFH,0减FFFF FFFF就等于0000 0001H,此时进位C = 0,借位CF = 1
4)不能,浮点数左移和定点数的左移不同,浮点数左移包含了阶码的左移,最后达不到乘2的结果。
1)10次,call f1,第十六行
2)条件转移指令:第12行;第16行,第20行,第30行都一定会跳转执行
3)第17行:第16行占了5个字节(E8 D6 FF FF FF),0040 102AH
call的偏移量:00401025 - 00401000 = 25H,向后偏移,FFFF FFD6H
小端方式
4)发生了溢出,超过了int所能表示的最大范围,把int都改成longlong。
5)乘积的高33位为非全0或非全1,则OF = 1.编译器应在imul指令后加一条"溢出自陷指令"。当OF=1时,调用"溢出异常处理"
1)因为页大小4KB,虚拟地址的高20位是虚拟页号,第一行和第三十行的高20位相同,所以在同一页。
2)64 / 4 = 16组,则组号4位,主存块64B,块内地址6位,头22位是tag位,中间4位是组号,末6位是块内地址。
3)0040 1025H,中间4位0000,低6位 10 0101,组号为0