5.2 选择题

(1)[2017] 某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令 29 条,二地址指令 107 条,每个地址字段为 6 位,则指令字长至少应该是

A.24 位
B.26 位
C.28 位
D.32 位

答案:A
解析:“指令字长固定”且“计算机按字节编址”,那么指令字长必须是8的倍数,可以直接排除B和C;
由于三地址指令为 29 条,那么操作码字段至少为 5 位 ($2^n≥29$,故n至少为 5),可以用$2^5-29$ 条 = 3 条作为扩展窗口;
二地址指令最多可以有$3 \times 2^6$ 条 = 192 条,而题目中二地址指令 有107 条,可以满足条件;
所以指令字长为 操作码字段 + 地址码字段 = 5 + (6 + 6 + 6) 位 = 23 位,而又因为指令字长必须是8的倍数,那么向上取指令字长至少为24位。

(3)[2020] 某计算机采用 16 位定长指令字格式,操作码位数和寻址方式位数固定,指令系统中有 48 条指令,支持直接、间接、立即、相对 4 种寻址方式,单地址指令中直接寻址方式可寻址范围是

A.0 ~ 255
B.0 ~ 1023
C.-128 ~ 127
D.-512 ~ 511

答案:A
解析: 假设操作码有n位,那么$2^n ≥ 48$,所以n为6,即操作码有6位;支持直接、间接、立即、相对 4 种寻址方式,所以寻址方式字段需要2位($2^{2}=4$);所以地址码有16 - 6 - 2 = 8位,故单地址指令中直接寻址方式可寻址的最大地址为$2^8 - 1$ = 255,最小地址为0,可寻址范围为0~255。


(4)[2016] 某指令格式如图 5.33 所示。

https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/b7c320df-9edc-443f-ae7f-35ce320b87a7
其中 M 为寻址方式,I 为变址寄存器编号,D 为形式地址。若采用先变址后间址的寻址方式,则操作数的有效地址是 。
A.I+D
B.(I)+D
C.((I)+D)
D.((I))+D

答案:C
解析: 先变址,其有效地址EA = (I) + D,再间址,其有效地址EA = ((I) + D)。


(5)[2009] 某计算机字长为 16 位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一字节为操作码字段,第二字节为相对位移量字段。假定取指令时,每取一个字节 PC 自动加 1。若某转移指令所在主存地址为 2000H,相对位移量字段的内容为 06H,则该转移指令成功转移后的目标地址是

A.2006H
B.2007H
C.2008H
D.2009H

答案:C
解析: 由于取指令时,每取一个字节 PC 自动加 1,取指令并完成后1,PC = PC + 1 + 1 = PC + 2,转移指令所在主存地址为 2000H,那么EA = PC + 2 + D = 2000H + 2H + 06H = 2008H。


(6)[2011] 偏移寻址通过将某个寄存器内容与一个形式地址相加来生成有效地址。下列寻址方式中,不属于偏移寻址方式的是

A.间接寻址
B.基址寻址
C.相对寻址
D.变址寻址

答案:A
解析: 间接寻址是指令中给出的地址A是存放操作数地址的地址;基址寻址是基址寄存器里面的内容+形式地址D形成有效地址;相对寻址是程序计数器PC+形式地址D形成有效地址;变址寻址是变址寄存器+形式地址D形成有效地址。


(7)[2013] 假设变址寄存器 R 的内容为 1000H,指令中的形式地址为 2000H;地址 1000H 中的内容为 2000H,地址 2000H 中的内容为 3000H,地址 3000H 中的内容为 4000H,则变址寻址方式下访问到的操作数是

A.1000H
B.2000H
C.3000H
D.4000H

答案:D
解析: 变址寻址方式的操作数S=(( R )+D)=(1000H+2000H)=(3000H)=4000H。


(8)[2017] 下列寻址方式中,最适合按下标顺序访问一维数组元素的是

A.相对寻址
B.寄存器寻址
C.直接寻址
D.变址寻址

答案:D
解析: 变址寻址方式的形式地址D作为数组的首地址,由变址寄存器来定位数组的各个元素。


(9)[2019] 某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234 FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为 FF12H,基址寄存器的内容为 F000 0000H,则该操作数的 LSB(最低有效字节)所在的地址是

A.F000 FF12H
B.F000 FF15H
C.EFFF FF12H
D.EFFF FF15H

答案:D
解析: 由于是基址寻址方式,那么存放该指令操作数的有效地址EA=(R)+D=F000 0000H + FF12H,由于FF12H是用16位补码表示,其转换为二进制为1111 1111 0001 0010,为负数,而寄存器中的内容是用32位进行表示,所以FF12H补齐为32位补码为:1111 1111 1111 1111 1111 1111 0001 0010 = FFFF FF12H,那么EA = F000 0000H + FFFF FF12H = EFFF FF12H(16进1,F + F = 1E)
又因为计算机采用大端方式(低位字节存放在高地址处),按字节编址,1字节 = 8位,那么操作数1234 FF00H 分为四块内容进行存储,分别是 12 34 FF 00
其地址和相应存放内容如下表所示:

地址 FFFF FF12H FFFF FF13H FFFF FF14H FFFF FF15H
内容 12 34 FF 00

所以该操作数的 LSB(最低有效字节,在本题中就是00)所在的地址是FFFF FF15H。


(10)[2018] 按字节编址的计算机中,某 double 型数组 A 的首地址为 2000H,使用变址寻址和循环结构访问数组 A,保存数组下标的变址寄存器初值为 0,每次循环取一个数组元素,其偏移地址为变址值乘以 sizeof(double),取完后变址寄存器内容自动加 1。若某次循环所取元素的地址为 2100H,则进入该次循环时变址寄存器的内容是

A.2
B.32
C.64
D.100

答案:B
解析: 由题意可得,数组的首地址2000H存放在形式地址D中,而基址寄存器存放数组A的下标内容,其初值位0,那么其每一次循环后,所取元素地址 = D + 变址寄存器里面的值 * sizeof(double) = D + 8 * 变址值;
有 2100H = 2000H + 8 * 变址值,所以 8 * 变址值 = 100H = 0001 0000 0000 = 256,所以变址值 = 32。


(11)[2011] 某计算机有一个标志寄存器,其中有进位 / 借位标志 CF、零标志 ZF、符号标志 SF 和溢出标志 OF,条件转移指令 bgt(无符号整数比较大于时转移)的转移条件是

$A.CF+ZF=1$

$B.\overline{SF}+ZF=1$

$C.\overline{CF+ZF}=1$

$D.\overline{CF+SF}=1$

答案:C
解析: 条件转移指令 bgt(无符号整数比较大于时转移),假如有两个数A和B,且A>B,那么A - B > 0,肯定没有进位/借位,也不会等于0,所以有CF=0且ZF=0,即CF+ZF=0,那么非(CF+ZF)=1。
相关知识链接:关于标志信息ZF、OF、SF、CF的理解


(12)[2018] 减法指令 sub R1,R2,R3 的功能为“(R1) - (R2) → R3”,该指令执行后将生成进位 / 借位标志 CF 和溢出标志 OF。若 (R1)=FFFFFFFFH,(R2)=FFFFFFF0H,则该减法指令执行后,CF 与 OF 分别为

A.CF=0,OF=0
B.CF=1,OF=0
C.CF=0,OF=1
D.CF=1,OF=1

答案:A
解析: (R1) - (R2) = (R1) + (-R2)补 = FFFF FFFFH + 0000 0010H = (1)0000 000FH,没有发生溢出,且因为(R1)>(R2),所以也没有发生借位,故CF = 0, OF = 0。


(13)[2009] 下列关于 RISC 的叙述中,错误的是

A.RISC 普遍采用微程序控制器
B.RISC 中的大多数指令在一个时钟周期内完成
C.RISC 的内部通用寄存器数量比 CISC 的多
D.RISC 的指令数、寻址方式和指令格式种类比 CISC 的少

答案:A
解析:
https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/aeffdf1b-369a-4cd0-b8da-7c1db6e428c6


5.7 设相对寻址的转移指令占 3 个字节,第一个字节是操作码,第二个字节是相对位移量(补码表示)的低 8 位,第三个字节是相对位移量(补码表示)的高 8 位,每当 CPU 从存储器取一个字节时,便自动完成 (PC)+1-PC。请回答下列问题

(1)若 PC 当前值为 256(十进制),要求转移到 290(十进制),则转移指令第二、三字节的机器代码是什么(十六进制)?
(2)若 PC 当前值为 128(十进制),要求转移到 110(十进制),则转移指令第二、三字节的机器代码又是什么(十六进制)?

答:
由于每当 CPU 从存储器取一个字节时,便自动完成 (PC)+1=PC,而取出该指令并完成,会使 PC = PC + 1 + 1 + 1 = PC + 3;
(1)
当取出并完成该指令后,PC = PC + 3 = 256 + 3 = 259,要求转移到 290,那么偏移量 D = 290 - 259 = 31 = 0000 0000 0001 1111 = 001FH
所以相对偏移量高8位为00H,低8位为1FH,即指令第二字节机器代码为1FH,指令第三字节机器代码为00H。

(2)
当取出并完成该指令后,PC = PC + 3 = 128 + 3 = 131,要求转移到110,那么偏移量 D = 110 - 131 = -21 = -0000 0000 0001 0101 = (1111 1111 1110 1011)补 = FFEBH
所以相对偏移量高8位为FFH,低8位为EBH,即指令第二字节机器代码为EBH,指令第三字节机器代码为FFH。


5.8 计算机的指令格式包括操作码 OP、寻址方式特征位 I 和形式地址 D 等 3 个字段,其中 OP 字段为 6 位,寻址方式特征位字段 I 为 2 位,形式地址字段 D 为 8 位。I 的取值与寻址方式的对应关系如下

I=00:变址。
I=01:用变址寄存器 X1 进行变址。
I=10:用变址寄存器 X2 进行变址。
I=11:相对寻址。
设 (PC)=1234H,(X1)=0037H,(X2)=1122H,以下 4 条指令均采用上述格式,请确定这些指令的有效地址。
(1)4420H;(2)2244H;(3)1322H;(4)3521H。

答:
由题意可得指令的基本格式如下:

OP(6位) I(2位) D(8位)

(1)4420H
转换为二进制为:0100 0100 0010 0000

OP(6位) I(2位) D(8位)
010001 00 0010 0000

因为 I = 00,根据题目要求,得到该寻址方式为直接寻址方式
其有效地址 EA = D = 0010 0000 = 20H

(2)2244H
转换为二进制:0010 0010 0100 0100

OP(6位) I(2位) D(8位)
001000 10 0100 0100

因为 I = 10,根据题目要求,得到该寻址方式为变址寻址(用变址寄存器 X2 进行变址)
其有效地址 EA = (X2) + D = 1122H + 0044H = 1166H

(3)1322H
转换为二进制为:0001 0011 0010 0010

OP(6位) I(2位) D(8位)
000100 11 0010 0010

因为I = 11,根据题目要求,得到该寻址方式为相对寻址
其有效地址 EA = (PC) + 2 + D = 1234H + 2H + 22H = 1258H
(注意PC在取指令之前的内容为1234H,在取出这条指令并访问主存中的数据这过程中,是进行了2次对主存的访问,所以PC = PC + 2)

(4)3521H
转换为二进制为:0011 0101 0010 0001

OP(6位) I(2位) D(8位)
001101 01 0010 0001

因为 I = 01,根据题目要求,得到该寻址方式为变址寻址(用变址寄存器 X1 进行变址)
其有效地址 EA = (X1) + D = 0037H + 21H = 58H


5.9 某计算机 A 有 60 条指令,指令的操作码字段固定为 6 位,从 000000 ~ 111011,该计算机的后续机型 B 中需要增加 32 条指令,并与 A 保持兼容。

(1)试采用扩展操作码为计算机 B 设计指令操作码。
(2)求出计算机 B 中操作码的平均长度。

答:
(1)“指令的操作码字段固定为 6 位”,那么可以存放 $2^{6}=64$ 条指令,由于计算机A有 60 条指令,那么可以用多出来 4 条指令作为扩展窗口,即111011、111100、111101和111111;
“计算机的后续机型 B 中需要增加 32 条指令”,那么需要扩展地址字段位数为:3 位 ($4 \times 2^n = 32$,故 $n = 3$);
所以新的 32 条指令操作码为 111100 000 到 111111 111。
(2)60条指令的操作码字段为6位,32条指令的操作码字段为 (6 + 3) 位 = 9 位,所以计算机 B 中操作码的平均长度 = 所有指令操作码字段之和 / 指令总条数 = (60 × 6 + 32 × 9) / (60 + 32) 位 ≈ 7.04 位。


5.10 以下 MIPS 指令代表什么操作?写出它的 MIPS 汇编指令格式。

0000 0000 1010 1111 1000 0000 0010 0000

答:
https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/7ff35f47-5eda-4a80-8c34-a87975313579
无论是MIPS32中,所有指令的OP字段占6位,所以该指令OP = 0000 00,因为OP(6) = 0,所以该指令为R型指令,该指令格式划分如下表所示:

OP(6) rs(5) rt(5) rd(5) shamt(5) funct(6)
0000 00 00 101 0 1111 1000 0 000 00 10 0000

https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/34713a4d-ec54-476d-bbcc-c49e30059da9
funct = 100000 = 32,根据上图可得该指令为add rd,rs,rt;
https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/4d031e66-af71-4cc7-b350-860d6a1c4579

rs = 00101 = 5,则对应的寄存器名称rt = $a1;
rd = 10000 = 16,则对应的寄存器名称rd = $s0;
rt = 01111 = 15,则对应的寄存器名称rt = $t7;
所以该指令的汇编格式为:add $s0, $a1, $t7。


5.11 假定以下 C 语言语句中包含的变量 f、g、h、i、j 分别存放在寄存器 $11 ~ $15 中,写出实现 C语言语句 f=(g+h)*i/j 功能的 MIPS 汇编指令序列,并写出每条 MIPS 指令的十六进制数。

答:
变量与寄存器对应关系如下表所示:

变量 f g h i j
寄存器# $11(01011) $12(01100) $13(01101) $14(01110) $15(1111)
助记符 $t3 $t4 $t5 $t6 $t7

对应的汇编指令与机器码如下表所示:
详细的汇编指令对应信息可以参考这篇文章:MIPS指令大全

汇编指令 机器指令 十六进制机器指令
add $t3, $t4, $t5 0000 0001 1000 1101 0101 1000 0010 0000 018D5820H
mult $t3, $t6 0000 0001 0110 1110 0000 0000 0001 1000 016E0018H
mflo $t3 0000 0000 0000 0000 0101 1000 0001 0010 00005812H
div $t3, $t7 0000 0001 0110 1111 0000 0000 0001 1010 016F001AH
mflo $t3 0000 0000 0000 0000 0101 1000 0001 0010 00005812H

5.12 某计算机字长为 16 位,主存地址空间大小为 128KB,按字编址。采用单字长指令格式,指令各字段定义如图 5.34 所示

https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/3a73cdaa-22f0-43f3-a97a-9541a4cf05a5
转移指令采用相对寻址方式,相对偏移量用补码表示,寻址方式定义如表 5.20 所示。
https://res.craft.do/user/full/e9ff8d90-9e83-0322-7893-870061b9c749/doc/37bd31fa-7816-a116-d2c4-e33f2ff0301e/ef1b7483-593c-48fa-9329-804ef898c06b
请回答下列问题。
(1)该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?
(2)存储器地址寄存器 MAR 和存储器数据寄存器 MDR 至少各需要多少位?
(3)转移指令的目标地址范围是多少?
(4)若操作码 0010B 表示加法操作(助记符为 add),寄存器 R4 和 R5 的编号分别为 100B 和101B,R4 的内容为 1234H,R5 的内容为 5678H,地址 1234H 中的内容为 5678H,地址 5678H 中的内容为1234H,则汇编语言为“add (R4),(R5)+”(逗号前为源操作数,逗号后为目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元中的内容会改变?改变后的内容是什么?

答:
(1)该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?
指令系统的指令总条数由操作码位数决定,操作码位数为 15 - 12 + 1 = 4位,所以指令系统最多可有 $2^{4}=16$ 条指令。
根据表5.20可得寻址方式占3位,所以通用寄存器有 $2^{3}=8$ 个。

(2)存储器地址寄存器 MAR 和存储器数据寄存器 MDR 至少各需要多少位?
计算机字长为 16 位,转化为 2B,主存地址空间大小为 128KB,那么 128KB / 2B = 64B = $2^{16}$B,所以存储器地址寄存器 MAR 和存储器数据寄存器 MDR 至少各需要 16 位。

(3)转移指令的目标地址范围是多少?
由于主存地址空间大小为128KB,计算机按字编址,那么地址位数为16位($2^{17} / 2 = 2^{16}$),同时计算机字长为 16 位,所以PC和通用寄存器的位数均为16位,相对寻址中其目标地址最小为(PC(0000H))+(R(0000H)) = 0000H,目标地址最大为(PC(FFFFH))+(R(FFFFH)) = 1EFFFH,理论上转移指令的目标地址范围为 0000H ~ 1EFFFH,但由于主存地址空间为128KB,也为16位,1EFFFH中的1会被舍去,所以目标地址最大必须是16位的最大值,即FFFFH,那么其真正的目标地址范围为 0000H~FFFFH。

(4)若操作码 0010B 表示加法操作(助记符为 add),寄存器 R4 和 R5 的编号分别为 100B 和101B,R4 的内容为 1234H,R5 的内容为 5678H,地址 1234H 中的内容为 5678H,地址 5678H 中的内容为1234H,则汇编语言为“add (R4),(R5)+”(逗号前为源操作数,逗号后为目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元中的内容会改变?改变后的内容是什么?
根据图 5.34指令各字段定义、表5.20和该小题题目,可得下表:

OP(4位) $M_{s}$(3位) $R_{s}$(3位) $M_{d}$(3位) $R_{d}$(3位)
0010 001 100 010 101

0010 0011 0001 0101 转换为十六进制为 2315H,所以汇编语言为“add (R4),(R5)+”对应的机器码是2315H;
根据表5.20$(R_{n})+1→(R_{n})$,可得该指令执行后,寄存器R5和存储单元5678H的内容会改变,改变后R5当中的内容5678H变成5679H,存储器5678H中的内容变成该加法指令计算的结果:5678H + 1234H = 68ACH。


本站由 Skylwn 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量