Skip to content

2024年 408 计算机组成原理 第 43 题

计算机组成原理2024年综合题13分

题目

假定计算机 M 字长为 32 位。按字节编址,采用 32 位定长指令字,指令 addsllilw 的格式、编码和功能说明如题 43(a) 图所示。

add 指令(R 型)R[rd] ← R[rs1] + R[rs2]

3125funct77 bits2420rs25 bits1915rs15 bits1412funct33 bits117rd5 bits60opcode7 bits

slli 指令(I 型,移位)R[rd] ← R[rs1] << shamt

3125funct77 bits2420shamt5 bits1915rs15 bits1412funct33 bits117rd5 bits60opcode7 bits

lw 指令(I 型,访存)R[rd] ← M[R[rs1] + imm]

3120imm12 bits1915rs15 bits1412funct33 bits117rd5 bits60opcode7 bits

其中 R[x] 表示通用寄存器 x 的内容,M[x] 表示地址为 x 的存储单元内容,shamt 为移位位数,imm 为补码表示的偏移量。题 43(b) 图给出了计算机 M 的部分数据通路及其控制信号(用箭头虚线表示),其中,AB 分别表示从通用寄存器 rs1rs2 中读出的内容,IR[31:20] 表示指令寄存器中的高 12 位。控制信号 Ext 为 0、1 时扩展器分别实现零扩展、符号扩展;ALUctr 为 000、001、010 时 ALU 分别实现加、减、逻辑左移运算。

image-20260501021139677

请回答下列问题

(1) 计算机 M 最多有多少个通用寄存器?为什么 shamt 字段占 5 位?(2 分)

(2) 执行 add 指令时,控制信号 ALUBsrc 的取值应该是什么?若 rs1rs2 寄存器内容分别是 8765 4321H9876 5432H,则 add 指令执行后,ALU 输出端 FOFCF 的结果分别是什么?若设 add 指令处理的是无符号整数,则应根据哪个标志判断是否溢出(3 分)

(3) 执行 slli 指令时,控制信号 Ext 的取值可以是 0 也可以是 1,为什么?(2 分)

(4) 执行 lw 指令时,控制信号 ExtALUctr 的取值分别是什么?(2 分)

(5) 若一条指令的机器码是 A040 A103H,则该指令一定是 lw 指令,为什么?(2 分)

(6) 若执行该指令时,R[01H]=FFFF A2D0H,则所读取数据的存储地址是多少?(2 分)

解析

本题考查类 RISC-V 指令格式(add / slli / lw)配合一个简化数据通路,6 个子问题串起:寄存器宽度 → 加法溢出 → 立即数扩展策略 → 机器码解码 → 访存地址计算。

编者注(生僻术语): 这正是 RISC-V 32 位定长指令的真实结构(R 型 / I 型)。RISC-V 巧妙地让 R 型和 I 型把 rs1 / rd / opcode / funct3 都放在 完全相同的位段,硬件解码时不必先看 opcode 再决定字段位置——节省门级电路,是 RISC-V 设计哲学的精髓。

(1) 通用寄存器最多多少?为何 shamt 占 5 位?[2 分]

寄存器数: R 型 / I 型中 rs1 / rs2 / rd 字段都是 5 位:

shamt = 5 位的原因: 字长 32 位,左移有意义的位数最大为 31(移 32 位结果全 0、无意义);表示 0~31 需要:

易错点: shamt 不是"位数取 log2"那么简单——本质是"最大位移量 + 1 个值(即 0~32 共 33 个值,但 32 与 0 等价,只编码 0~31)"。RISC-V 64 位扩展时 shamt 改为 6 位(移 0~63 位)。

(2) add 指令的 ALUBsrc + 标志位 + 无符号溢出依据 [3 分]

ALUBsrc。 add 是 R 型,ALU 的 B 端取 rs2 寄存器内容(不是立即数):

算 F、OF、CF。

  8765 4321H   (-2027009247,带符号)
+ 9876 5432H   (-1737075662,带符号)
-----------
1 1FDB 9753H   (33 位)

按 32 位截断:,最高位的 1 是进位输出。

标志来源取值
FALU 32 位输出1FDB 9753H
CF(进位)最高位的进位输出 = 11
OF(溢出)(两加数皆负,结果转正)1

无符号判溢出:CF。无符号加法越界 ↔ 产生进位 → CF = 1 即溢出。带符号才用 OF。

易错点: OF 与 CF 的区别——无符号看 CF(进位),带符号看 OF(符号反转 / 进位异或)。同一个加法可能 OF = 1、CF = 0,也可能 OF = 0、CF = 1,也可能两个都是 1。本题恰好两个都是 1。

(3) slli 时 Ext 取 0 或 1 都行的原因 [2 分]

slli 的 IR[31:20] 字段切分为 [funct7 = 7 位 | shamt = 5 位]。funct7 = 0000000,最高位为 0。

无论是 零扩展(高位补 0)还是 符号扩展(高位补 IR[31] = 0),高位补的都是 0 → 扩展结果相同。

(4) lw 时 Ext / ALUctr 的取值 [2 分]

Ext: lw 的 imm 是补码偏移量(题干声明),可正可负 → 必须 符号扩展

ALUctr: lw 计算地址 = R[rs1] + imm → ALU 做加法。题干给出 ALUctr = 000 表示加:

(5) 为什么 A040 A103H 一定是 lw 指令?[2 分]

把机器码切成各字段:

字段二进制解释
imm(lw 的 IR[31:20])31:201010 0000 0100B = A04H偏移量
rs119:1500001 = R1rs1 = R1
funct314:12010lw 字访存
rd11:700010 = R2rd = R2
opcode6:00000011I 型访存

判断依据:

  • add 是 R 型,funct7 字段 = IR[31:25] = 1010 000,但 add 的 funct7 应为 0000000,不匹配;
  • slli 是 I 型移位,但 funct7 应为 0000000,本机器码 1010 000 不匹配;
  • 唯独符合 lw 的 opcode(0000011)+ funct3(010)→ 必为 lw 指令

(6) 该 lw 指令读取数据的存储地址 [2 分]

Step 1. 提取并扩展 imm。

imm(IR[31:20])= 1010 0000 0100B(12 位补码),最高位为 1 → 负数。符号扩展到 32 位:

Step 2. 加 rs1 内容。

R[01H] = FFFF A2D0H

按 32 位无符号加(最高位进位丢弃):

  FFFF A2D0H
+ FFFF FA04H
------------
1 FFFF 9CD4H  → 截 32 位

易错点: imm 取 12 位补码后必须 符号扩展 再加,不要忘记最高位为 1 导致扩展高 20 位为 1。如果错做零扩展,会得到 00000A04H,地址完全错。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题