跳至主要內容

计算机组成原理

程序员李某某大约 24 分钟

计算机组成原理

概述

早期冯诺依曼机

  • 计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备
  • 指令和数据以同等地位存储在存储器中,并可按地址寻访
  • 指令和数据均以二进制代码表示
  • 指令由操作码和地址码组成,操作码指出操作的类型,地址码指出操作数的地址
  • 指令在存储器内按顺序存放
  • 早期的冯诺依曼以运算器为中心,输入输出设备通过运算器与存储器传输数据

存储程序:将指令以代码的形式先输入到计算机的主存储器中,然后按按照存储器的首地址开始,按规定顺序执行指令

数据通过输入设备将信号转换为机器可以识别的二进制数据,

通过运算器中转存到存储器

通过运算器计算,再通过输出设备,将二进制转化为人类语言

控制器协调输入设备、输出设备、运算器、存储器

现代计算机

微处理器问世之前,运算器和控制器是分离的,而且存储器容量很小,因此以运算器为中心

随着微电子技术的进步,计算机需要处理加工的信息量与日俱增,大量的IO设备速到与CPU的速度差距悬殊,不能以运算器为中心

现在计算机以存储器为中心,使IO操作尽可能绕过CPU,直接在IO设备和存储器之间完成

现代CPU一般包含两部分,运算器和控制器

组成

硬件

  • 主机

    • CPU

      • 运算器:用于实现算数运算、逻辑运算
        • ACC:累加器,用于存放操作数、运算结果
        • MQ:乘商寄存器,寄存乘除运算的操作数和运算结果
        • X:通用的操作数寄存器
        • ALU:算术逻辑单元,通过内部复杂的电路实现算数运算和逻辑运算
      • 控制器:指挥中心,协调作用
        • 取指令--程序计数器(PC):存放将要执行的指令地址,执行后自动+1,与MAR直接连通
        • 分析指令--指令寄存器(IR):存放当前的指令,指令内容来自主存的MDR,指令中的操作码送给CU
        • 执行指令--控制单元(CU):分析IR中发来的指令码,发出各种微操作命令序列;IR发来的地址码送往MDR取操作数
    • 存储器:

      • 主存(内存)

        • CPU可以直接访问主存,辅存必须写入主存后才能被CPU访问
        • 主存是按存储单元的地址进行存取
        • 存储体:存储二进制数据,按地址存储
          • 每个地址对应一个存储单元,存储单元是由存储字组成
          • 存储字:二进制代码组合,这串代码就是存储字
          • 存储字长:存储单元中二进制代码的位数
          • 存储元件:每个存储元件存储0或1,可以存储1bit,是根据电容设计的
        • 地址寄存器(MAR):存放地址,MAR的位数反映存储单元的个数,如MAR=4,则总共有2^4个存储单元,MAR的长度与PC的长度相等
        • 数据寄存器(MDR):暂存读写的数据,MDR位数 = 存储字长
        • 虽然MAR、MDR属于存储器,但是现代的设计都是在CPU中
      • 辅存(外存、硬盘) --- 一般归为IO设备

  • 外设

    • 输入设备
    • 输出设备

程序运行

int a=2,b=3,c=1,y=0;
void main(){
    y = a*b+c;
}
主存地址			指令(操作码|地址码)		注释
	0			000001	0000000101		取数a到ACC
	1			000100	0000000110		乘b得ab,存于ACC
	2			000011	0000000111		加c的ab+c,存于ACC
	3			000010	0000001000		将ab+c存于主存存储单元
	4			000110	0000000000		停机
	5			0000000000000010		a=2
	6			0000000000000011		b=3
	7			0000000000000001		c=1
	8			0000000000000000		y=0

每条指令都需要经过取出指令、分析指令、执行指令三个步骤

  • 取出指令经过:控制器的程序计数器(PC)、主存的地址寄存器(MAD)、主存的存储体、主存的数据寄存器(MDR)、控制器的指令寄存器(IR)
  • 分析指令经过:控制器的指令寄存器(IR)、控制器的控制单元(CU)
  • 执行命令经过:控制器的控制单元(CU)、取数、运算器

第一条指令:

  • #0:(PC)= 0,初始时,指向第一条指令的存储地址

  • #1:(PC)->MAR,在MAR中读取第一条指令的地址,(MAR) = 0

  • #3:M(MAR)->MDR,在存储体中拿到地址为0的数据传给MDR,MDR=000001 0000000101

  • #4:(MDR)->IR,指令寄存器IR = 000001 0000000101

  • #5:OP(IR)->CU,将IR中的操作码送到CU,CU分析得知是取数指令

  • #6:Ad(IR)->MAR,将IR中的地址码送到MAR,拿到数据的地址,(MAR) = 5

  • #8:M(MAR)->MDR,在存储体中拿出地址为5的数据传给MDR,MDR=0000000000000010

  • #9:(MDR)->ACC,CU指导将MDR传给ACC

第二条指令:

  • #0:第一条指令执行后,PC自动+1,(PC)=1,ACC = 2

  • #1:(PC)->MAR,在MAR中读取第二条指令的地址,(MAR) = 1

  • #3:M(MAR)->MDR,在存储体中取出地址为1的数据传给MDR,MDR = 000010 0000001000

  • #4:(MDR)->IR,传给IR = 000010 0000001000

  • #5:OP(IR)->CU,将IR的操作码从到CU,CU分析得知是乘法指令

  • #6:Ad(IR)->MAR,将IR中的地址码送到MAR,拿到数据的地址,(MAR) = 6

  • #8:M(MAR)->MDR,在存储体中拿出地址为5的数据传给MDR,MDR=0000000000000011

  • #9:(MDR)->MQ,将MDR传到乘商寄存器,MQ=0000000000000011

  • #10:(ACC)->X,将ACC中的2传到通用寄存器,X = 2

  • #11:(MQ)*(X)->ACC,将计算结果传到ACC,ACC=6,如果乘积过大,需要MQ辅助存储

第三条指令

  • #0:第一条指令执行后,PC自动+1,(PC)=2,ACC = 6
  • #1:(PC)->MAR,在MAR中读取第二条指令的地址,(MAR) = 2
  • #3:M(MAR)->MDR,在存储体中取出地址为1的数据传给MDR,MDR = 000011 0000000111
  • #4:(MDR)->IR,传给IR = 000011 0000000111
  • #5:OP(IR)->CU,将IR的操作码从到CU,CU分析得知是加法指令
  • #6:Ad(IR)->MAR,将IR中的地址码送到MAR,拿到数据的地址,(MAR) = 7
  • #8:M(MAR)->MDR,在存储体中拿出地址为5的数据传给MDR,MDR=0000000000000001
  • #9:(MDR)->X,将MDR传到乘商寄存器,X=0000000000000001
  • #10:(ACC)+(X)->ACC,将计算结果传到ACC,ACC=7,由ALU实现加法运算

第四条指令

  • #0:第一条指令执行后,PC自动+1,(PC)=3,ACC = 7
  • #1:(PC)->MAR,在MAR中读取第二条指令的地址,(MAR) = 3
  • #3:M(MAR)->MDR,在存储体中取出地址为1的数据传给MDR,MDR = 000011 0000000111
  • #4:(MDR)->IR,传给IR = 000011 0000000111
  • #5:OP(IR)->CU,将IR的操作码从到CU,CU分析得知是存数指令
  • #6:Ad(IR)->MAR,将IR中的地址码送到MAR,拿到数据的地址,(MAR) = 8
  • #7:(ACC)->MDR,将数据存入地址为8的MDR
  • #9:(MDR)->使得 y对应的值为 7

第五条指令

  • #0:第一条指令执行后,PC自动+1,(PC)=4
  • #1:(PC)->MAR,在MAR中读取第二条指令的地址,(MAR) = 4
  • #3:M(MAR)->MDR,在存储体中取出地址为1的数据传给MDR,MDR = 000110 0000000000
  • #4:(MDR)->IR,传给IR = 000110 0000000000
  • #5:OP(IR)->CU,将IR的操作码从到CU,CU分析得知是停机指令

三个级别-五层结构

  • M4:高级语言机器 --- 执行高级语言
  • M3:汇编语言机器 --- 执行汇编语言
  • M2:操作系统机器 --- 向上提供广义命令
  • M1:传统机器 --- 执行机器语言,二进制
  • M0:微程序机器 --- 执行微指令

性能指标

MAR位数:存储单元的个数

MDR位数:存储字长,每个存储单元的大小

总容量 = MAR位数 * MDR位数 (bit)/ 8 = (MAR位数 * MDR位数 / 8)(Byte)

CPU主频:CPU内数字脉冲信号振荡的频率,单位Hz

CPU时钟周期与主频互为倒数

CPI:执行一条指令所需要的时钟周期数

  • 不同的指令CPI不一定相同
  • 不同的CPU,执行相同的指令,CPI也不一定相同

执行一条指令耗时:CPU的时钟周期 * CPI

CPU执行时间(程序执行耗时) = CPU时钟周期数 / 主频 = (指令数 * CPI)/ 主频

IPS:每秒执行多少指令 = 主频 / 评价CPI

FLOPS:每秒执行多少次浮点运算

IPS、FLOPS前常加单位K、M、G、T、P、E、Z,如KIPS、MFLOPS;换位为1000,G就是十亿

数据通路带宽:数据总线一次并行传送信息的位数(各个硬件部件都是通过数据总线传输数据)

吞吐量:系统单位时间内处理请求的数量,取决于主存的存取周期

响应时间:一个请求作出响应所需要的时间:CPU时间+等待时间(磁盘访问、存储器访问、IO、操作系统开销)

主频高一定快吗?

不一定,A的主频2GHz,评价CPI=10,B主频1GHz,平均CPI=1,A每秒只能处理0.2G的指令,B每秒能处理1G条指令

若CPI相同,那主频高一定快吗?

不一定,还要看A支不支持一些指令,如乘法指令,若不支持只能多次加法,而B支持乘法指令,那B就更快

基准程序执行越快性能越好吗?

不一定,基准程序中的语句存在频度差异,运行结果不能完全说明问题

概念解析

翻译程序、汇编程序、编译程序、解释程序

翻译程序:把高级语言翻译成机器语言,分为编译程序、解释程序

汇编程序:把汇编程序翻译成机器语言,汇编语言与机器语言一一对应,只是有助记符号

机器字长、指令字长、存储字长

机器字长:机器能直接处理的二进制位数,一般机器字长等于内存的大小,决定了运算精度

指令字长:一个指令包含的二进制位数

存储字长:一个存储单元存储的二进制的长度 = MDR位数

他们都是字节的整数倍,指令字长一般是存储字长的整数倍,若指令字长是存储字长的2倍,则需要访问两次取出一条指令

数据表示与运算

数制与编码

进位计数法

基数:每个数位所用到的不同数码的个数。如十进制的基数为10

位权:对应位置上需要乘的数值

公式: $$ N = a[k] * r^k + a[k-1] * r^(k-1) + ... + a[2] * r^2 + a[1] * r^1 + a[0] * r^0 $$

  • r是基数,k是对应的位置,a[k]是对应位置的值,r^k是位权

进制转换

二转八:三位截断一算

二转十六:四位截断一算

N转十:用公式

十转N

  • 整数部分:除基取余,上低下高
  • 小数部分:乘基取整

在计算机中,整数可以连续表示,但是小数是离散的,故并不是所有的十进制小数都可以用二进制表示,比如0.3无论多少次乘2取整都无法得到精确的结果。但是二进制小数都可转十进制小数

真值、机器数

真值:是机器数代表的实际值

机器数:计算机中用0,1表示正负号,采用原码、补码、反码表示正负数,这种把符号数字化的数称为机器数

BCD码

BCD码:二进制编码的十进制数(BCD)通常采用4位二进制数表示一位十进制数中0-9这10个数码,使得两者之间的转换能快速进行,但是4位可以表示16个数码,存在6种的冗余状态

  • 8421码(最常用):是一种有权码,权值为8421,若两个8421码相加,小于等于9则无需修正,大于等于10则需要修正,因为有6位无效码,所以需要将结果+6(+0110),即需要向高位进位
  • 余3码:是一种无权码,在8421码上+3(+0011)形成的,因为每个数都多余3,故称余3
  • 2421码:是有权码,权值为2421,特点是--大于等于5的4位二进制数最高位为1,小于5的最高位为0,如5(1011)

ASCII码

ASCII码:是一种字符系统,7位二进制编码,每个字节的最高位保持为0,可用于传输时的积偶校验位,可以表示128个字符

  • 0-31为控制字符,用于通信控制或设备的功能控制
  • 127为DEL码
  • 32为空格
  • 32-126为可印刷字符
  • 0-9的ASCII码为48(011 0000) - 57(011 1001)去掉高三位正好为0-9

校验码

校验码:能够发现或能够自动纠错的数据编码,也叫检错纠错码,原理是通过增加一些冗余码

  • 码距:任意两个合法码字之间最少变化的二进制位数,如1100和1101只有一位变化了,码距为1,1001和0010码距为3

  • 码距不小于2的校验码,具有检错能力,码距越大,检错纠错能力越强,而且检错能力总是大于纠错能力

  • 奇偶校验码:加一位作为校验码,码距为2,可以测出一位错误(或奇数位错误),但不能确定错误的位置,也不能监测出偶数为错误;奇偶校验码是由有效信息位+1个奇偶校验位组成,校验位的取值(0或1)是整个校验码中1的个数为奇数或偶数

    • 奇校验码:整个校验码(有效信息位+校验位)中1的个数为奇数,则校验位为0,否则为1,保证校验码中1的个数为奇数
    • 偶校验码:整个校验码(有效信息位+校验位)中1的个数为偶数,则校验位为0,否则为1,保证校验码中1的个数为偶数
    • 如1001101,设最高位1位校验码,余7位位信息位,1有4个为偶数,故校验位为1,奇校验码为1 1001101,偶校验码为 0 1001101,再如1010111,1有5个为奇数,故校验位为0,奇校验码为0 1010111,偶校验码为1 1010111
    • 具有局限性,只能发现奇数个位出错(有1个3个5个...位置反转了,就和校验位对不上了),还不能纠错,常用语对存储器数据的检查或数据传输的检查
  • 海明校验码:实际是一种多重奇偶校验码,将海明码的每个二进制位分配到几个奇偶校验组中,当某一位出错,就会引起关联的几个检验位发生变化,可以找到错误位置,为纠错提供依据

    • 纠错理论 $$ L-1 = D+C 且 D≥C $$

    • 编码的最小码距L越大,其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于等于检错能力

    • 如n=4,k=3,求1010的海明码

      • 确定位数,n为有效信息的位数,k为校验位的位数,n+k=7<=2^3-1成立,则满足海明码校验要求

      • 有效位D4D3D2D1(1010),校验位P3P2P1,最终的海明码H7H6H5H4H3H2H1

      • 计算校验位插入位置 $$ \ P_k 对应 H_{2^{k-1}} $$

        • P3对应 2^2=4即H4

        • P2对应 2^1=2即H2

        • P1对应 2^0=1即H1

        • 即H7H6H5H4H3H2H1对应D4 D3 D2 P3 D1 P2 P1 $$ H_7,H_6,H_5,H_4,H_3,H_2,H_1 \

          D_4;D_3; D_2; P_3; D_1; P_2; P_1 $$

      • 校验条件:被校验数据的海明位号等于校验各海明位号的和

        • D1在H3上,所以3 = 1 + 2,即由P1和P2校验
        • D2在H5上,所以5 = 1 + 4,即由P1和P3校验
        • D3在H6上,所以6 = 2 + 4,即由P2和P3校验
        • D4在H7上,所以7 = 1 + 2 + 4,即由P1、P2、P3校验
      • 校验位取值:Pi的值为所有需要Pi校验的位求异或

        • P1 = D1 ^ D2 ^ D4 = 011 = 0
        • P2 = D1 ^ D3 ^ D4 = 001 = 1
        • P3 = D2 ^ D3 ^ D4 = 101 = 0
        • 故对应的海明码为1010010
      • 校验原理:k个校验组利用校验位和形成该校验位的信息进行奇偶校验,形成k个校验方程

        • S1 = P1 ^ D1 ^ D2 ^ D4
        • S2 = P2 ^ D1 ^ D3 ^ D4
        • S3 = P3 ^ D2 ^ D3 ^ D4
        • 若S3S2S1 = 000,则无错,否则等于几就是第几位出错,如S3S2S1=001,则H1出错,按位取反即可
  • 循环冗余校验码(CRC):在K位信息码后拼接R位校验位,得到长度为N的校验码,故又称为(N,K)码

    • 基于线性编码理论,发送端,将传送的K位信息左移R位,低位用0补齐,将它与约定的多项式G(x)做模2除法,生成新的R位校验位,在接收端用同样的多项式做模2除法,能整除则无错
    • 任意一个二进制位都可以用系数为0或1的多项式与其对应,生成多项式的最高次幂为R,转换的二进制数有R+1位,直白说,多项式的系数就是对应的二进制数,有就是1,没有就是0,如x^3+x+1对应的就是1011
    • 如约定好的多项式为G(x)=x3+x2+1,信息码为101001
      • R=最高位次幂=3,K=6,N=9,多项式对应的二进制为1101
      • 移位后101001000
      • 模2除法产生余数001
      • CRC码为101001001
      • 接收端进行模2除法,余数为0,则无误
      • 若接收到了101001011,进行模2除法后余数010,则倒数第二位出错,取反即可

模2运算

模2运算是一种二进制运算,CRC校验技术的核心,模2运算不考虑进位或借位,模2运算是编码理论中多项式运算的基础

模2加法:0+0 =0,1+0 =1 ,0+1 =1,1+1=0,可以把0看做偶数,1看做奇数,其实就是执行了异或运算

模2减法:0-0=0,1-1=0,1-0=1,0-1=1,和加法一模一样

模2乘法:和平时的乘法运算是一样的

模2除法:和平时的除法运算是一样的,有三个性质

  • 当最后余数的位数小于除数位数时,除法停止
  • 当被除数的位数小于除数位数(或最高位为0)时,则商数为0,被除数就是余数
  • 只要被除数位数与除数一样多,且最高位为1,则商1

定点数表示与运算

无符号数:整个机器字长的全部二进制位均为数值,没有符号位

有符号数:通常约定二进制的最高位为符号位,有符号数的机器表示有原码、补码、反码、移码,约定用X表示真值,[X]原、[X]补、[X]反、[X]移,分别表示原码、补码、反码、移码

根据小数点的位置是否固定,分为定点表示、浮点表示

定点表示的小数点固定不变,不在使用小数点表示,而是约定它的位置,在计算机中一般两种约定

定点小数:最高位之前 ---- 定点小数

定点整数:最低位之后 ---- 定点整数

定点小数

定点小数是纯小数,约定小数点位置在符号位之后,有效数值位最高位之前

  • 若X=x0x1x2...xn(x0表示符号位,后面的是数值有效位,x1为最高有效位)

  • 当x0为0,后面的都是1,X即所能表示的最大正数,真值等于1-2^(-n)

  • 当x0为1,后面的都是1,X即(原码)所能表示的最小负数,真值等于-(1-2^(-n))

定点整数

定点整数是纯整数,约定小数点在有效数值位最低位之后

  • 若X=x0x1x2...xn(x0表示符号位,后面的是数值有效位,xn为最低有效位)
  • 当x0为0,后面的都是1,X即所能表示的最大正数,真值等于2^n-1
  • 当x0为1,后面的都是1,X即(原码)所能表示的最小负数,真值等于-(2^n-1)

原、补、反、移

原码表示看起来很美好,对人来说识别起来也很简单,并且对比如1+2=3这样的加法也正确,但是对负数就力不从心了。计算机中只有加法器,所有的减法都是把被减数转化为相反数再相加的。考虑5-3=2,5的原码是00000101,-3的原码是10000011,两个相加就是10001000,这是原码表示的-8,所以用原码进行直接加减是不行的

由钟表表盘得到的启发 看看墙上的挂钟,表盘有从1到12的12个数字,指针从任意时刻转了一圈后又回到原来的位置。如果想把时针从1点拨到5点,那就有两种拨法:顺时针拨动4格,或者逆时针拨动8格。也就是说,顺时针拨动4格的效果和逆时针拨动8格的效果是相同的,若规定顺时针为正,逆时针为负,那就可以这样操作:1时-8时=1时+4时,即1-8=1+4,也就是说,-8可以用+4表示,或者说是等价的。回到上面我们算的5-3=2,用这个时钟系统能算对吗?-3时能用几时表示呢,对,是9时,则5-3就可以用5+9来计算,5+9=14,越过12时后停在2时,这不就是5-3=2的结果嘛!至此,我们就在钟表上用加法实现了减法,就像-3可以用+9来表示一样

计算机就是个二进制的模运算系统,之所以如此,是因为数据可以无限大,但计算机的表示能力是受硬件限制的,比如8位机,只能用8个二进制位表示一个整数,8位能组合出来的0-1状态只有 00000000~11111111这256个状态,255再加1也会回0。

给一个数,怎样算出它的补码?很简单,就一句话,加上N个模让它变成模以内的一个正数就可以了。比如-1的补码就是-1+256(8位机的模就是2^8)=255,255就是11111111;-100的补码就是-100+256=156,156的二进制序列10011100就是-100的补码。

为什么是取反加1,而不是加2加3?

一个二进制序列各位取反后和自身相加是多少?不就是各个位全1嘛,再加1会发生什么,各位全变0,最高位进1舍去,其实就一个数和自己的相反数相加变0

-1000的补码是多少(8位的情况)? 按照我们上面加N个模的算法,-1000+4*256=24,也就是00011000。是不是有点不对劲啊,我们明明是个负数,怎么符号位是0啊?

这其实是-1000超出了8位机负数的取值范围而发生了溢出错误。

我们知道,8个二进制位能表示的组合只有0000000011111111这256种,如果不考虑负数,那就是0255,如果想表示负数,那就得把其中一半的位置让出来。从-1来看,根据补码计算方法,-1+256=255,也就是255这个二进制序列11111111来表示-1,同样,254就表示-2,253就表示-3……128就表示-128,二进制序列是10000000,再减1就变成了127,01111111,然后126,125……一直到0,这样循环一周-1……-128,127……0,所以8位二进制能表示的有符号数范围就是-128~127,之所以把10000000定为-128而不是+128,我的理解是符号位能统一起来。总结一下吧,补码本质就是一种用正数表示负数的模运算编码系统,它可以统一加减法,符号位也可以参与运算,并且让硬件电路简化,所以才被计算机的整数采用

原码:机器数的最高位表示符号位,剩下的表示数值位,0有+0和-0两种形式

  • 纯小数

$$ [x]_原 = \begin{cases}
x& 1>x≥0 \ 1-x = 1 + |x| & 0≥x>-1 \ \end{cases} ([x]_原是原码机器数,x表示真值) $$

​ 若x1 = +0.1101,x2=-0.1101,字节长8位,则原码为[x1]原 = 0.1101000,[x2]原 = 1.1101000

  • 纯整数

$$ [x]_原 = \begin{cases}
0,x& 2^n>x≥0 \ 2^n-x = 2^n + |x| & 0≥x>-2^n \ \end{cases} ([x]_原是原码机器数,x表示真值,n是整数位数,逗号是分割) $$

​ 若x1=+1110,x2=-1110,字节为8,则则原码为[x1]原 = 0,0001110,[x2]原 = 1,0001110

反码:负数的数值位按位取反,计算机用不到,只是作为中间状态,0有+0和-0两种形式

补码:负数的补码为反码 + 1,0的补码只有一种,范围比原码多一个(整数多一个-2^n,小数多一个-1)

  • 原码和补码的简便转化,符号位之后,最后一个1之前,中间的按位取反

  • 由[x]补求[-x]补,所有位取反,末尾+1

  • 如[x]补=1 001 0011的原码为1 110 1101

  • 整数如[x]补 = 1 000 0000表示-128,原码不能表示

  • 小数如[x]补 = 1.000 0000表示-1,原码不能表示

移码:补码的符号位取反,移码只能表示整数,范围和整数的补码相同(-2^n ~ 2^n-1)

  • 原码和移码的简便转化,最后一个1之前的位全部取反
  • 如[x]移 = 1 001 0011的原码为0 110 1101
  • 移码全0对应最小值-2n,移码全1,对应2n-1
  • 移码保持了数据原有的大小顺序

定点数的运算

算数移位

  • 正数,空位补0
  • 负数
    • 原码,空位补0
    • 补码,左移补0,右移添1
    • 反码,空位补1
  • 原码,左移一位若不溢出,相当于乘2

逻辑移位

相当于正数的算数移位

循环移位

移出的数据又移入到数据中,适合用于数据低字节与高字节互换

原码加减法

加法:

  • 符号相同,符号不变,绝对值相加
  • 符号不同,做减法,绝对值大的减绝对值小的,符号位与绝对值大的相同

减法:减数符号取反,然后按加法运算

补码加减法

  • 按二进制运算规则运算(逢二进一)
  • 符号位与数值位按相同规则一起参与运算

溢出判断

  • 一位符号位:运算结果的符号位与实际结果符号不同,则有溢出
  • 双符号位:两符号位相同,则未溢出,高符号位为真正符号位
  • 一位符号位与进位:符号位进位与最高数值位进位相同,则未溢出

乘法计算

乘法由累加和右移实现

  • 原码一位乘法:符号和数值分开求
    • 符号位:两个乘数的符号位求异或
    • 数值位:两个乘数的数值位相乘,计算方式和十进制相同,乘数从最低位依次与被乘数相乘,结果相加

在机器中,

  • ACC累加器中存放部分积的高位,初始为0,
  • MQ中存放乘数和部分积右移后的低位,
  • X通用寄存器中存放被乘数
-- 设机器字长5位,含1位符号位,x=-0.1101,y=0.1011,采用原码一位乘法求xy

(高位 部分积 存储在ACC)			(低位部分积/乘数 存储在MQ乘商寄存器)
	00.0000							1011	初始时ACC全0,MQ存储乘数
  +	00.1101									从乘数最低位开始,即MQ的第四位,遇1将ACC+被乘数后右移一位
  ----------
  	00.1101	
  >	00.0110							1101|1	右移后MQ溢出的就舍去
  +	00.1101									依然取MQ的最低位,遇1将ACC+被乘数后右移一位
  ----------
  	01.0011							1101|1	加法需要考虑进位
  >	00.1001							1110|11
  + 00.0000									依然取MQ的最低位,遇0将直接右移一位
  > 00.0100							1111|011
  +	00.1101
  ----------
  	01.0001
  >	00.1000							1111|1011
  
  故数值位的结果为00.1000 1111
  符号位为负,异或得1,即最后乘积为-0.1000 1111
  • 补码一位乘法
    • Booth算法:
      • 符号位参与运算,结果为补码
      • 被乘数x取双符号位参与运算,部分积取双符号位,初始为0,乘数y可取单符号位
      • 乘数末位增设附加位y,初始值为0
      • 根据
上次编辑于:
贡献者: ext.liyuanhao3