计算机组成原理 | 原码一位乘法运算方法

🧮计算机乘法大揭秘:CPU是如何做乘法的?

大家好!👋

你有没有想过,当我们在代码里写下a * b的时候,那个只有0和1的冷冰冰的CPU,到底是怎么把这两个数乘起来的?

难道它背了九九乘法表?🤔

当然不是!它用的是一种最朴实无华,却又充满智慧的方法------"累加与移位" 。今天,我们就来扒一扒计算机组成原理中关于无符号整数乘法(也就是原码一位乘法的核心逻辑)的底层秘密!🕵️‍♂️

如果你在阅读本篇时感觉有点"卡顿",或者对某些术语感到似曾相识却又想不起来,建议先去复习一下我往期发布的"基础装备"系列。磨刀不误砍柴工,掌握以下前置知识,会让你的学习体验丝滑如德芙:

计算机组成原理 | 定点数加减运算

计算机组成原理 | ALU 全解析

计算机组成原理 | 移位运算

准备好了吗?系好安全带,我们要发车了!🚀

⚙️ 硬件大揭秘:谁在干活?

在开始运算之前,我们需要召集几位"硬件干将":

  • 被乘数寄存器 (X) :存放那个固定的被乘数,它是个老实人,全程不动。

  • 乘数寄存器 (Y) :存放乘数,我们要盯着它的每一位看。

  • 乘积寄存器 (P) :用来存中间结果,一开始是空的(全0)。

  • 进位触发器 (C) :专门负责记录加法产生的进位。

  • 计数器 (Cn) :像个倒计时器,记录还要做几次运算(如果是n位数,就设为n)。

  • ALU (算术逻辑单元) :真正的计算核心,负责做加法。


🏃‍♂️ 运算过程:一场 n 轮的接力赛

假设我们要计算两个 n 位的二进制数相乘,CPU 会开启一个循环,重复 n 次。

(这里乘数与被乘数的位数可以不相同,计算前向高位对齐即可,

类似于浮点数运算的对阶操作)

准备工作:

  1. 被乘数放入 X,乘数放入 Y。

  2. P 寄存器清零。

  3. 计数器 Cn 设为 n。

比赛开始!(重复 n 轮)

  1. 第一步:看脸色行事 👀

    • 盯着乘数寄存器 Y 的最低位(最后一位)。

    • 如果是 1:控制逻辑大喊一声"加法!",ALU 就把 P 和 X 加起来,结果放回 P。(如果有进位,C 就记下来)。

    • 如果是 0:控制逻辑说"休息",P 保持不变。

  2. 第二步:整体大挪移 ➡️

    • 这是最关键的一步!将 [C, P, Y] 视为一个整体,向右移动一位。

    • 这意味着:C 的内容移入 P 的最高位,P 的最低位移入 Y 的最高位,Y 的最低位被"挤"出去扔掉(因为它已经处理完了)。

  3. 第三步:倒计时减一 ⏳

    • 计数器 Cn 减 1。

    • 如果 Cn 不为 0,回到第一步继续;如果 Cn 为 0,比赛结束!


📌 举个栗子:3 × 5 是怎么算的?

为了让大家看明白,我们不用复杂的32位数,假设机器字长 n=4,我们来算算 3 × 5

  • 被乘数 X = 0011 (二进制 3)

  • 乘数 Y = 0101 (二进制 5)

  • 初始 P = 0000

  • 计数器 Cn = 4

第 1 轮:

  1. 看 Y 的末位 :是 1

  2. 加法:P + X = 0000 + 0011 = 0011。P 变为 0011。

  3. 右移:[P, Y] 整体右移。

    • P 变为 0001,Y 变为 1010(P的末位1移到了Y的最高位)。
  4. 计数:Cn = 3。

第 2 轮:

  1. 看 Y 的末位 :是 0

  2. 加法:不加,P 保持 0001。

  3. 右移:[P, Y] 整体右移。

    • P 变为 0000,Y 变为 1101。
  4. 计数:Cn = 2。

第 3 轮:

  1. 看 Y 的末位 :是 1

  2. 加法:P + X = 0000 + 0011 = 0011。P 变为 0011。

  3. 右移:[P, Y] 整体右移。

    • P 变为 0001,Y 变为 1110。
  4. 计数:Cn = 1。

第 4 轮:

  1. 看 Y 的末位 :是 0

  2. 加法:不加,P 保持 0001。

  3. 右移:[P, Y] 整体右移。

    • P 变为 0000,Y 变为 1111。
  4. 计数:Cn = 0,结束!

最终结果:

  • 乘积的高位在 P (0000),低位在 Y (1111)。

  • 合起来就是 0000 1111,也就是十进制的 15

  • 完美!🎉


🚦 结局与溢出:是福还是祸?

运算结束后,我们会得到一个 2n 位的结果(由 P 和 Y 拼成)。

  • 关于结果:通常我们只保留低 n 位(也就是 Y 里的内容)作为最终结果。

  • 关于溢出 (Overflow):

    • 如果高位 P 不全为0 ,说明结果太大了,低 n 位装不下,发生了溢出

    • 这时候,CPU 会把溢出标志位 OF 置为 1

程序员的选择:

  1. 摆烂:假装没看见,直接用错的结果(有时候在某些算法里是允许的)。

  2. 不摆烂:在乘法指令后加一条"溢出自陷指令",一旦 OF=1,就触发异常处理程序,比如报错"数值过大"。


📝 408 & 期末 模拟小测验

光看不练假把式,来试试这几道题,看看你是不是真的懂了!

**题目 1 (基础题):**在无符号数乘法运算中,若乘数寄存器 Y 的当前最低位为 0,则本周期内硬件应执行的操作是?

A. P + X,然后右移 B. P + 0,然后右移

C. 仅右移,不加法 D. 仅加法,不右移

**题目 2 (进阶题):**字长为 8 位的 CPU 进行无符号乘法运算。若运算结束后,乘积高位寄存器 P 的值为 00000001,则说明?

A. 运算结果正确,无溢出 B. 发生了溢出,OF=1

C. 乘数 Y 的最低位一定是 1 D. 计数器 Cn 还没减到 0

**题目 3 (计算题):**若 X = 0010 (2), Y = 0011 (3),请简述第一轮加法操作后,P 寄存器的值是多少(右移前)?


答案揭晓:

  1. C (遇到0,什么也不做,直接准备移位)

  2. B (P 不全为0,说明结果超过了8位能表示的范围,溢出!)

  3. 0010 (第一轮Y末位是1,P初始为0,0+X=0010)

相关推荐
前端若水7 小时前
从零开始学习AI Agent的实战路线图
人工智能·学习
魔法阵维护师8 小时前
从零开发游戏需要学习的c#模块,第十一章(rpg小游戏入门,上篇,地图与移动)
学习·游戏·c#
qq_525513758 小时前
# 第七章 指令微调学习(四) 7.6基于指令数据对大语言模型进行微调
深度学习·学习·语言模型
Harm灬小海8 小时前
【云计算学习之路】学习Centos7系统-ROOT密码重置方法
linux·运维·服务器·学习·云计算
晓梦林9 小时前
stitch靶场学习笔记
笔记·学习
z200509309 小时前
【linux学习】linux的一些奇怪知识,方便日常使用
学习
魔法阵维护师9 小时前
从零开发游戏需要学习的c#模块,第十三章(rpg小游戏入门,下篇,地图敌人与战斗触发)
学习·游戏·c#
. . . . .9 小时前
业务知识学习
学习
_Evan_Yao9 小时前
如何搭建属于自己的技术博客(CSDN / GitHub Pages)
后端·学习·github