【计算机组成原理·考研】运算方法和运算电路

本文详细介绍了算术逻辑单元(ALU)的核心部件,包括基本的加法器(如全加器、串行进位和并行进位加法器),以及定点数的移位、加减、乘除运算原理,涉及C语言中的类型转换和内存存储方式。
摘要由CSDN通过智能技术生成

1.基本运算部件

ALU的核心部件是加法器。

1.1 一位全加器

1.1.1 说明

是最基本的加法单元。有加数Ai、加数Bi与低位传进来的Ci-1三个输入;有本位和Si与向高位的进位Ci两个输出。

1.1.2 逻辑表达式

和表达式:image.png
进位表达式:
image.png

1.1.3 组成结构

image.png

1.1.4 逻辑符号

image.png

1.2 串行进位加法器

1.2.1 说明

将n个全加器相连得到的n位加法器。
串行进位又称行波进位,每级进位直接依赖于前一级的进位,换言之,进位信号是逐级形成的。

1.2.2 组成结构

image.png

说明

上述加法器实现了两个n位二进制数的逐位相加,其中输入:加数A = AnAn-1…A1,加数B = BnBn-1…B1;
输出:加数和S = SnSn-1…S1,进位输出Cn。
由于位数有限,于是高位自动丢失,因此上述加法运算实际上是模2n的加法运算。

特点

由于在串行加法器中,低位运算所需的时间将会影响到高位运算的时间,因此,串行加法器的最长运算时间主要是由进位信号的传递时间决定的。位数越多,延迟时间越长。因此加快进位产生和提高传递速度是提高串行加法器的运算效率的关键。

1.3 并行进位加法器

1.3.1 说明

能够同时生成进位信号和本位和,并且相互间没有依赖关系。

1.3.2 逻辑表达式

image.png
C1~C4的化简后的逻辑表达式:
image.png
可以看出,化简后的C1C4最终只与C0有关,又因为A1A4、B1B4和C0几乎可以同时到达,因此,我们也就可以几乎同时生成C1C4和本位和。

1.3.3 组成结构

image.png

说明

该实现上述逻辑表达式电路的部件称为先行进位加法器,简称CLA部件。因为这种部件的各个进位是并行产生的,所以这是一种并行加法器。

1.3.4 优缺点
优点

进位速度快,且与位数无关。

缺点

随着加法器位数的增加,电路结构变得愈发复杂。(解决:可以将加法器分成多个组,然后通过采取组内先行进位,组件串行进位的方式来降低电路结构的复杂性)
image.png

1.4 带标志加法器

1.4.1 说明

在无符号数加法器的基础上增加相应的逻辑门电路,使得加法器不仅能计算和/差,还能生成相应的标志信息。

1.4.2 组成结构

image.png

说明

其中,各标志信息的含义如下:
OF:溢出标志,OF = Cn⊕Cn-1。
SF:符号标志,就是和的标志,SF = Fn-1。
ZF:零标志,当且仅当F = 0时,ZF = 1。
CF:进位标志,Cin = 0时,CF = Cout;Cin = 1时,CF = -Cout。

1.5 算术逻辑单元(ALU)

1.5.1 说明

是一种功能较强的组合逻辑电路。能够进行多种算术运算(+、-、×、÷)和逻辑运算(与、或、非、异或、同或.,左移、右移…)。

1.5.2 组成结构

image.png

说明

其中ALUop是操作控制端,用来决定ALU所执行的处理功能。ALU的位数决定了操作的种类。

1.5.3 栗子🌰

image.png

说明

上述ALU能够完成与、或、非三种逻辑运算,其中一位加法采用一个全加器实现。由于该ALU能够完成三种逻辑运算,因此ALUop至少需要两位,在ALUop的控制下,由一个多路选择器(MUX)来选择输出三种操作结果的其中一个。

MUX是多路选择开关(多路选择器),它能从多个输入信号中选择一个送到输出端。

2.定点数的移位运算

2.1 算术运算

2.1.1 说明

针对于有符号数,在移位过程中,符号位保持不变。
image.png

Ps:
(1)对于带符号数,左移一位并且不产生溢出的话,相当于*2,;右移一位并且不产生溢出的话,相当于÷2。
(2)原码左右移均补0,且保持符号位不变。
(3)在算术移位的情况下,补码左移的前提是最高有效位与原符号位要相同。
(4)在算术移位的情况下,双符号位的移位操作只有低符号位需要参加移位操作。

2.2 逻辑运算

2.2.1 说明

将操作数视为无符号数。
左移右移均补0,舍弃最高位(左移)/最低位(右移)。

2.3 循环移位

2.3.1 分类

带进位标志位CF的循环移位(大循环)
不带进位标志位CF的循环移位(小循环)。

2.3.2 特点

image.png
从上图可以看出,两种循环移位方式的区别在于进位标志位CF是否参与到数据的循环移位中,具体如何循环移位的,上图已经表达的非常清楚了,这里不做过多的文字赘述。
循环移位适合将数据的低字节数据和高字节数据进行互换。

3.定点数的加减运算

3.1 补码的加减法运算

3.1.1 运算公式

image.png

3.1.2 特点

(1)若做加法,则直接将两个加数的补码相加;若做减法,则将被减数与减数的机器负数相加。
(2)最终运算结果将高位丢弃,保留n+1位。

3.1.3 栗子🌰

image.png

3.1.4 运算电路

image.png

说明

上述电路中,可以通过Sub控制端来决定是进行加法还是减法操作。当Sub = 1时,则将Y反 输入到加法器中,从而实现了减法运算;同理,Sub = 0时,则将Y输入到加法器中,从而实现加法运算。
上述结构中,对于X与Y,如果为负数,则X与Y均为对应的补码表示;反之,则为对应的二进制表示。
标志位信息:
OF:溢出标志。表示带符号整数运算时发生溢出,仅对有符号数有效。
SF:符号标志。表示运算结果的符号,仅对有符号数有效。
ZF:零标志。表示运算结果为0,对有/无符号数均有效。
CF:进/借位标志。当进行加法运算时,如果CF = 1,则表示结果溢出,此时 CF = Cout;当进行减法运算时,如果CF = 1,则表示不够减,产生借位,此时 CF = -Cout。因此 CF = Sub ⊕ Cout。仅对无符号数有效。

3.2 原码的加减法运算(了解)

3.2.1 说明
加法规则

若符号相同,则将绝对值相加,并保证结果的符号不变;若符号不同,则进行减法,用绝对值大的减绝对值小的,结果符号位与绝对值大的一致。

减法规则

将减数的符号位取反,然后按照上面的加法规则将这两个数进行相加。

Ps:运算发生溢出时,溢出位仍要被舍弃。

3.3 溢出判别方法

3.3.1 说明

溢出情况只可能会发生在两个符号相同的数相加或相关符号相异的数相减。

3.3.2 判别方法(3种)
采用一位符号位

由于减法运算在机器中是用加法器实现的,因此无论是加法还是减法都将统一被视为加法进行处理。因此,如果出现参与运算的两个数的符号相同,但结果却与原操作数不同,则一定发生了溢出。
溢出表达式
image.png
V = 0时,表示无溢出;V =1时,表示有溢出。

采用双符号位

运算结果的两个符号位相同,表示运算产生溢出;两个符号位不同,则表示运算结果未溢出,此时最高位代表的真正的符号。
双符号位可能出现的情况:
(1)Ss1Ss2 = 00:结果为正数,无溢出。
(2)Ss1Ss2 = 01;结果正溢出。
(3)Ss1Ss2 = 10;结果负溢出。
(4)Ss1Ss2 = 11;结果为负数,无溢出。
溢出表达式
image.png
V = 0时,表示无溢出;V =1时,表示有溢出。

采用一位符号位+数据位的进位情况

若符号位的进位Cs与最高数位的进位C1相同,则表示无溢出;反之则溢出。
溢出表达式
image.png
V = 0时,表示无溢出;V =1时,表示有溢出。

PS:
(1)溢出判断电路一般采用 异或 门实现。
(2)模4补码具有模2补码的全部优点,并且更易检查出加减运算中的溢出问题。
(3)存储模4补码仅需要一个符号位,因为任何一个正确的数值,模4补码的两个符号位总是相同的。
(4)只在把两个模4补码的数送往ALU中完成加减运算时,此时才会把每个数的符号位的值同时送到ALU的双符号位中,即只在ALU中采用双符号位。

4.定点数的乘除运算

4.1 定点数的乘法运算

乘法运算可以转换为 累加-右移。

4.1.1 原码一位乘法
4.1.1.1 说明

部分积:乘数的每一位与被乘数相乘后再与前面所得的结果的和称为部分积。

4.1.1.2 特点

符号位与数值位分开计算。符号位由两个数的符号位异或而来;数值位则是两个数的绝对值的相乘之积。
4.1.1.3 运算过程
(1)符号位取两个数的符号位的异或结果。
(2)数值位的运算则先从乘数的最低位开始,如果乘数位 = 1,则将部分积(初始值为0)加上被乘数;反之若为0,则不做操作(也可以说部分积 + 0)。随后将部分积右移一位。重复该过程n次(乘数的位数)。

由于运算的是两个数的绝对值(无符号数),因此,计算过程中的右移操作均为逻辑右移。

4.1.1.3 栗子🌰

image.png

4.1.1.4 运算电路

image.png

说明

上图电路结构用于计算两个32位无符号数的乘法运算。
其中计数器Cn初始值为32,每进行一次循环操作减1。
进位位C则用于存储出现进位情况时的进位。
ALU则是乘法运算操作的核心。ALU用于对乘积寄存器P和被乘数寄存器做无符号加法运算。
每一次循环,都会对进位位C、乘积寄存器P和乘数寄存器Y进行同步右移,Y的最低位将会输入到控制逻辑,以决定下次部分积是否加上被乘数。

4.1.2 补码一位乘法(Booth算法)
4.1.2.1 说明

(1)符号位参与运算,运算的数均以补码形式表示。
(2)被乘数、部分积采用双符号位;乘数采用单符号位。
(3)乘数末位增设一个附加位。
(4)移位规则
image.png
(5)右移按补码算术右移规则进行。
(6)如果有两个n位补码参与乘法运算,在该算法下,共需进行 n + 1次累加和 n 次右移操作(第n + 1次不进行右移操作)。

4.1.2.2 栗子🌰

image.png
image.png

4.1.2.3 运算电路

image.png

说明

(1)因为是带符号运算,所以不再需要进位位。
(2)每次循环,乘积寄存器P和乘数寄存器Y将实现同步算术右移。
(3)每次从乘数寄存器Y中的最低位和次低位来决定部分积是-[x]补、0还是+[x]补。
(4)其他和原码乘法运算电路的功能基本一致。

PS:
乘积位数 = 2n + 1 = 补码一位运算中乘积共向右移动n次 + 原来的n位 + 1位符号位。

4.2 定点数的除法运算

除法运算可以转换为 累加-(逻辑)左移。

4.2.1 符号拓展
4.2.1.1 说明

将带符号的定点数表示成具有不同位数的表示形式。
比如,有时候需将一个8位的数和一个32位的数进行加法运算,这时候就需要将其中位数较少的数(本例中也就是位数为8的加数)拓展为较长的位数的数的位数(也就是本例中的32位的加数),然后才能进行加法运算操作。

4.2.1.2 拓展规则
正数

符号位不变,拓展位用0填充。

负数

原码:符号位为1,拓展位用0填充。
补码:原符号位移动到拓展后的数的符号位的位置上。对于整数而言,拓展位用1填充;对于小数而言,拓展位用0填充。

4.2.2 原码除法运算(不恢复余数法/加减交替法)
4.2.2.1 运算规则

(1)符号位由参与除法运算的两个数的符号位异或而来。
(2)先用被除数 - 除数,余数为正时,商1,余数和商左移一位;余数为负时,商0,余数和商左移一位,并加上除数(当 n + 1次的余数为负时,此时需要加上除数以得到正确的最终的余数))。

4.2.2.2 栗子🌰

image.png
image.png

4.2.3 补码除法运算(加减交替法)
4.2.3.1 特点

(1)符号位参与运算。
(2)被除数、除数、商、余数均用补码表示。
(3)被除数和除数的符号决定是做加法还是做减法。
(4)除数和余数的符号决定上商1还是上商0。

4.2.3.2 运算规则

(1)若被除数与除数同号,则被除数 - 除数;若二者异号,则被除数 + 除数。
(2)若余数和余数同号,则上商1,余数左移一位并减去余数;若二者异号,则上商0,余数左移一位并加上余数。重复操作n次。
(3)如果对商的精度没有要求,则一般将商的末尾置1。

4.2.3.3 栗子🌰

image.png
image.png

4.2.3.4 运算电路

image.png

说明

余数寄存器R存储被除数的高位部分,余数/商寄存器Q存储被除数的低位部分。
每次循环,余数寄存器R和余数/商寄存器Q进行同步左移,同时余数/商寄存器Q的最低位存入本次循环的上商结果,该上商结果由控制逻辑根据ALU的运算结果符号进行控制。

5.C语言中的类型转换

5.1有符号数和无符号数的转换

5.1.1 说明

保持位值不变,只改变解释这些位的方式。

5.1.2 栗子🌰
int main(){

    short x = -4321;
    unsigned short y = (unsigned short)x;
    printf("x = %d,y = %d\n",x,y);

}

输出结果:
image.png

说明

从上面代码可以看出,x为负数,无符号数y显然不能表示成x,并且最终打印的结果也说明y和x没有一点关系。不过,我们可以将二者的补码表示出来,你会发现,二者的补码其实是一样的。也就是说,强制类型转换并没有改变数对应的位数据,仅仅改变了解释这些位数据的方式而已。
image.png

5.2 不同字长整数之间的转换

5.2.1 说明

大字节变量向小字节变量进行转换时,会将多余的高位截断舍弃,低位直接赋值。
小字节变量向大字节变量进行转换时,对于无符号数,则直接进行零填充(拓展位补0);对于有符号数,进行符号拓展(对于正数,则补0,;对于负数,则补1,即拓展的高位用原符号位进行填充)。

5.2.2 栗子🌰
int main(){

	short x = -4321;
    int y = x;
    unsigned short u = (unsigned short)x;
    unsigned int v = u;
    printf("x = %d,y = %d\n",x,y);
    printf("u = %d,v = %d\n",u,v);
    
}

输出结果:
image.png

从上面的举例可以发现,不同符号数的转换是保证位值的相等;不同位数的转换则是保证数值的相等。
char类型为8位无符号整数,转换为int时高位补0即可。

6.数据的存储和排列

6.1 大端方式/小端方式 方式存储

6.1.1 说明
LSB

最低有效字节。表示数的低位。

MSB

最高有效字节。表示数的高位。
栗子🌰
一个int类型的变量i的机器数为 01 23 45 67H,其中,LSB = 67H,MSB = 01H。

大端方式

将高有效字节存储到低地址部分,低有效字节存储到高地址部分。

小端方式

将高有效字节存储到高地址部分,低有效字节存储到低地址部分。
image.png

6.2 边界对齐 方式存储

6.2.1 说明
边界对齐

对于机器字长为32位的计算机,数据以边界对其的方式存放。半字地址一定是2的整数倍,字地址一定是4的整数倍。这样无论取何种类型的数据,均可经过一次访存得到。这其实是一种空间换时间的思想。
image.png

精简指令集系统计算机(RISC)采用边界对齐方式,因为对齐方式使取指令时间相同,便于进行指令流水操作。

边界不对齐

这样做可以充分利用存储空间,但是半字或字长的指令可能存放于两个存储字中,因此取出就可能需要两次访存。这其实是一种时间换空间的思想。
image.png

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程旧事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值