运算方法与运算部件

有关「高级语言和机器指令中的运算」的内容,大部分都在其他课程(例如《计算系统基础》)中提及了,这里不再赘述。

基本运算部件

详细内容可见《计算系统基础》笔记——4. 运算方法和运算部件

全加器

设输入为加数 AA、被加数 BB 和低位进位 CinC_{\mathrm{in}},输出为和 FF 和高位进位 CoutC_{\mathrm{out}}。则有

{F=ABCinCout=AB+ACin+BCin\left\lbrace\begin{aligned} F &= A \oplus B \oplus C_{\mathrm{in}} \\ C_{\mathrm{out}} &= A \cdot B + A \cdot C_{\mathrm{in}} + B \cdot C_{\mathrm{in}} \end{aligned}\right.

详细内容见《计算系统基础》笔记中关于「全加器」的介绍

《计算系统基础》笔记中用的是 SS,这里是 FF,下同。

「串行进位加法器」见《计算系统基础》笔记中关于「行波进位加法器」的介绍

并行进位加法器

串行进位加法器采用串行逐级传递进位,电路延迟与位数成正比关系。因此,现代计算机采用一种先行进位(carry look ahead)方式。

定义辅助函数

{Gi=XiYi,进位生成函数Pi=Xi+Yi,进位传递函数\left\lbrace\begin{aligned} G_i &= X_i \cdot Y_i, &\text{进位生成函数}\\ P_i &= X_i + Y_i, &\text{进位传递函数} \end{aligned}\right.

全加逻辑方程

{Fi=XiYiCi1Ci+1=XiYi+(Xi+Yi)Ci=Gi+PiCi\left\lbrace\begin{aligned} F_i &= X_i \oplus Y_i \oplus C_{i-1} \\ C_{i+1} &= X_i \cdot Y_i + (X_i + Y_i) \cdot C_i = G_i + P_i \cdot C_i \end{aligned}\right.

通过计算 GiG_iPiP_i,可以直接计算出 Ci+1C_{i+1},而不需要等待 CiC_i 传递过来。

详细内容见《计算系统基础》笔记中关于「先行进位加法器」的介绍,里面的式子解释更为详细,同时还有不同颜色的标注。

《计算系统基础》笔记中 PiP_i 定义为 XiYiX_i \oplus Y_i,这没差,而且 FiF_i 里也会用到。

带标志加法器

对于溢出标志 OF\mathrm{OF}

OF=CnCn1\mathrm{OF} = C_n \oplus C_{n-1}

对于符号标志 SF\mathrm{SF}

SF=Fn1\mathrm{SF} = F_{n-1}

对于零标志 ZF\mathrm{ZF}

ZF=1    F=0\mathrm{ZF} = 1 \iff F = 0

对于进位/借位标志 CF\mathrm{CF}

CF=CinCout\mathrm{CF} = C_{\mathrm{in}} \oplus C_{\mathrm{out}}

算术逻辑部件(Alorithmic Logic Unit, ALU)

  • 进行基本算术运算与逻辑运算
  • 核心电路是整数加/减运算部件
  • 输出和/差标志信息
  • 操作控制端(ALUop),用来决定 ALU 所执行的处理功能。

定点数运算

补码加减运算

好像没啥好记的?

原码加减运算*

  • 用于浮点数尾数运算
  • 符号位和数值部分分开处理
  • 仅对数值部分进行加减运算,符号位起判断和控制作用

规则:

  • 比较两数符号,对加法实行「同号求和,异号求差」,对减法实行「异号求和,同号求差」。
  • 求和:数值位相加,若最高位产生进位,则结果溢出。和的符号取被加数(被减数)的符号。
  • 求差:被加数(被减数)加上加数(减数)的补码。分二种情况讨论:
    1. 最高数值位产生进位,表明加法结果为正,所得数值位正确。
    2. 最高数值位没有产生进位,表明加法结果为负,得到的是数值位的补码形式,需对结果求
      补,还原为绝对值形式的数值位
  • 差的符号位:
    • 上面的 1. 情况下,符号位取被加数(被减数)的符号
    • 上面的 2. 情况下,符号位为被加数(被减数)的符号取反

无符号数的乘法运算

被乘数 XX 与乘数 YY,按手算列竖式乘法的规则,有

X×Y=(X×Yi×2i)X \times Y = \sum (X \times Y_i \times 2^i)

采用递推减少保存各次相乘结果 X×YiX \times Y_i 的开销。

P0=0P_0 = 0,有

P1=2(P0+X×Yn)P2=2(P1+X×Yn1)Pn=2(Pn1+X×Y1)\begin{aligned} P_1 &= 2(P_0 + X \times Y_n)\\ P_2 &= 2(P_1 + X \times Y_{n-1})\\ &\vdots\\ P_n &= 2(P_{n-1} + X \times Y_1) \end{aligned}

递推有

Pi+1=2(Pi+X×Yni)P_{i+1} = 2(P_i + X \times Y_{n-i})

最终 Pn=X×YP_n = X \times Y

原码乘法运算

用于浮点数尾数乘运算。数值部分使用无符号乘法运算。

原码两位乘法操作递推公式:

  • 0000Pi+1=22PiP_{i+1} = 2^{-2} P_i
  • 0101Pi+1=22(Pi+X)P_{i+1} = 2^{-2} (P_i + X)
  • 1010Pi+1=22(Pi+2X)P_{i+1} = 2^{-2} (P_i + 2X)
  • 1111Pi+1=22(Pi+3X)=22(PiX)+XP_{i+1} = 2^{-2} (P_i + 3X) = 2^{-2} (P_i - X) + X (即本次 X-X,下次 +X+X

如下表所示,其中 TT 触发器用来记录下次是否要执行 +X+X,开始时为 00

Yi1Y_{i-1} YiY_i TT XX 操作 迭代公式
00 00 00 - 0T0\to T 22Pi2^{-2} P_i
00 00 11 +X+X 0T0\to T 22(Pi+X)2^{-2} (P_i + X)
00 11 00 +X+X 0T0\to T 22(Pi+X)2^{-2} (P_i + X)
00 11 11 +2X+2X 0T0\to T 22(Pi+2X)2^{-2} (P_i + 2X)
11 00 00 +2X+2X 0T0\to T 22(Pi+2X)2^{-2} (P_i + 2X)
11 00 11 X-X 1T1\to T 22(PiX)2^{-2} (P_i - X)
11 11 00 X-X 1T1\to T 22(PiX)2^{-2} (P_i - X)
11 11 11 - 1T1\to T 22Pi2^{-2} P_i

补码乘法运算

《计算系统基础》中关于「布斯一位乘」的介绍