第二章 运算方法和运算部件

1、

  • 基本运算部件:加法器、ALU、移位器(ALU的核心部件是加法器)
  • 基本逻辑运算和定点数加减运算: 由算术逻辑部件ALU实现;
  • 乘除运算和浮点数运算:加法器/ALU和移位器
2、

当控制端Sub为1时,做减法;当控制端Sub为0时,做加法
存放标志的寄存器通常称为程序/状态字寄存器或标志寄存器。每个标志对应标志寄存器中的一个标志位。  
  • 零标志ZF=1表示F结果为0(无符号和带符号整数)
  • 溢出标志OF=1表示带符号整数运算时结果发生了溢出(对无符号运算无意义)
  • 符号标志SF表示结果的符号,即F的最高位。(对无符号数运算无意义)
  • 进/借位标志CF表示无符号数加/减运算时的进位/借位。加法时,CF等于进位输出Cout,减法时,就应将进位输出 Cout取反来作为标志位。综合起来,CF=Sub+Cout.
3、对于n位补码整数,它可表示的数值范围是-2的n-1次方到2的n-1次方-1.当运算结果超出该范围,则结果溢出。
4、补码的加减运算
  • [A+B]补 = [A]补 + [B] 补  ( MOD 2n )
    [A–B]补 = [A]补 + [–B] 补  ( MOD 2n )
  • 加、减法运算统一采用加法来处理
  • 符号位(最高有效位MSB)和数值位一起参与运算
  • 直接用Adder实现两个数的加运算(模运算系统),Adder中执行的运算相当于无符号数加。
5、溢出现象:(1) 最高位和次高位的进位不同

                      (2) 和的符号位和加数的符号位不同


二、浮点数的运算
  • 对阶
  • 尾数加减
  • 尾数规格化
  • 尾数的舍入处理
  • 溢出判断

三、运算器


运算器由 算术逻辑单元ALU)、 累加器状态寄存器通用寄存器组等组成
算术逻辑运算单元(ALU)的基本功能为加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、求补等操作
计算机运行时,运算器的操作和操作 种类由控制器决定。运算器处理的数据来自 存储器;处理后的结果数据通常送回存储器,或暂时寄存在运算器中。与Control Unit共同组成了 CPU的核心部分。

四、移位
逻辑移位:整组数据移位,只有数字位置的变化,无数量的变化(不考虑正负号)
循环移位:数据本身形成闭合环路
算术移位:带符号的数移位,符号不变、数量变化(考虑正负号

1)算术移位 当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算数左移n位相当于乘上2n,执行方法是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补0。

2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。

(一)逻辑移位
  • 如果是无符号数,不管是左移还是右移都是“逻辑移位”
    移位对象:一组无数值意义的二进制代码
    仅仅数码位置变化,数值大小无变化
  • 不管左移右移,移出来的空位补0即可。
(二)算术移位规则
  • 如果是有符号数,则做左移运算,即做的是“逻辑移位”,同①中无符号数的左移。而做右移运算,那么做的是“算术移位”。
  • 前提:移位后,符号为保持不变
    (1)原码移位规则
    不论正数还是负数,原码移位规则相同
    左移:符号位不变—依次左移,末位补0;
    右移:符号位不变—依次右移,最高有效位补0
    注意:若左移前最高有效位已经为1,将溢出!

例:原码移位,X原 = 1 01010101
     左      移:     X左 = 1 10101010
     右      移:   X右 = 1 00101010
(2)补码右移规则
符号位保持不变,左边 补1
    例:X补=11010010
  右移:X补=11101001
    补码左移规则
规则:各位依次左移,最高有效位左移至符号位,末位补0
例:  X补= 11010010
左移:X补= 10100100
注:若符号位和最高位不相等时发生溢出。
例: 若[x] =x 0 x 1 x 2 …x n ,其中x 0 是符号位,x 1 是最高数位,若( )时,则当补码左移会发生溢出。
A.x 0 =x 1
B.x 0 ≠x 1
C.x 1 =O
D.x 1 =1


五、问题: 如何将8位二进制补码扩展成16位二进制补码
       答案:如果8位二进制补码的最高位(符号位)为0,那么扩展后的16位补码直接在最高位前面添加8个0即可;
如果8位二进制补码的最高位(符号位)为1,那么扩展后的16位补码直接在最高位前面添加8个1即可;

举例如下:
-13
8位原码:1000 1101
8位补码:1111 0011 
16位原码:1000 0000 0000 1101
16位补码:1111 1111 1111 0011
根据前面的知识,由于-13的最高位为1,所以直接在最高位前面添加8个1即可变为16位补码,即1111 1111 1111 0011(与前面由原码求补码的结果一致)。

13
8位原码:0000 1101
8位补码:0000 1101
16位原码:0000 0000 0000 1101
16位补码:0000 0000 0000 1101
根据前面的知识,由于13的最高位为0,所以直接在最高位前面添加8个0即可变为16位补码,即0000 0000 0000 1101(与前面由原码求补码的结果一致)。

题目二:8位补码定点整数10010101扩展8位后的值用十六进制表示为:FF95H


定点小数和定点整数,除了表达的数值外,在运算上会有什么区别呢?

先是位扩展。当8位扩至16位时,如果是定点整数,则在该数前补8个符号位。而如果是定点小数,则在该数后补8个0。再是16位到8位,定点整数则是丢弃高8BIT,定点小数则是丢弃低8BIT。因此,定点整数将会发生严重的溢出,而定点小数只会丢失部分精度。

在计算加减的时候,定点小数与定点整数没有太大的区别。在乘法上,就有一些区别了。比如说00000001 x 00000001。在定点整数的时候,由于1x1=1,因此结果为00000000 00000001。但是在定点小数时,由于00000001不再表示1,而是2^-7,因此,相乘的结果为 00000000 00000010,即2^-14。

也可以这么理解。由于定点小数的权重是由左向右的,由于两个带符号位的定点小数相乘,使得前面多出了一个符号位,因此需要左移一位来移出这个符号位。这样,从编码的字面值来看,定点小数相乘的结果是定点整数相乘结果的两倍。

那么定点小数究竟有什么好处呢?Hanny是这么理解的。在做乘法或乘加运算时,定点整数需要不断地移位来防止溢出,而定点小数则可直接实现。因为是小于1,所以定点小数在乘法运算过程永远不会溢出。

猜你喜欢

转载自blog.csdn.net/gabby____/article/details/80805754