跳至主要內容

2.运算方法和运算电路


一、基本运算部件

  • 运算器由算术逻辑单元 ( Arithretic Logic Unit, ALU)、移位器、状态寄存器和通用寄存器组等组成
  • 运算器的基本功能包括加、减、乘、除四则运算,与、或、非、异或等逻辑运算,以及移位、求补等操作
  • 核心部件是加法器

标志位

  • 溢出标志:OF=CnCn1OF=C_{n}\oplus C_{n-1}
  • 符号标志就是和的符号:SF=Fn1SF=F_{n-1}
  • 零标志 ZF=1ZF=1当且仅当F=0F=0
  • 进位/借位标志CF=CoutCinCF=C_{out}\oplus C_{in}

ALU 是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。核心是带标志加法器

二、定点数的移位运算

1.算数移位

码制添加代码
正数原码、反码、补码0
负数原码0
负数补码左移添0,右移添1
负数反码1

三种机器数移位后符号都不变

2.逻辑移位

逻辑移位的操作数视为无符号数
左移:高位丢失,低位添0
右移:低位丢失,高位添0

3.循环移位

带标志位的循环移位(大循环)和不带标志位的循环移位(小循环)
不带进位位的循环左移将最高位进入最低位和标志寄存器C位。

三、定点数的加减运算

1.补码的加减法运算

[A+B]=[A]+[B](mod2n+1)[A+B]_\text{补} = [A]_\text{补}+[B]_\text{补} (\mod 2^{n+1})
[AB]=[A]+[B](mod2n+1)[A-B]_\text{补} = [A]_\text{补}+[-B]_\text{补} (\mod 2^{n+1})

注意

其中[B][-B]_\text{补} 等于连同[B][B]_\text{补}的符号位取反+1,计算的结果是补码

溢出判断

设A的符号位为AsA_{s},B的符号位为BsB_{s},运算结果的符号位为SsS_{s}

V=AsBsCs+AsBsCs V = A_{s}B_{s}\overline{C_{s}} + \overline{A_{s}B_{s}}C_{s}

V=0V=0,无溢出;V=1V=1,溢出

提示

这里没什么神奇的,无非对应了四种情况[1],如下所示

AsA_{s}BsB_{s}SsS_{s}VV
0000
0011
1101
1110

2.原码的加减法运算

加法:先判断符号位,相同则绝对值相加符号位不变,不同做减法,绝对值大的减小的,符号和绝对值大的相同

减法:将减数符号取反在做加法运算

左边位出现溢出时,溢出位丢掉

3.无符号数加减运算

在计算机内,无符号数的加减运算同有符号数一样,也是转换为补码进行运算,只是最后对于结果的解释不一样

// 情形一
unsigned A, B;
A = 0;
B = 1;
A - B;

则运算为[A]+[B]=[0]+[1]=FFFFFFFFH[A]_{\text{补}}+[-B]_{\text{补}}=[0]_{\text{补}}+[-1]_{\text{补}}=FFFFFFFFH

只不过最后的结果是按照无符号数来解释,那么最后的结果就是FFFFFFFFH

// 情形二
int A, B;
A = 0;
B = 1;
A - B;

此时结果仍为FFFFFFFFH,但是按照有符号数来解释,结果就是-1(真值)

四、定点数的乘除运算

1.定点数的乘法运算

乘法运算可以由累加和右移位实现

手算乘法的本质

手算时的移位本质上就是为了便于中间结果进行求和,错位是因为不同结果的权不一样
image.png
image.png

原码一位乘[2]

符号位和数值位分开求,符号位由两个数的符号位亦或形成,乘积部分是两个数的绝对值相乘之积

运算步骤如下:

  1. 被乘数和乘数都取绝对值参与运算,且符号位由两个数的符号位亦或形成
  2. 部分积是乘法过程的中间结果。乘数的每一位yiy_{i}乘以被乘数,该结果和前面所得的结果(部分积)累加,其中部分积初值是0
  3. 从乘数的最低位yny_{n}开始判断,若yn=1y_{n} = 1,则部分积加上被乘数x\mid x |,右移一位,否则部分积加上0,右移一位
  4. 重复步骤3,判断nn次。其中右移和加法都是判断nn

部分积和乘数做加法的过程中,可能存在部分积溢出的情况,但是此时并非溢出,所以部分积和乘数采用双符号位[3]

例子:

图像.png
图像.png

补码一位乘(BOOTH算法)

步骤如下:

  1. 运算数的符号参与运算,都以补码表示,最终符号的结果由运算所得
  2. 被乘数取双符号位,部分积也取双符号位,初值为0,乘数取单符号位
  3. 在乘数末尾增设附加位yn+1y_{n+1},初值为0
  4. 再根据yn+1yny_{n+1}-y_{n}:
    1. 结果为0,部分积加上0
    2. 结果为1,部分积加上[x][x]_\text{补}
    3. 结果为-1,部分积加上[x][-x]_\text{补}
    4. 部分积右移一位
  5. 算法进行n+1n+1步操作,累加n+1n+1次,右移nn

例子:

图像.png
图像.png

两者的区别

image.png
image.png

2.定点数的除法运算

除法可以转换成累加+左移(逻辑左移)

原码除法

恢复余数法
加减交替法(不恢复余数法)
  • 减法操作用补码实现,符号由两个操作数符号异或形成
  • 被减数减去除数,余数为(说明够除),上商1,余数和商左移一位,再减去除数;为负,上商0,余数和商左移一位,再加上除数
  • n+1n+1步余数为负时,需要加上除数Y\mid Y|得到正确的除数,即不恢复余数法仅当最后一步不够减的时候才恢复余数
  • nn次移位,n+1n+1次加法

补码除法(加减交替法)

  • 符号位和数值位一同运算
  • 根据被除数和除数符号决定做加法还是减法
  • 上商根据余数和除数符号决定,同1,左移减除数,异0,左移加除数[4],最后一步商恒置1(所以会有一定误差)
  • nn次移位,n+1n+1次加法

数据的存储和排列

数据的“大端方式”和“小端方式”存储

例如,在 32 位计算机中,一个int 型变量i的机器数为 01 23 45 67H,其最高有效宇节MSB =01H,最低有效宇节LSB=67H

image.png
image.png
  • 大端方式按从最高有效字节到最低有效字节的顺序存储数据,即最高有效字节存放在前面;
  • 小端方式按从最低有效字节到最高有效字节的顺序存储数据,即最低有效字节存放在前面。

数据按“边界对齐”方式存储

  • 假设存储字长为 32 位,可按字节、半字和字寻址。对于机器字长为 32 位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4 的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样虽然浪费了一些存储空间,但可提高取指令和取数的速度
  • 数据不按边界对齐方式存储时,可以充分利用存储空间,但半字长或字长的指令可能会存储在两个存储字中,此时需要两次访存,并且对高低字节的位置进行调整、连接之后才能得到所要的指令或数据,从而影响了指令的执行效率
image.png
image.png

  1. 按照真值表来考虑,这里应该有八种情况(从000111),然而其中有四种状态是无效的,因为只有两个符号位相同的数运算结果才可能溢出 ↩︎

  2. 原码的乘法运算--8:59open in new window ↩︎

  3. 双符号位最高位为真正的符号位,移位时部分积的符号位也跟着移位,并且在最高位添0 ↩︎

  4. 还有一种说法是被除数和除数异号相除时,够减上0,不够减上1 ↩︎