🏷️ 知识点:运算电路

共 4 道相关题目

2024 年第 15 题 组成原理 选择题

下列关于整数乘法运算的叙述中,错误的是()。

A. 用阵列乘法器实现乘运算可以在一个时钟周期完成

B. 用 ALU 和移位器实现的乘运算无法在一个时钟周期内完成

C. 变量与常数的乘运算可编译优化为若干条移位及加/减运算指令

D. 两个变量的乘运算无法编译为移位及加法等指令的循环实现

[tag_link]

正确答案:D

参考 该节 ,我们逐项分析: A. 用阵列乘法器实现乘运算可以在一个时钟周期完成 ✅ 阵列乘法器(array multiplier)是一种 并行结构 ,硬件资源充足的情况下,确实可以在一个时钟周期内完成乘法运算(代价是面积大)。因此这个说法是 正确的 。B. 用 ALU 和移位器实现的乘运算无法在一个时钟周期内完成 ✅ 这种方式对应的是 串行乘法器 ,通过不断地移位与加法模拟乘法过程,至少需要多个时钟周期完成,因此 正确 。C. 变量与常数的乘运算可编译优化为若干条移位及加/减运算指令 ✅ 例如 x * 10 可编译为 (x « 3) + (x « 1) ,这是常见的编译器优化技术,因此此项 正确 。D. 两个变量的乘运算无法编译为移位及加法等指令的循环实现 ❌ 这项是 错误的 。事实上,若没有硬件乘法器,编译器或低级代码确实可以将变量之间的乘法(如 a * b )转换为循环移位加法实现。比如使用 Booth 算法 、 加移法(shift-and-add) 等。因此选项 D 的说法是错误的。


模拟卷 年第 18 题 组成原理 选择题

下列部件不属于运算器的是( )。

A. 状态寄存器 B. 通用寄存器 C. ALU D. 数据高速缓存

寄存器类型 运算电路

[tag_link]

正确答案:D

运算器是 CPU 的核心部件之一,主要负责执行算术运算和逻辑运算。 其典型组成包括 ALU(算术逻辑单元)、通用寄存器和状态寄存器等。 ALU 是运算器的核心,直接处理数据运算; 通用寄存器用于临时存储运算数据和中间结果; 状态寄存器则记录运算结果的状态标志,如进位、溢出等。 这些部件共同协作完成运算任务。

数据高速缓存属于存储器层次结构,位于 CPU 和主存之间,用于加快数据访问速度,减少 CPU 等待时间。 它是存储系统的一部分,并不直接参与运算过程,因此不属于运算器的组成部分。 所以,本题中不属于运算器的部件是数据高速缓存。


2020 年第 43 题 组成原理 综合题

有实现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,不溢出,否则溢出。


2025 年第 44 题 组成原理 综合题

接上题,R0~R4 为通用寄存器,SEXT 表示按符号扩展,M 中补码除法器,逻辑结构图如下:

机器级代码:

// x 在 R2 中,i 在 R4 中
// 数组 d 的首地址在 R3 中
mov R1,(R3+R4*4) // R1 ← d[i]
scov R1          // {R0,R1} ← SEXT(R1)
idiv R1          // R1<-({R0,R1}/R2)

(1) 若执行 idiv 指令时,d[i]=0x87654321,x=0xff,则补码除法器中 R、Q、Y 的初始值分别为多少(用十六进制表示)?图 b 中哪个部分包含计数器?在补码除法器执行过程中,ALUop 所控制的 ALU 运算有哪几种?

(2) 假设 idiv 执行过程中会检测并触发除法异常,则执行 idiv 指令时,哪些情况下会发生除法异常(要求给出此时 d[i] 和 x 的十六进制机器数)。发生除法异常时,在异常响应过程中,CPU 需要完成哪些操作?

运算电路

[tag_link]

【答案】

1)R 中的值为 0xffffffff,Q 中的值为 0x87654321,Y 中的值为 0x000000ff。b 中的控制逻辑包含计数器,ALUop 所控制的 ALU 运算包含加法和减法。

2)第一种情况除数为 0 异常,d[i] 为任意值,x 为 0x00000000。第二种情况溢出异常,d[i] 为 0x80000000,x 为 0xffffffff,在 d[i] = -2³¹、x = -1 的情况下会发生溢出异常。在发生除法异常时 CPU 响应的操作:

  1. 关中断,修改 CPU 状态为内核态。
  2. 保存断点(PC 和 PSWR 中的值)。
  3. 跳转到异常处理程序。【解析】

1)寄存器初始值分析

  • 被除数: d[1] = 0x87654321 是 32 位补码,最高位为 1(符号位),经 sccv 符号扩展为 64 位,高 32 位为 0xFFFFFFFF,低 32 位为 0x87654321
  • 除法器结构: 余数寄存器 R(高 32 位)和商寄存器 Q(低 32 位)组成 64 位被除数,除数寄存器 Y 存储除数。
  • 初始值:
  • R: 被除数高 32 位 → 0xFFFFFFFF
  • Q: 被除数低 32 位 → 0x87654321
  • Y: 除数 x = 0xff0x000000FF(这里虽然只用了 8 位,但是表示的意思是 255,最高位不是符号位)计数器位置图中控制逻辑模块包含计数器 C,用于控制除法迭代次数(32 次,对应 32 位前)。ALU 运算类型补码除法采用加减交替法,ALU 需支持两种运算:
  • 减法: R - Y(试减,判断余数符号)
  • 加法: R + Y(若余数为负,恢复余数)

2) 除法异常的情况除法异常包括 除以 0 和 商溢出:

  • 情况 1:除以 0
  • 当除数 x = 0x00000000 时,无论 d[1] 为何值,触发除以 0 异常。
  • 情况 2:商溢出
  • 32 位补码商的范围是 [-2^31, 2^31 - 1]
  • d[1] = 0x80000000-2^31,32 位补码最小值)且 x = 0xFFFFFFFF-1)时:
  • 商为 (-2^31) / (-1) = 2^31,超出 32 位补码最大值 2^31 - 1,触发商溢出异常。异常响应的 CPU 操作异常响应时,CPU 需完成以下核心步骤:
  1. 保存现场
  • 保存当前程序计数器 PC(下一条指令地址)、通用寄存器(或关键字寄存器)状态、程序状态字 PSW(含标志位)。
  1. 跳转异常处理
  • 从中断向量表加载除法异常对应的服务程序入口地址,更新 PC。
  1. 模式切换与栈处理
  • 若当前为用户态,切换至内核态,使用内核栈执行异常处理(避免用户栈破坏)。
  1. 中断控制
  • 可选设置中断屏蔽位,防止嵌套异常干扰处理流程(视架构而定)。