有关「高级语言和机器指令中的运算」的内容,大部分都在其他课程(例如《计算系统基础》)中提及了,这里不再赘述。
基本运算部件
详细内容可见《计算系统基础》笔记——4. 运算方法和运算部件。
全加器
设输入为加数 A、被加数 B 和低位进位 Cin,输出为和 F 和高位进位 Cout。则有
{FCout=A⊕B⊕Cin=A⋅B+A⋅Cin+B⋅Cin
详细内容见《计算系统基础》笔记中关于「全加器」的介绍。
《计算系统基础》笔记中用的是 S,这里是 F,下同。
「串行进位加法器」见《计算系统基础》笔记中关于「行波进位加法器」的介绍。
并行进位加法器
串行进位加法器采用串行逐级传递进位,电路延迟与位数成正比关系。因此,现代计算机采用一种先行进位(carry look ahead)方式。
定义辅助函数
{GiPi=Xi⋅Yi,=Xi+Yi,进位生成函数进位传递函数
全加逻辑方程
{FiCi+1=Xi⊕Yi⊕Ci−1=Xi⋅Yi+(Xi+Yi)⋅Ci=Gi+Pi⋅Ci
通过计算 Gi 和 Pi,可以直接计算出 Ci+1,而不需要等待 Ci 传递过来。
详细内容见《计算系统基础》笔记中关于「先行进位加法器」的介绍,里面的式子解释更为详细,同时还有不同颜色的标注。
《计算系统基础》笔记中 Pi 定义为 Xi⊕Yi,这没差,而且 Fi 里也会用到。
带标志加法器
对于溢出标志 OF 有
OF=Cn⊕Cn−1
对于符号标志 SF 有
SF=Fn−1
对于零标志 ZF 有
ZF=1⟺F=0
对于进位/借位标志 CF 有
CF=Cin⊕Cout
算术逻辑部件(Alorithmic Logic Unit, ALU)
- 进行基本算术运算与逻辑运算
- 核心电路是整数加/减运算部件
- 输出和/差及标志信息
- 有操作控制端(ALUop),用来决定 ALU 所执行的处理功能。
定点数运算
补码加减运算
原码加减运算*
- 用于浮点数尾数运算
- 符号位和数值部分分开处理
- 仅对数值部分进行加减运算,符号位起判断和控制作用
规则:
- 比较两数符号,对加法实行「同号求和,异号求差」,对减法实行「异号求和,同号求差」。
- 求和:数值位相加,若最高位产生进位,则结果溢出。和的符号取被加数(被减数)的符号。
- 求差:被加数(被减数)加上加数(减数)的补码。分二种情况讨论:
- 最高数值位产生进位,表明加法结果为正,所得数值位正确。
- 最高数值位没有产生进位,表明加法结果为负,得到的是数值位的补码形式,需对结果求
补,还原为绝对值形式的数值位。
- 差的符号位:
- 上面的 1. 情况下,符号位取被加数(被减数)的符号
- 上面的 2. 情况下,符号位为被加数(被减数)的符号取反
无符号数的乘法运算
被乘数 X 与乘数 Y,按手算列竖式乘法的规则,有
X×Y=∑(X×Yi×2i)
采用递推减少保存各次相乘结果 X×Yi 的开销。
设 P0=0,有
P1P2Pn=2(P0+X×Yn)=2(P1+X×Yn−1)⋮=2(Pn−1+X×Y1)
递推有
Pi+1=2(Pi+X×Yn−i)
最终 Pn=X×Y。
原码乘法运算
用于浮点数尾数乘运算。数值部分使用无符号乘法运算。
原码两位乘法操作递推公式:
- 00:Pi+1=2−2Pi
- 01:Pi+1=2−2(Pi+X)
- 10:Pi+1=2−2(Pi+2X)
- 11:Pi+1=2−2(Pi+3X)=2−2(Pi−X)+X(即本次 −X,下次 +X)
如下表所示,其中 T 触发器用来记录下次是否要执行 +X,开始时为 0。
Yi−1 |
Yi |
T |
X |
操作 |
迭代公式 |
0 |
0 |
0 |
- |
0→T |
2−2Pi |
0 |
0 |
1 |
+X |
0→T |
2−2(Pi+X) |
0 |
1 |
0 |
+X |
0→T |
2−2(Pi+X) |
0 |
1 |
1 |
+2X |
0→T |
2−2(Pi+2X) |
1 |
0 |
0 |
+2X |
0→T |
2−2(Pi+2X) |
1 |
0 |
1 |
−X |
1→T |
2−2(Pi−X) |
1 |
1 |
0 |
−X |
1→T |
2−2(Pi−X) |
1 |
1 |
1 |
- |
1→T |
2−2Pi |
补码乘法运算
见《计算系统基础》中关于「布斯一位乘」的介绍。