🏷️ 知识点:指令种类
设计某指令系统时,假设采用16位定长指令字格式,操作码使用扩展编码方式,地址码为6位,包含 零地址、一地址和二地址3种格式的指令。若二地址指令有12条,一地址指令有254条,则零地址指令 的条数最多为()。
A.0
B.2
C.64 D.128
[tag_link]
正确答案:D
本题考察 N 地址指令 如下图所示:零地址指令的 OP 字段位数相比一地址和二地址指令更短,但是需要注意的是,零地址指令的 OP 字段前缀与一地址和二地址指令的 OP 字段不能相同。OP ADDR OP ADDR ADDR OP 16 位 10 位 4 位 6 位 6 位 6 位 零地址指令 一地址指令 二地址指令 所以零地址指令的条数为 2 16 − 254 × 2 6 − 12 × 2 12 = 128 。
某计算机字长为 16 位,主存地址空间大小为 128KB,按字编址。采用单字长指令格式,指令各字段定义如下:
转移指令采用相对寻址方式,相对偏移量用补码表示,寻址方式定义如下:
| Ms/Md | 寻址方式 | 助记符 | 含义 |
|---|---|---|---|
| 000B | 寄存器直接 | Rn | 操作数 = (Rn) |
| 001B | 寄存器间接 | (Rn) | 操作数 = ((Rn)) |
| 010B | 寄存器间接、自增 | (Rn)+ | 操作数 = ((Rn)), (Rn) + 1 → Rn |
| 011B | 相对 | D(Rn) | 转移目标地址 = (PC) + (Rn) |
请回答下列问题:
(1) 该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?存储器地址寄存器(MAR)和存储器数据寄存器(MDR)至少各需要多少位?
(2) 转移指令的目标地址范围是多少?
(3) 若操作码 0010B 表示加法操作(助记符为 add),寄存器 R4 和 R5 的编号分别为 100B 和 101B,R4 的内容为 1234H,R5 的内容为 5678H,地址 1234H 中的内容为 5678H,地址 5678H 中的内容为 1234H,则汇编语言为“add (R4), (R5)+”(逗号前为源操作数,逗号后为目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元中的内容会改变?改变后的内容是什么?
[tag_link]
1)操作码占 4 位,则该指令系统最多可有24=16条指令。操作数占 6 位,其中寻址方式占 3 位、寄存器编号占 3 位,因此该机最多有23=8个通用寄存器。主存地址空间大小为 128KB,按字编址,字长为 16 位,共有 128KB/2B =216个存储单元,因此 MAR 至少为 16 位;因为字长为 16 位,故 MDR 至少为 16 位。
2)寄存器字长为 16 位,PC 和 Rn 可表示的地址范围均为0∼216−1,而主存地址空间为216,故转移指令的目标地址范围为 0000H~FFFFH(0∼216−1)。
3)汇编语句“add(R4),(R5)+”,对应的机器码为
| 字段 | OP | Ms | Rs | Md | Rd |
|---|---|---|---|---|---|
| 内容 | 0010 | 001 | 100 | 010 | 101 |
| 说明 | add | 寄存器间接 | R4 | 寄存器间接,自增 | R5 |
将对应的机器码写成十六进制形式为 0010 0011 0001 0101B = 2315H。该指令的功能是将 R4 的内容所指存储单元的数据与 R5 的内容所指存储单元的数据相加,并将结果送入 R5 的内容所指存储单元中。(R4)=1234H,(1234H)=5678H,(R5)=5678H,(5678H)=1234H;执行加法操作 5678H+1234H=68ACH,之后 R5 自增。该指令执行后,R5 和存储单元 5678H 的内容会改变,R5 的内容从 5678H 变为 5679H,存储单元 5678H 中的内容变为该指令的计算结果 68ACH。【注意】第 3 问中两个操作数的存储地址和数值有点令人晕头,请读者务必保持清醒。
有实现x×y的两个 C 语言函数如下:
unsigned umul (unsigned x, unsigned y) { return x*y; }
int imul (int x, int y) { return x * y; }
假定某计算机 M 中 ALU 只能进行加减运算和逻辑运算。请回答下列问题。
(1) 若 M 的指令系统中没有乘法指令,但有加法、减法和移位等指令,则在 M 上也能实现上述两个函数中的乘法运算,为什么?
(2) 若 M 的指令系统中有乘法指令,则基于 ALU、移位器、寄存器以及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
(3) 针对以下三种情况:①没有乘法指令;②有使用 ALU 和移位器实现的乘法指令;③有使用阵列乘法器实现的乘法指令,函数 umul() 在哪种情况下执行时间最长?哪种情况下执行的时间最短?说明理由。
(4)n位整数乘法指令可保存2n位乘积,当仅取低n位作为乘积时,其结果可能会发生溢出。当n=32、x=231−1、y=2时,带符号整数乘法指令和无符号整数乘法指令得到的x×y的2n位乘积分别是什么(用十六进制表示)?此时函数 umul() 和 imul() 的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低位作为乘法结果时,如何用2n位乘积进行溢出判断
[tag_link]
1)乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段,在循环代码段中通过比较、加法和移位等指令实现乘法运算。
2)控制逻辑的作用是控制循环次数,控制加法和移位操作。 3)①最长,③最短。对于①,需要用循环代码段(即软件)实现乘法操作,因而需要反复执行很多条指令,而每条指令都需要取指令、译码、取数、执行并保存结果,所以执行时间很长;对于②和③,都只需用一条乘法指令实现乘法操作,不过②中的乘法指令需要多个时钟周期才能完成,而③中的乘法指令可以在一个时钟周期内完成,所以③的执行时间最短。
4)当n=32,x=231−1,y=2时,带符号整数和无符号整数乘法指令得到的64位乘积都是00000000 FFFF FFFEH。int 型的表示范围为[−231,231−1],故函数 imul() 的结果溢出:unsigned int 型的表示范围为[0,232−1],故函数 umul() 的结果不溢出。对于无符号整数乘法,若乘积高n位全为0,即使低n位全为1也正好是232−1,不溢出,否则溢出。