第三章 指令系统
概述: 指令、指令系统是计算机中一个最基本的概念。指令是指示计算机执行某些操作的命令,一台计算机的所有指令的集合构成该机的指令系统。指令系统是计算机的主要属性,位于硬件和软件的交界面上。本章将讨论一般计算机的指令系统所涉及的基本问题。
本章要求:
(1)指令格式
一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。
一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。
基本格式:一条指令就是机器语言表示的一个操作(x语句x),它是一组有意义的二进制代码
操作码:指明操作的性质及功能。地址码:指明操作数的地址。
指令的长度是指一条指令中所包含的二进制代码的位数,它取决于操作码字段的长度、操作数地址的个数及长度。
指令长度可以等于机器字长,也可以大于或小于机器字长。
在一个指令系统中,若所有指令的长度都是相等的,称为定长指令字结构;若各种指令的长度随指令功能而异,称为变长指令字结构。
1、地址码结构:
一条双操作数指令的除操作码之外,还应包含以下信息:
第一操作数地址,用A1表示;
第二操作数地址,用A2表示;
操作结果存放地址,用A3表示;
下条将要执行指令的地址,用A4表示。
这些信息可以在指令中明显的给出,称为显地址;也可以依照某种事先的约定,用隐含的方式给出,称为隐地址。
(A1)OP(A2)→A3
A4=下条将要执行指令的地址
其中:Ai表示地址,(Ai)表示存放于该地址中的内容。
(A1)OP(A2)→A3
(PC)+1→PC(隐含)
执行一条三地址的双操作数运算指令,至少需要访问4次主存。第一次取指令本身,第二次取被操作数,第三次取操作数,第四次保存运算结果。
(A1)OP(A2)→A1
(PC)+1→PC(隐含)
其中:A1为目的操作数地址,A2为源操作数地址。
二地址指令执行之后,目的操作数地址中原存的内容已被破坏了。
执行一条二地址的双操作数运算指令,同样至少需要访问4次主存。
(Acc)OP(A1)→Acc
(PC)+1→PC(隐含)
执行一条一地址的双操作数运算指令,只需要访问两次主存。第一次取指令本身,第二次取操作数。被操作数和运算结果都放在累加寄存器中,所以读取和存入都不需要访问主存。
零地址的算逻类指令是用在堆栈计算机中的,堆栈计算机没有一般计算机中必备的通用寄存器,因此堆栈就成为提供操作数和保存运算结果的唯一场所。通常,参加算逻运算的两个操作数隐含地从堆栈顶部弹出,送到运算器中进行运算,运算的结果再隐含地压入堆栈。有关堆栈的概念将在稍后讨论。
对于同一个问题,用三地址指令编写的程序最短,但指令长度最长,而用二、一、零地址指令来编写程序,程序的长度一个比一个长,但指令的长度一个比一个短。
2、指令的操作码
指令系统中的每一条指令都有一个唯一确定的操作码,指令不同,其操作码的编码也不同。通常,希望用尽可能短的操作码字段来表达全部的指令。指令操作码的编码可以分为规整型和非规整型两类。
1.规整型
操作码字段的位数和位置是固定的。
假定:指令系统共有m条指令,指令中操作码字段的位数为N位,则有如下关系式:
N≥log2 m
规整型编码对于简化硬件设计,减少指令译码的时间是非常有利的。
IBM 370机(字长32位)的指令可分为三种不同的长度,不论指令的长度为多少位,其中操作码字段一律都是8位。
2.非规整型
操作码字段的位数不固定,且分散地放在指令字的不同位置上。
PDP-11机(字长16位)的指令分为单字长、两字长、三字长三种,操作码字段占4~16位不等,可遍及整个指令长度。
显然,操作码字段的位数和位置不固定将增加指令译码和分析的难度,使控制器的设计复杂化。
最常用的非规整型编码方式是扩展操作码法。
让操作数地址个数多的指令(如三地址指令)的操作码字段短些,操作数地址个数少的指令(如一或零地址指令)的操作码字段长些。
(2)寻址技术
所谓寻址,指的是寻找操作数的地址或下一条将要执行的指令地址。寻址技术包括编址方式和寻址方式。
1、编址方式
要对寄存器、主存储器和输入输出设备等进行访问,首先必须对它们进行编址。就像一个大楼有许多房间,首先必须给每一个房间编上一个唯一的号码,人们才能据此找到需要的房间一样。
1编址单位:
1.字编址
编址单位=访问单位
每个编址单位所包含的信息量(二进制位数)与读或写一次寄存器、主存所获得的信息量是相同的。早期的大多数机器都采用这种编址方式。
2.字节编址
字节编址为了适应非数值计算的需要。字节编址方式使编址单位与信息的基本单位(一个字节)相一致,这是它的最大优点。然而,如果主存的访问单位也是一个字节的话,那么主存的频带就太窄了。
编址单位<访问单位
通常主存的访问单位是编址单位的若干倍。
3. 位编址
有部分计算机系统采用位编址方式。
2指令中地址码的位数
指令格式中每个地址码的位数是与主存容量和最小寻址单位(即编址单位)有关联的。主存容量越大,所需的地址码位数就越长。对于相同容量来说,如果以字节为最小寻址单位,地址码的位数就需要长些;如果以字为最小寻址单位(假定字长为16位或更长),地址码的位数可以减少。
例如:设某机主存容量为220 个字节,机器字长32位。若最小寻址单位为字节(按字节编址),其地址码应为20位;若最小寻址单位为字(按字编址),其地址码只需18位。
2、指令寻址和数据寻址
寻址可以分为指令寻址和数据寻址。寻找下一条将要执行的指令地址称为指令寻址,寻找操作数的地址称为数据寻址。指令寻址比较简单,它又可以细分为顺序寻址和跳跃寻址。而数据寻址方式种类较多,其最终目的都是寻找所需要的操作数。
顺序寻址可通过程序计数器PC加1,自动形成下一条指令的地址;跳跃寻址则需要通过程序转移类指令实现。
跳跃寻址的转移地址形成方式有3种:直接(绝对)、相对和间接寻址,它与下面介绍的数据寻址方式中的直接、相对和间接寻址是相同的,只不过寻找到的不是操作数的有效地址而是转移的有效地址而已。
3、基本的数据寻址方式
数据寻址方式是根据指令中给出的地址码字段寻找真实操作数地址的方式。
指令中的形式地址A───→有效地址EA
每种计算机的指令系统都有自己的一套数据寻址方式,不同计算机的寻址方式的名称和含义并不统一,下面介绍大多数计算机常用的几种基本寻址方式。
1.立即寻址
指令中给出的不是通常意义上的操作数地址,而是操作数本身,也就是说数据就包含在指令中,只要取出指令,也就取出了可以立即使用的操作数。
EA=PC
在取指令时,操作码和操作数被同时取出,不必再次访问主存,从而提高了指令的执行速度。但是,因为操作数是指令的一部分,不能被修改,而且立即数的大小受到指令长度的限制,所以这种寻址方式灵活性最差,通常用于给某一寄存器或主存单元赋初值或提供一个常数。
2.寄存器寻址
寄存器寻址指令的地址码部分给出某一个通用寄存器的编号,这个指定的寄存器中存放着操作数。操作数S与寄存器Ri的关系为:
EA=R S=(Ri)
寄存器寻址具有两个明显的优点:
①从寄存器中存取数据比从主存中快得多;
②由于寄存器的数量较少,其地址码字段比主存单元地址字段短得多。
3.直接寻址
指令中地址码字段给出的地址A就是操作数的有效地址。由于这样给出的操作数地址是不能修改的,与程序本身所在的位置无关,所以又叫做绝对寻址方式。
EA=A S=(A)
这种寻址方式不需作任何寻址运算,简单直观,也便于硬件实现,但地址空间受到指令中地址码字段位数的限制。
4.间接寻址
间接寻址意味着指令中给出的地址A不是操作数的地址;而是存放操作数地址的主存单元的地址,简称操作数地址的地址。通常在指令格式中划出一位作为直接或间接寻址的标志位,间接寻址时标志位@=1。
在一级间接寻址中,
EA=(A)
S=((A))
间接寻址要比直接寻址灵活得多,它的主要优点为:
①扩大了寻址范围,可用指令的短地址访问大的主存空间。
②可将主存单元作为程序的地址指针,用以指示操作数在主存中的位置。当操作数的地址需要改变时,不必修改指令,只需修改存放有效地址的那个主存单元(间接地址单元)的内容就可以了。
5.寄存器间接寻址
指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在主存单元中。
EA = (Ri) S=((Ri))
6.变址寻址
把变址寄存器Rx的内容与指令中给出的形式地址A相加,形成操作数有效地址。Rx的内容称为变址值。
EA=(Rx)+A S=((Rx)+A)
7.基址寻址
基址寄存器Rb的内容与指令中给出的位移量D相加,形成操作数有效地址。基址寄存器的内容称为基址值。指令的地址码字段是一个位移量,位移量可正、可负。
EA=(Rb)+D S=((Rb)+D)
8.相对寻址
相对寻址是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为位移量D,两者相加后得到操作数的有效地址。位移量指出的是操作数和现行指令之间的相对位置。
EA=(PC)+D
特点:
①操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值±D。当指令地址改变时,由于其位移量不变,使得操作数与指令在可用的存储区内一起移动,所以仍能保证程序的正确执行。采用PC相对寻址方式编写的程序可在主存中任意浮动,它放在主存的任何地方,所执行的效果都是一样的。
②由于指令中给出的位移量可正、可负,所以对于指令地址而言,操作数地址可能在指令地址之前或之后。
9.页面寻址
页面寻址相当于将整个主存空间分成若干个大小相同的区,每个区称为一页,每页有若干个主存单元。每页都有自己的编号,称为页面地址;页面内的每个主存单元也有自己的编号,称为页内地址。这样,操作数的有效地址就被分为两部分:前部为页面地址,后部为页内地址。
页内地址由指令的地址码部分自动直接提供,它与页面地址通过简单的拼装连接就可得到有效地址,无须进行计算,因此寻址迅速。根据页面地址的来源不同,页面寻址又可以分成三种不同的方式:
基页寻址,EA=0∥A,操作数S在零页面中。基页寻址实际上就是直接寻址。
当前页寻址,EA=(PC)H∥A,操作数S与指令本身处于同一页面中。
页寄存器寻址。页面地址取自页寄存器,与形式地址相拼接形成有效地址。
10.段寻址
11.区分不同的寻址方式
为了能区分出各种不同寻址方式,必须在指令中给出标识。标识的方式通常有两种:显式和隐式。
显式的方法就是在指令中设置专门的寻址方式字段,用二进制代码来表明寻址方式类型。
隐式的方式是由指令的操作码字段说明指令格式并隐含约定寻址方式。
注意,一条指令若有两个或两个以上的地址码时,各地址码可采用不同的寻址方式。例如,源地址采用一种寻址方式,而目的地址采用另一种寻址方式。
4、变型或组合寻址方式
1.自增型寄存器间址和自减型寄存器间址
(1)自增寻址
寄存器Ri的内容是有效地址,按照这个有效地址从主存中取数以后,寄存器的内容自动增量修改。在字节编址的计算机中,若指向下一个字节,寄存器的内容+1;若指向下一个字(设字长16位),寄存器的内容+2。
自增寻址操作的含义为:
EA=(Ri)
Ri←(Ri)+d
其中:EA为有效地址,d为修改量,通常记作(Ri)+,加号在括号之后,形象地表示先操作后修改。
⑵自减寻址
自减寻址是先对寄存器Ri的内容自动减量修改(-1或-2),修改之后的内容才是操作数的有效地址,据此可到主存中取出操作数。
自减寻址操作的含义为:
Ri←(Ri)-d
EA=(Ri)
通常记作-(Ri),减号在括号之前,形象地表示先修改后操作。
2.扩展变址方式
把变址和间址两种寻址方式结合起来,就成为扩展变址方式,按寻址方式操作的先后顺序,有前变址和后变址两种形式。
⑴先变址后间址(前变址方式)
先进行变址运算,其运算结果作为间接地址,间接地址指出的单元的内容才是有效地址。
EA=(A+(Rx)) S=((A+(Rx)))
⑵先间址后变址(后变址方式)
将指令中的地址码先进行一次间接寻址,然后再与变址值进行运算,从而得到一个有效地址。
EA=(A)+(Rx) S=((A)+(Rx))
3.基址变址寻址
基址变址寻址是最灵活的一种寻址方式,此时有效地址是由基址寄存器中的值、变址寄存器中的值和位移量三者相加求得的。在这三项中,除位移量在指令一旦确定后就不能再修改以外,基址和变址寄存器中的内容都可以改变。
EA=(Rb)+(Rx)+D
其中:Rb为基址寄存器,Rx为变址寄存器,D为位移量。
(3)堆栈与堆栈操作
堆栈是一种按特定顺序进行存取的存储区,这种特定顺序可归结为“后进先出”(LIFO)或“先进后出”(FILO)。
1.寄存器堆栈
用一组专门的寄存器构成寄存器堆栈,又称为硬堆栈。这种堆栈的栈顶是固定的,寄存器组中各寄存器是相互连接的,它们之间具有对应位自动推移的功能,即可将一个寄存器的内容推移到相邻的另一个寄存器中去。
2.存储器堆栈
从主存中划出一段区域来作堆栈,这种堆栈又称为软堆栈,堆栈的大小可变,栈底固定,栈顶浮动,故需要一个专门的硬件寄存器作为堆栈栈顶指针SP,简称栈指针。栈指针所指定的主存单元,就是堆栈的栈顶。
自底向上生成堆栈的进栈
堆栈的栈底地址大于栈顶地址,通常栈指针始终指向栈顶的满单元。进栈时,SP的内容需要先自动减1,然后再将数据压入堆栈。
(SP)-1→SP 修改栈指针 (A)→(SP) 将A中的数据压入堆栈
自底向上生成堆栈的出栈
出栈时,需要先将堆栈中的数据弹出,然后SP的内容再自动加1。
((SP))→A 将栈顶内容弹出,送入A中 (SP)+1→SP 修改栈指针
(4)指令类型
一台计算机的指令系统可以有上百条指令,这些指令按其功能可以分成几种类型。
1、数据传送类指令
1.一般传送指令
一般传送指令具有数据复制的性质,即数据从源地址传送到目的地址,而源地址中的内容保持不变。一般传送类指令常用助记符MOV表示,根据数据传送的源和目的的不同,又可分为:
⑴ 主存单元之间的传送。
⑵ 从主存单元传送到寄存器。在有些计算机中,该指令用助记符LOAD表示。
⑶ 从寄存器传送到主存单元。在有些计算机里,该指令用助记符STORE表示。
⑷ 寄存器之间的传送。
2.堆栈操作指令
堆栈指令实际上是一种特殊的数据传送指令,分为进栈(PUSH)和出栈(POP)两种,在程序中它们往往是成对出现的。
如果堆栈是主存的一个特定区域,那么对堆栈的操作也就是对存储器的操作。
3.数据交换指令
前述的传送都是单方向的。然而,数据传送也可以是双方向的,即将源操作数与目的操作数(一个字节或一个字)相互交换位置。
2、运算类指令
1.算术运算类指令
算术运算指令主要用于定点和浮点运算。这类运算包括定点加、减、乘、除指令,浮点加、减、乘、除指令以及加1、减1、比较等,有些机器还有十进制算术运算指令。
绝大多数算术运算指令都会影响到状态标志位,通常的标志位有进位、溢出、全零、正负和奇偶等。
2.逻辑运算类指令
计算机都具有与、或、非、异或等逻辑运算指令。这类指令在没有设置专门的位操作指令的计算机中常用于对数据字(字节)中某些位(一位或多位)进行操作,常见的应用有:
⑴按位测(位检查)
利用“与”指令可以屏蔽掉数据字(字节)中的某些位。通常让被检查数作为目的操作数,屏蔽字作为源操作数,要检测某些位,可使屏蔽字的相应位为“1”,其余位为“0”,然后执行“与”指令,则可取出所要检查的位来。
⑵按位清(位清除)
利用“与”指令还可以使目的操作数的某些位置“0”。只要源操作数的相应位为“0”,其余位为“1”,然后执行“与”指令即可。
⑶按位置(位设置)
利用“或”指令可以使目的操作数的某些位置“1”。只要源操作数的相应位为“1”,其余位为“0”,然后执行“或”指令即可。
⑷按位修改
利用“异或”指令可以修改目的操作数的某些位,只要源操作数的相应位为“1”,其余位为“0”,异或之后就达到了修改这些位的目的(因为A⊕1= ,A⊕0=A)。
⑸判符合
若两数相符合,其异或之后的结果必定为“0”。
3.移位类指令
移位指令分为算术移位、逻辑移位和循环移位三类,它们又可分为左移和右移两种。
⑴算术移位
算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不变。当左移一位时,如不产生溢出,则数值×2;而右移一位时,如不考虑因移出舍去的末位尾数,则数值÷2。
⑵逻辑移位
逻辑移位的对象是无符号数,因此移位时不必考虑符号问题。
⑶循环移位
循环移位按是否与进位位一起循环又分为两种:
小循环(不带进位循环)
大循环(带进位循环)
3、程序控制类指令
1.转移指令
在程序执行过程中,通常采用转移指令来改变程序的执行顺序。转移指令又分无条件转移和条件转移两种:
⑴ 无条件转移又称必转,它在执行时将改变程序的常规执行顺序,不受任何条件的约束,直接把程序转向该指令指出的新的位置执行,其助记符一般为JMP。
⑵ 条件转移必须受到条件的约束,若条件满足时才执行转移,否则程序仍顺序执行。条件转移指令主要用于程序的分支,当程序执行到某处时,要在两个分支中选择一支,这就需要根据某些测试条件作出判断。
无论是条件转移还是无条件转移都需要给出转移地址。若采用相对寻址方式,转移地址为当前指令地址(即PC的值)和指令中给出的位移量之和,即(PC)+位移量→PC;若采用绝对寻址方式,转移地址由指令的地址码字段直接给出,即A→PC。
2.子程序调用指令
子程序是一组可以公用的指令序列,只要知道子程序的入口地址就能调用它。通常把一些需要重复使用并能独立完成某种特定功能的程序单独编成子程序,在需要时由主程序调用它们,这样做既简化了程序设计,又节省了存储空间。
主程序和子程序是相对的概念,调用其他程序的程序是主程序;被其他程序调用的程序是子程序。
子程序调用指令,简称转子指令,其助记符一般为CALL。转子指令安排在主程序中需要调用子程序的地方,转子指令是一地址指令。
转子指令和转移指令都可以改变程序的执行顺序,但事实上两者存在着很大的差别:
⑴ 转移指令使程序转移到新的地址后继续执行指令,不存在返回的问题,所以没有返回地址;而转子指令要考虑返回问题,所以必须以某种方式保存返回地址,以便返回时能找到原来的位置。
⑵ 转移指令用于实现同一程序内的转移;而转子指令转去执行一段子程序,实现的是不同程序之间的转移。返回地址是转子指令的下一条指令的地址,保存返回地址的方法有多种:
⑴用子程序的第一个字单元存放返回地址。返回时将第一个字单元地址作为间接地址,采用间址方式返回主程序。这种方法可以实现多重转子,但不能实现递归循环。
⑵用寄存器存放返回地址。转子指令先把返回地址放到某一个寄存器中,再由子程序将寄存器中的内容转移到另一个安全的地方,可以实现子程序的递归循环。
⑶用堆栈保存返回地址。不管是多重转子还是子程序递归,最后存放的返回地址总是最先被使用的,堆栈的后进先出存取原则正好支持实现多重转子和递归循环。
3.返回指令
从子程序转向主程序的指令称为返回指令,其助记符一般为RET,子程序的最后一条指令一定是返回指令。返回地址存放的位置决定了返回指令的格式,通常返回地址保存在堆栈中,所以返回指令常是零地址指令。
转子和返回指令也可以是带条件的,条件转子和条件返回与前述条件转移的条件是相同的。
4、输入输出类指令
1.独立编址的I/O
独立编址方式使用专门的输入/输出指令(IN/OUT)。以主机为基准,信息由外设传送给主机称为输入,反之称为输出。指令中应给出外部设备编号(端口地址)。这些端口地址与主存地址无关,是另一个独立的地址空间。80x86采用的就是独立编址方式。
2.统一编址的I/O
所谓统一编址就是把外设寄存器和主存单元统一编址。在这种方式下,不需要专门的I/O指令,就用一般的数据传送类指令来实现I/O操作。一个外部设备通常至少有两个寄存器:数据寄存器和命令与状态寄存器。每个外设寄存器都可以由分配给它们的唯一的主存地址来识别,主机可以像访问主存一样去访问外部设备的寄存器。
两种编址方式比较
5、80x86指令系统举例
(5) 指令系统的发展
不同类型的计算机有各具特色的指令系统,计算机的性能、机器结构和使用环境不同,指令系统的差异也是很大的。
对指令系统性能的要求
1、x86架构的扩展指令集
目前主流微机使用的指令系统都基于x86架构,为了提升处理器各方面的性能,Intel和AMD公司又各自开发了一些新的扩展指令集。扩展指令集中包含了处理器对多媒体、3D处理等方面的支持,能够提高处理器对这些方面处理的能力。
2、从复杂指令系统到精简指令系统
从指令系统的(1)完备性和(2)有效性的角度来看,当然希望指令系统更丰富、功能更强。特别是系列机问世之后,为了能做到软件(3)兼容性,新设计的机型或高档机除了要继承老机器的指令系统中的全部指令外,还要增加若干新的指令,从而导致同一系列计算机的指令系统越来越复杂,机器结构也越来越复杂。这体现了计算机性能越强,其指令系统应越复杂的传统设计思想。称这些计算机为复杂指令系统计算机,简称CISC(Complex Instruction Set Computer)。
(4)规整性
通过对传统的CISC指令系统进行测试表明,各种指令的使用频度相差很悬殊。最常使用的是一些比较简单的指令,这类指令的数量仅占指令总数的20%,但在各种程序中出现的频度却占80%;其余大多数指令是功能复杂的指令,这类指令的数量占指令总数的80%,但其使用频度很低,仅占20%。因此,人们把这种情况称为“20%-80%律”。1975年IBM公司的John Cocke提出了精简指令系统的想法,各种精简指令系统计算机RISC(Reduced Instruction Set Computer)随之诞生。
3、VLIW和EPIC
1.VLIW和EPIC概念
VLIW中文含义是“超长指令字”,即一种非常长的指令组合,它把许多条指令连在一起,增加了运算的速度。在这种指令系统中,编译器把许多简单、独立的指令组合到一条指令字中。当这些指令字从主存中取出放到处理器中时,它们被容易地分解成几条简单的指令,这些简单的指令被分派到一些独立的执行单元去执行。
EPIC中文含义是“显式并行指令代码”。 EPIC是从VLIW中衍生出来的,通过将多条指令放入一个指令字,有效的提高了CPU各个计算功能部件的利用效率,提高了程序的性能。
2.Intel的IA-64
IA-64彻底突破IA-32的架构,最大限度地开发了指令级并行操作。
Intel公司反对将IA-64划归到RISC或CISC的类别中,因为他们认为这是EPIC架构,是一种基于超长指令字的设计,它合并了RISC和VLIW技术方面的优势。最早采用这种技术的处理器是Itanium。
第四章 数值机器运算
运算器是计算机进行算术运算和逻辑运算的主要部件,运算器的逻辑结构取决于机器的指令系统、数据表示方法和运算方法等。本章主要讨论数值数据在计算机中实现算术运算和逻辑运算的方法,以及运算部件的基本结构和工作原理。
要求:
1 基本算术运算的实现
计算机中最基本的算术运算是加法运算,不论加、减、乘、除运算最终都可以归结为加法运算。所以在此讨论最基本的运算部件——加法器,以及并行加法器的进位问题。
1.全加器
1、全加器
全加器(FA)是最基本的加法单元,它有三个输入量:操作数Ai和Bi、低位传来的进位Ci-1,两个输出量:本位和Si、向高位的进位Ci。
全加器的逻辑表达式
根据真值表,可得到全加器的逻辑表达式为:
Si=Ai⊕Bi⊕Ci-1
Ci=AiBi+(Ai⊕Bi)Ci-1
基本的二进制加法/减法器
2.串行加法器与并行加法器
加法器有串行和并行之分。在串行加法器中,只有一个全加器,数据逐位串行送入加法器进行运算;并行加法器则由多个全加器组成,其位数的多少取决于机器的字长,数据的各位同时运算。
串行加法器具有器件少、成本低的优点,但运算速度太慢,所以除去某些低速的专用运算器外很少采用。
并行加法器可同时对数据的各位相加,但存在着一个加法的最长运算时间问题。这是因为虽然操作数的各位是同时提供的,但低位运算所产生的进位会影响高位的运算结果。例如:11…11和00…01相加,最低位产生的进位将逐位影响至最高位,因此,并行加法器的最长运算时间主要是由进位信号的传递时间决定的,而每个全加器本身的求和延迟只是次要因素。很明显,提高并行加法器速度的关键是尽量加快进位产生和传递的速度。
2 进位的产生和传递
并行加法器中的每一个全加器都有一个从低位送来的进位输入和一个传送给高位的进位输出。我们将传递进位信号的逻辑线路连接起来构成的进位网络称为进位链。每一位的进位表达式为:
Ci=AiBi+(Ai⊕Bi)Ci-1
其中:Gi=AiBi为进位产生函数
Pi=Ai⊕Bi为进位传递函数
∴进位表达式Ci=Gi+PiCi-1
串行进位的并行加法器
其中:C1=G1+P1C0
C2=G2+P2C1
┇
Cn=Gn+PnCn-1
串行进位的并行加法器的总延迟时间与字长成正比,字长越长,总延迟时间就越长。假定,将一级“与门”、“或门”的延迟时间定为ty,从上述公式中可看出,每一级全加器的进位延迟时间为2ty。在字长为n位的情况下,若不考虑Gi、Pi的形成时间,从C0→Cn的最长延迟时间为2nty(设C0为加法器最低位的进位输入,Cn为加法器最高位的进位输出)。
3 并行加法器的快速进位
1.并行进位方式
并行进位又叫先行进位、同时进位,其特点是各级进位信号同时形成。
C1=G1+PC0
C2=G2+P2C1=G2+P2G1+P2P1C0
C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0
C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1
+P4P3P2P1C0
┇
这种进位方式是快速的,若不考虑Gi、Pi的形成时间,从C0→Cn的最长延迟时间仅为2ty,而与字长无关。但是随着加法器位数的增加,Ci的逻辑表达式会变得越来越长,输入变量会越来越多,这会使电路结构变得很复杂,所以完全采用并行进位是不现实的。
2.分组并行进位方式
⑴单级先行进位方式(组内并行、组间串行)
以16位加法器为例,可分为4组,每组4位。第一小组组内的进位逻辑函数C1、C2、C3、C4的表达式与前述相同,它们是同时产生的,实现上述进位逻辑函数的电路称之为4位先行进位电路CLA,其延迟时间是2ty。
利用这种4位的CLA电路以及进位产生/传递电路和求和电路可以构成4位的CLA加法器。用4个这样的CLA加法器,很容易构成16位的单级先行进位加法器。
16位单级先行进位加法器
⑵多级先行进位方式(组内并行、组间并行)
仍以字长为16位的加法器作为例子,分析两级先行进位加法器的设计方法。第一小组的进位输出C4可以变成两个与项相或:
C4=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
=G1*+P1*C0
其中:G1*=G4+P4G3+P4P3G2+P4P3P2G1
P1*=P4P3P2P1
Gi*称为组进位产生函数
Pi*称为组进位传递函数
依次类推,可以得到:
C8=G2*+P2*C4=G2*+P2*G1*+P2*P1*C0
C12=G3*+P3*G2+P3*P2*G1*+P3*P2*P1*C0
C16=G4*+P4*G3*+P4*P3*G2*+P4*P3*P2*G1*
+P4*P3*P2*P1*C0
成组先行进位电路BCLA,其延迟时间是2ty。利用这种4位的BCLA电路以及进位产生/传递电路和求和电路可以构成4位的BCLA加法器。16位的两级先行进位加法器可由4个BCLA加法器和1个CLA电路组成。
若不考虑Gi、Pi的形成时间,C0经过2ty产生第一小组的C1、C2、C3及所有组进位产生函数Gi*和组进位传递函数Pi*;再经过2ty,由CLA电路产生C4、C8、C12、C16;再经过2ty后,才能产生第二、三、四小组内的C5~C7、C9~C11、C13~C15。此时加法器的最长进位延迟时间是6ty。
2 定点加减运算
定点数的加减运算包括原码、补码和反码3种带符号数的加减运算,其中补码加减运算实现起来最方便。
1 原码加减运算
原码加/减法运算
加法规则
先判符号位,若相同,绝对值相加,结果符号不变;
若不同,则作减法,|大| - |小|,结果符号与|大|相同
减法规则
将减数符号取反,然后将被减数与符号取反后的减数按原码加法进行运算
2 补码加减运算
1.补码加法
两个补码表示的数相加,符号位参加运算
和的补码等于补码之和,即:
[X+Y]补=[X]补+[Y]补
2.补码减法
根据补码加法公式可推出:
[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补
从补码减法公式可以看出,只要求得[-Y]补,就可以变减法为加法。不管Y的真值为正或为负,已知[Y]补求[-Y]补的方法是:将[Y]补连同符号位一起求反,末尾加“1” 。[-Y]补被称为[Y]补的机器负数,由[Y]补求[-Y]补的过程称为对[Y]补变补(求补),表示为
[-Y]补=[[Y]补]变补
“某数的补码表示”与“变补”是两个不同的概念。一个负数由原码转换成补码时,符号位是不变的,仅对数值位各位变反,末位加“1”。而变补则不论这个数的真值是正是负,一律连同符号位一起变反,末位加“1”。[Y]补表示的真值如果是正数,则变补后[-Y]补所表示的真值变为负数,反之亦然。
例1:Y=-0.0110, [Y]原=1.0110,
[Y]补=1.1010, [-Y]补=0.0110
例2:Y=+0.0110, [Y]原=0.0110,
[Y]补=0.0110, [-Y]补=1.1010
3.补码加减运算规则
⑴参加运算的两个操作数均用补码表示;
⑵符号位作为数的一部分参加运算;
⑶若做加法,则两数直接相加,若做减法,则将被减数与减数的机器负数相加;
⑷运算结果仍用补码表示。
补码加法示例
例3:A=+0.1011,B=-0.1110,求A+B
∵[A]补=0.1011 [B]补=1.0010
0.1011 [A]补
+ 1.0010 [B]补
1.1101 [A+B]补
∴[A+B]补=1.1101
A+B=-0.0011
补码减法示例
例4:A=+0.1011,B=-0.0010,求A-B
∵[A]补=0.1011 [B]补=1.1110
[-B]补=0.0010
0.1011 [A]补
+ 0.0010 [-B]补
0.1101 [A-B]补
∴[A-B]补=0.1101
A-B=+0.1101
4.符号扩展
在计算机算术运算中,有时必须将采用给定位数表示的数转换成具有更多位数的某种表示形式,这被称为“符号扩展”。
实际上补码的符号扩展非常简单,所有附加位均用符号位填充,即正数用0进行填充,负数用1填充。
练习:
3 补码的溢出判断与检测方法
1.溢出的产生
在补码运算中,若两个正数相加,而结果为负;两个负数相加,而结果为正,则结果出错。
例5:设:X=1011B=11D,Y=111B=7D
则 [X]补=0,1011,[Y]补=0,0111
0,1 0 1 1 [X]补
+ 0,0 1 1 1 [Y]补
1,0 0 1 0 [X+Y]补
∴[X+Y]补=1,0010
X+Y=-1110B=-14D
两正数相加结果为-14D,显然是错误的。
例6:设:X=-1011B=-11D,Y=-111B=-7D
则 [X]补=1,0101 [Y]补=1,1001
1,0 1 0 1 [X]补
+ 1,1 0 0 1 [Y]补
0,1 1 1 0 [X+Y]补
∴[X+Y]补=0,1110
X+Y=1110B=14D
两负数相加结果为14D,显然也是错误的。
字长为n+1位的定点整数(其中一位为符号位),采用补码表示,当运算结果大于2n-1或小于-2n时,就产生溢出。
设参加运算的两数为X、Y,做加法运算。
若X、Y异号,实际上是做两数相减,所以不会溢出。
若X、Y同号,运算结果为正且大于所能表示的最大正数或运算结果为负且小于所能表示的最小负数(绝对值最大的负数)时,产生溢出。将两正数相加产生的溢出称为正溢;反之,两负数相加产生的溢出称为负溢。
2.溢出检测方法
设:被操作数为:[X]补=Xs,X1X2…Xn
操作数为:[Y]补=Ys,Y1Y2…Yn
其和(差)为:[S]补=Ss,S1S2…Sn
⑴采用一个符号位
采用一个符号位检测溢出时,当Xs=Ys=0,Ss=1时,产生正溢;当Xs=Ys=1,Ss=0时,产生负溢。
溢出判断条件为
溢出=
⑵采用进位位判断
两数运算时,产生的进位为
Cs,C1C2…Cn,
其中:Cs为符号位产生的进位,C1为最高数值位产生的进位。
两正数相加,当最高有效位产生进位(C1=1)而符号位不产生进位(Cs=0)时,发生正溢;两负数相加,当最高有效位不产生进位(C1=0)而符号位产生进位(Cs=1)时,发生负溢。故溢出条件为
溢出= C1+Cs =Cs⊕C1
⑶采用变形补码(双符号位补码)
在双符号位的情况下,把左边的符号位Ss1叫做真符,两个符号位都作为数的一部分参加运算。这种编码又称为变形补码(模4补码,加大模,更大范围围住模2补码的溢出)。
双符号位的含义如下:
Ss1Ss2=00 结果为正数,无溢出
Ss1Ss2=01 结果正溢
Ss1Ss2=10 结果负溢
Ss1Ss2=11 结果为负数,无溢出
当两位符号位的值不一致时,表明产生溢出,溢出条件为
溢出=Ss1⊕Ss2
4 补码定点加减运算的实现
要实现补码加法,则需给出X→F、Y→F和F→X三个控制信号,同时打开门A、门B和门C,把寄存器X和寄存器Y的内容送入加法器的两个输入端进行加法运算,并把结果送回,最后由打入脉冲CPX打入寄存器X。
减法与加法的不同之处在于,加法使用Y→F控制信号,减法使用 →F和1→F控制信号,其余控制信号相同。
补码加减运算的逻辑电路
3 带符号数的移位和舍入操作
在计算机中,实现乘除运算的方案通常有3种:
⑴ 软件实现。在低档微机中无乘除运算指令,只能用乘法和除法子程序来实现乘除运算。
⑵ 在原有实现加减运算的运算器基础上增加一些逻辑线路,使乘除运算变换成加减和移位操作。在机器中设有乘除指令。
⑶ 设置专用的乘、除法器,机器中设有相应的乘除指令。
不管采用什么方案实现乘除法,基本原理是相同的。如果采用第⑵种方案,则必然会涉及到移位操作。
1 带符号数的移位操作
1.原码的移位规则
不论正数还是负数,在左移或右移时,符号位均不变,空出位一律以“0”补入。
负数的原码移位前后结果为:
左移:移位前有:1 X1 X2 … Xn-1 Xn
移位后有:1 X2 X3 … Xn 0
右移:移位前有:1 X1 X2 … Xn-1 Xn
移位后有:1 0 X1 … Xn-2 Xn-1
2.补码的移位规则
⑴正数
符号位不变,不论左移或右移,空出位一律以“0”补入。
⑵负数
符号位不变,左移后的空出位补“0”,右移后的空出位补“1”。
左移:移位前有:1 X1 X2 … Xn-1 Xn
移位后有:1 X2 X3 … Xn 0
右移:移位前有:1 X1 X2 … Xn-1 Xn
移位后有:1 1 X1 … Xn-2 Xn-1
3.移位功能的实现
在计算机中,通常移位操作由移位寄存器来实现,但也有一些计算机不设置专门的移位寄存器,而在加法器的输出端加一个移位器。移位器是由与门和或门组成的逻辑电路(实际是一个多路选择器),可以实现直传(不移位)、左斜一位送(左移一位)和右斜一位送(右移一位)的功能。
2 带符号数的舍入操作
在算术右移时,由于受到硬件的限制,运算结果有可能需要舍去一定的尾数,这会造成一些误差。为了缩小误差,就要进行舍入处理。假定经过运算后的数共有p+q位,现仅允许保留前p位。常见的舍入方法有:
⑴恒舍(切断)
无论多余部分q位为何代码,一律舍去,保留部分的p位不作任何改变。
⑵冯·诺依曼舍入法
这种舍入法又称为恒置1法,即不论多余部分q位为何代码,都把保留部分p位的最低位置1。对补码数,正数误差趋于+ ∞ ,负数误差趋于-∞,总误差趋于0
⑶下舍上入法
下舍上入就是0舍1入。用将要舍去的q位的最高位作为判断标志,以决定保留部分是否加1。如该位为0,则舍去整个q位(相当于恒舍);如该位为1,则在保留的p位的最低位上加1。
⑷查表舍入法
查表舍入法又称ROM舍入法,因为它用ROM来存放舍入处理表,每次经查表来读得相应的处理结果。通常,ROM表的容量为2K个单元,每个单元字长为K-1位。舍入处理表的内容设置一般采用的方法是:当K位数据的高K-1位为全“1”时,让那些单元按恒舍法填入K-1位全“1”,其余单元都按下舍上入法来填其内容。
4 定点乘法运算
在计算机中,乘法运算大多数由累加与移位来实现,也有些机器中具有由大规模集成电路制造的阵列乘法模块。
1 原码一位乘法
1.原码一位乘法算法
原码一位乘法是从手算演变而来的,即用两个操作数的绝对值相乘,乘积的符号为两操作数符号的异或值(同号为正,异号为负)。
乘积P=|X|×|Y|
符号Ps=Xs⊕Ys
式中:Ps为乘积的符号,Xs和Ys为被乘数和乘数的符号。
原码一位乘法的规则:
⑴参加运算的操作数取其绝对值;
⑵令乘数的最低位为判断位,若为“1”,加被乘数,若为“0”,不加被乘数(加0);
⑶累加后的部分积以及乘数右移一位;
⑷重复n次⑵和⑶ ;
⑸符号位单独处理,同号为正,异号为负。
通常,乘法运算需要3个寄存器。被乘数存放在B寄存器中;乘数存放在C寄存器中;A寄存器用来存放部分积与最后乘积的高位部分,它的初值为0。运算结束后寄存器C中不再保留乘数,改为存放乘积的低位部分。
例8:已知:X=0.1101,Y=-0.1011,求:X×Y。
|X|=00.1101→B,|Y|=.1011→C,0→A
原码一位乘法示例
2.原码一位乘法运算的实现
图4-12中A、B是n+2位的寄存器,C是n位的寄存器,A寄存器和C寄存器是级联在一起的,它们都具有右移一位的功能,在右移控制信号的作用下,A寄存器最低一位的值将移入C寄存器的最高位。C寄存器的最低位的值作为字级与门的控制信号,以控制加被乘数还是不加被乘数(即加0)。C寄存器中的乘数在逐次右移过程中将逐步丢失,取而代之的是乘积的低位部分。原码一位乘法运算器电路中除去三个寄存器外,还需要一个n+2位的加法器、一个计数器、n+2个与门(控制是否加被乘数)和一个异或门(处理符号位)。
2 补码一位乘法
虽然原码乘法比补码乘法容易实现,但因为补码加减法简单,在以加减运算为主的通用机中操作数都用补码表示,所以这类计算机在做乘法时常使用补码乘法。
1.校正法
校正法是将[X]补和[Y]补按原码规则运算,所得结果根据情况再加以校正,从而得到正确的[X×Y]补。补码乘法的统一表达式:
[X×Y]补=[X]补×(0.Y1Y2…Yn)+[-X]补×Ys
2.比较法——Booth乘法
递推公式:
[Z0]补=0
[Z1]补=2-1{[Z0]补+(Yn+1-Yn)[X]补}
[Z2]补=2-1{[Z1]补+(Yn-Yn-1)[X]补}
┇
[Zn]补=2-1{[Zn-1]补+(Y2-Y1)[X]补}
∴[X×Y]补=[Zn]补+(Y1-Ys)[X]补
式中,[Z0]补为初始部分积,[Z1]补~[Zn]补依次为各次求得的累加并右移之后的部分积。
Booth乘法规则:
⑴参加运算的数用补码表示;
⑵符号位参加运算;
⑶乘数最低位后面增加一位附加位Yn+1,其初值为0;
⑷由于每求一次部分积要右移一位,所以乘数的最低两位Yn、Yn+1的值决定了每次应执行的操作;
⑸移位按补码右移规则进行;
⑹共需做n+1次累加,n次移位,第n+1次不移位。
Booth乘法运算操作 :
判断位Yn Yn+1 操 作
0 0 原部分积右移一位
0 1 原部分积加[X]补后右移一位
1 0 原部分积加[-X]补后右移一位
1 1 原部分积右移一位
由于符号位要参加运算,部分积累加时最高有效位产生的进位可能会侵占符号位,故被乘数和部分积应取双符号位,而乘数只需要一位符号位。运算时仍需要有3个寄存器,各自的作用与原码时相同,只不过存放的内容均为补码表示而已。
例9:已知X=-0.1101,Y=0.1011;求X×Y。
[X]补=11.0011→B,[Y]补=0.1011→C,0→A
[-X]补=00.1101
3.Booth乘法运算的实现
各器件的作用与原码一位乘法相同,A、B寄存器长n+2位,C寄存器长n+1位,还需一个n+2位的加法器、n+2个与或门和一个计数器。由C寄存器的最低两位CnCn+1来控制是加/减被乘数还是加0,当CnCn+1=01时,加被乘数,即加B寄存器的内容;CnCn+1=10时,减被乘数,即加上B寄存器中内容的反,并在加法器的最低位加1;CnCn+1=00或11时,不加也不减(加0)。由于符号位参与运算,所以不需要专门处理符号位的异或门。
3 补码两位乘法
为了提高乘法的执行速度,可以选用两位乘法的方案。所谓两位乘法,就是每次处理乘数中的两位,从而使乘法的速度提高了一倍。
根据Booth乘法方便地推导出补码两位乘法,即把补码两位乘理解为将Booth乘法的两次合并为一次来做。
补码两位乘法操作:
Yn-1YnYn+1
0 0 0 +0,右移2位
0 0 1 +[X]补,右移2位
0 1 0 +[X]补,右移2位
0 1 1 +2[X]补,右移2位
1 0 0 +2[-X]补,右移2位
1 0 1 +[-X]补,右移2位
1 1 0 +[-X]补,右移2位
1 1 1 +0,右移2位
被乘数和部分积取3符号位,当乘数的数值位n为偶数时,乘数取两符号位,共需作 +1次累加, 次移位(最后一次不移位);当n为奇数时,乘数只需一个符号位,共需 次累加和移位,但最后一次仅移一位。
例10:已知:X=0.0110011,Y=-0.0110010,求:X×Y。
[X]补=000.0110011→B,
[Y]补=1.1001110→C,0→A
2[X]补=000.1100110,
[-X]补=111.1001101,2[-X]补=111.0011010
5 定点除法运算
除法是乘法的逆运算,可以将n位除转化成若干次“减法-移位”,也有些计算机具有由大规模集成电路制造的阵列除法模块。
恢复余数法
先做减法试商。若部分余数为正,表示够减,该位商上“1”;若部分余数为负,表示不够减,该位商上“0”,并加除数恢复余数。
2 补码除法运算
1.够减的判断
参加运算的两个数符号任意,当被除数(或部分余数)的绝对值大于或等于除数的绝对值时,称为够减;反之称为不够减。当两数同号时,实际应作减法;两数异号时,实际应作加法。
判断的方法和结果如下:当被除数(或部分余数)与除数同号时,如果得到的新部分余数与除数同号,表示够减,否则为不够减;当被除数(或部分余数)与除数异号时,如果得到的新部分余数与除数异号,表示够减,否则为不够减。
2.上商规则
补码除法运算的商也是用补码表示的,上商的规则是:如果[X]补和[Y]补同号,则商为正数,够减时上商“1”,不够减时上商“0”;如果[X]补和[Y]补异号,则商为负数,够减时上商“0”,不够减时上商“1”。
补码的上商规则可归结为:
部分余数[ri]补和除数[Y]补同号,商上“1”,反之,商上“0”。
3.商符的确定
商符是在求商的过程中自动形成的,按补码上商规则,第一次得出的商,就是实际应得的商符。为了防止溢出,必须有|X|<|Y|,所以第一次肯定不够减。当被除数与除数同号时,部分余数与除数必然异号,商上“0”,恰好与商符一致;当被除数与除数异号,部分余数与除数必然同号,商上“1”,也恰好就是商的符号。
4.求新部分余数
求新部分余数[ri+1]补的通式如下:
[ri+1]补=2[ri]补+(1-2Qi)×[Y]补
Qi表示第i步的商。若商上“1”,下一步操作为部分余数左移一位,减去除数;若商上“0”,下一步操作为部分余数左移一位,加上除数
5.末位恒置1
商的最末一位恒置为“1”,运算的最大误差为2-n。此法操作简单,易于实现。
补码加减交替除法示例
例13:已知X=0.1000,Y=-0.1010;
求X÷Y。
[X]补=00.1000→A,
[Y]补=11.0110→B,0→C
[-Y]补=00.1010
6 规格化浮点运算
第2章中已经讨论了浮点数的表示方法,这里将进一步讨论规格化浮点数的四则运算问题,其中尾数的基值r=2。
1 浮点加减运算
设两个非0的规格化浮点数分别为:
A=MA×
B=MB×
规格化浮点数A、B加减运算通式为:
A±B=(MA,EA)±(MB,EB)
={
1.浮点数加减运算步骤
⑴对阶
两个浮点数相加或相减,首先要把小数点的位置对齐,而浮点数的小数点的实际位置取决于阶码的大小,因此,对齐两数的小数点,就是使两数的阶码相等,这个过程称为对阶。
要对阶,首先应求出两数阶码EA和EB之差ΔE=EA-EB
若ΔE=0,表示两数阶码相等,即EA=EB;若ΔE>0,表示EA>EB;若ΔE<0,表示EA<EB。
当EA≠EB时,要通过尾数的移位来改变EA或EB。对阶的规则是:小阶向大阶看齐。要使小阶的阶码增大,则相应的尾数右移,直到两数的阶码相等为止。每右移一位,阶码加1。
EA>EB,则MB右移。每右移一位,EB+1→EB,直至EA=EB为止。
EA<EB,则MA右移。每右移一位,EA+1→EA,直至EA=EB为止。
尾数右移后,应对尾数进行舍入。
⑵尾数加/减
对阶之后,就可以进行尾数加/减,即:MA±MB→MC
其算法与定点加/减法相同。
⑶尾数结果规格化
尾数加/减运算之后得到的数可能不是规格化数,为了增加有效数字的位数,提高运算精度,必须进行结果规格化操作。
1/2≤|M|<1
设尾数用双符号位补码表示,经过加/减运算之后,可能出现以下6种情况,即:
① 00.1 x x … x
② 11.0 x x … x
③ 00.0 x x … x
④ 11.1 x x … x
⑤ 01.x x x … x
⑥ 10.x x x … x
第①和②种情况,已是规格化数。
第③和④种情况需要使尾数左移以实现规格化,这个过程称为左规。尾数每左移一位,阶码相应减1(EC-1→EC),直至成为规格化数为止。补码表示时,符号位和尾数最高位同值需左规
左规= +Cs1 Cs2 C1
左规可以进行多次。式中Cs1、Cs2表示尾数MC的两个符号位,C1为MC的最高数值位。
第⑤和⑥种情况在定点加减运算中为溢出;但浮点加减运算中,只表明此时尾数的绝对值大于1,并非真正的溢出。这种情况应将尾数右移以实现规格化。这个过程称为右规。尾数每右移一位,阶码相应加1(EC+1→EC)。
右规=Cs1⊕Cs2
右规最多只有一次。
⑷舍入
最简单的舍入方法是恒舍法,即无条件的丢掉正常尾数最低位之后的全部数值。
⑸溢出判断
当尾数右规后,需根据阶码来判断浮点运算结果是否溢出。阶码用双符号位补码表示时
[EC]补=01, x x x … x,表示上溢。此时,浮点数真正溢出,机器需停止运算,做溢出中断处理。
[EC]补=10, x x x … x,表示下溢。浮点数值趋于零,机器不做溢出处理,而是按机器零处理。
2.浮点数加减运算举例
有两浮点数为
A=0.101110×2-01
B=-(0.101011)×2-10
假设这两数的机器码格式:阶码用4位移码(偏置值为23)表示;尾数用8位,补码表示,包含一位符号位,即
阶码 尾数
[A]浮=0111;0.1011100
[B]浮=0110;1.0101010
⑴ 对阶
求阶差:ΔE=EA-EB=-1-(-2)=1
ΔE=1,表示EA>EB。按对阶规则,将MB右移一位,EB+1→EB,得:
[B]浮=0111;1.1010101
⑵ 尾数求和
00.1011100
+ 11.1010101
00.0110001
⑶尾数结果规格化
由于结果的尾数是非规格化的数,故应左规。尾数每左移一位,阶码减1,直至尾数成为规格化数为止。最后结果为
[A+B]浮=0110;0.110001
即 A+B =(0.110001)×2-10
未发生溢出
2 浮点乘除运算
设两个非0的规格化浮点数分别为
A=MA×
B=MB×
规格化浮点数A、B乘除运算通式为:
(MA,EA)×(MB,EB)=(MA×MB,EA+EB)
(MA,EA)÷(MB,EB)=(MA÷MB,EA-EB)
1.乘法步骤
⑴阶码相加
两个浮点数的阶码相加,如果阶码用补码表示,无须校正;当阶码用偏置值为2n的移码表示时,阶码相加后要减去一个偏移量2n。
因为[EA]移=2n+EA,[EB]移=2n+EB,
[EA+EB]移=2n+(EA+EB)
而[EA]移+[EB]移=2n+EA+2n+EB
所以[EA+EB]移=[EA]移+[EB]移-2n
显然,此时阶码和中多余了一个偏置量2n,应将它减去。另外,阶码相加后有可能产生溢出,此时应另作处理。
⑵尾数相乘
MA、MB进行定点乘法。
⑶尾数结果规格化
由于A、B均是规格化数,所以尾数相乘后的结果一定落在下列范围内:
1/4 ≤|MA×MB|<1
当1/2≤|MA×MB|<1时,乘积已是规格化数,无须再进行规格化操作;当1/4≤|MA×MB|<1/2时,则需要左规一次。左规时调整阶码后如果发生阶码下溢,则做机器零处理。
2.除法步骤
⑴尾数调整
为了保证商的尾数是一个定点小数,首先需要检测|MA|<|MB|。如果不小于,则MA右移一位,EA+1→EA,称为尾数调整。因为A、B都是规格化数,所以最多调整一次。
⑵阶码相减
两浮点数的阶码相减,如果阶码用补码表示,阶码相减之后无须校正;当阶码用偏置值为2n的移码表示时,阶码相减后要加上一个偏移量2n。阶码相减后,如有溢出,应另作处理。
⑶尾数相除
若MA、MB都不为0,则可进行尾数除法。尾数除法的算法与前述定点数除法算法相同。因为开始时已进行了尾数调整,所以运算结果一定落在规格化范围内,即
1/2 ≤|MA÷MB|<1
3 浮点运算器的实现
浮点运算的阶码只有加减运算,尾数则有加、减、乘、除四种运算。可见浮点运算器主要由两个定点运算部件组成,一个是阶码运算部件,用来完成阶码加、减,以及控制对阶时小阶的尾数右移次数和规格化时对阶码的调整;另一个是尾数运算部件,用来完成尾数的四则运算以及判断尾数是否已规格化。此外,还需要有溢出判断电路等。
80年代微型计算机把浮点运算部件做成任选件,或称为协处理器。所谓协处理器是因为它只能协助主处理器工作,不能单独工作。
7 十进制整数的加法运算
一些通用计算机中设有十进制数据表示,可以直接对十进制整数进行算术运算。下面讨论十进制整数的加法运算和十进制加法器。
1 一位十进制加法运算
1.8421码加法运算
8421码的加法规则:
⑴两个十进制数的8421码按二进制加法相加;
⑵当和≤9,无需校正;
⑶当和>9,则+6校正;
⑷在做+6校正的同时,将产生向上一位的进位。
8421码的校正关系:
校正举例
2.余3码加法运算
余3码的加法规则:
⑴两个十进制数的余3码相加,按“逢二进一”的原则进行;
⑵若其和没有进位,则减3(即+1101)校正;
⑶若其和有进位,则加3(即+0011)校正。
余3码的校正关系: 举例:
2 十进制加法器
2.一位余3码加法器
C4’=0,-3校正;C4’=1,+3校正。
向上一位的进位C4=C4’
3 多位十进制加法
对于多位十进制数加法可采用多个BCD码加法器,每个BCD码加法器就是前述的一个一位十进制加法器,可执行两个一位BCD数的加法。若n位BCD数相加,由从低位至高位采用行波式串行进位的n位十进制加法器完成。
8 逻辑运算与实现
计算机在解题过程中,除了要做大量的算术运算外,还需做许多逻辑操作,如:与、或、非、异或等。
逻辑运算比算术运算要简单得多,这是因为逻辑运算是按位进行的,位与位之间没有进位与借位的关系。
1.逻辑非
逻辑非又称求反操作,它对某个寄存器或主存单元中各位代码按位取反。
设:X=X0X1…Xn,Z=Z0Z1…Zn
则:Zi= (i=0,1,…,n)
2.逻辑乘
逻辑乘就是将两个寄存器或主存单元中的每一相应位的代码进行按位与操作。
设:X=X0X1…Xn,Y=Y0Y1…Yn,
Z=Z0Z1…Zn
则:Zi=Xi∧Yi(i=0,1,…,n)
3.逻辑加
逻辑加就是将两个寄存器或主存单元中的每一相应位的代码进行或操作。
设:X=X0X1…Xn,Y=Y0Y1…Yn,
Z=Z0Z1…Zn
则:Zi=Xi∨Yi(i=0,1,…,n)
4.逻辑异或
逻辑异或又称按位加,它对两个寄存器或主存单元中各位的代码求模2和。
设:X=X0X1…Xn,Y=Y0Y1…Yn,
Z=Z0Z1…Zn
则:Zi=Xi⊕Yi(i=0,1,…,n)
9 运算器的基本组成与实例
运算器是在控制器的控制下实现其功能的。运算器不仅要完成数据信息的算术逻辑运算,还要实现必要的数据信息的传送通路。
1 运算器结构
1.运算器的基本组成
基本的运算器包含以下几个部分:实现基本算术逻辑运算功能的ALU,提供操作数与暂存结果的寄存器组,有关的判别逻辑和控制电路等。
运算器内的各功能模块之间的连接采用总线结构,ALU和各寄存器都挂在上面。运算器的内部总线是CPU的内部数据通路,只有数据线。
⑴带多路选择器的运算器
各寄存器独立将数据送至ALU的多路选择器,ALU有选择地同时获得两路输入数据。运算器的内部总线是一组单向传送的数据线,它将运算结果送往各寄存器,由寄存器的同步打入脉冲CPi将内部总线上的数据送入Ri。如果同时发出几个打入脉冲,则可将总线上的同一数据同时送入几个相关的寄存器中。
⑵带输入锁存器的运算器
运算器的内部总线是一组双向传送的数据线。为了进行双操作数之间的运算操作,ALU输入端前设置了一级锁存器,可暂存操作数。
要实现(R0)+(R1)→R2,通过内部总线先将R0中的数据送入锁存器1,再通过内部总线将R1中的数据送入锁存器2,然后ALU做加法,并将结果经内部总线送入R2
2.运算器的内部总线结构
⑴单总线结构运算器
图4-25就是单总线结构运算器。这种结构的运算器实现一次双操作数的运算需要分成三步,它的主要缺点是操作速度慢。
⑵双总线结构运算器
两个操作数可以分别通过总线1和总线2同时送到ALU去进行运算,并且立即可以得到运算的结果。但是ALU的输出不能直接送到总线上去,这是因为此时两条总线都被操作数所占据着,所以必须在ALU的输出端设置一个缓冲器,先将运算结果送入缓冲器,第二步再把结果送至目的寄存器。显然,它的执行速度比单总线要快,每次操作比单总线少一步。
⑶三总线结构运算器
ALU的两个输入端分别由两条总线供给,输出与第三条总线相连,这样算逻操作就可以在一步控制之内完成。如果某一个数不需要运算和修改,而需要直接由总线2传到总线3,可通过总线旁路器把数据送出,而不必借助于ALU。三总线结构的特点是操作速度快,但控制较前两种复杂。
2 ALU举例
1.ALU电路
ALU即算术逻辑单元,它是既能完成算术运算又能完成逻辑运算的部件。前面已经讨论过,无论是加、减、乘、除运算,最终都能归结为加法运算。因此,ALU的核心首先应当是一个并行加法器,同时也能执行像“与”、“或”、“非”、“异或”这样的逻辑运算。
2.4位ALU芯片
以典型的4位ALU芯片(74181)为例介绍ALU的结构及应用。74181能执行16种算术运算和16种逻辑运算。
3.ALU的应用
74181的4位作为一个小组,小组间既可以采用串行进位,也可以采用并行进位。当采用串行进位时,只要把低一片的Cn+4与高一片的Cn相连即可。当采用组间并行进位时,需要增加一片74182,这是一个先行进位部件CLA。74182可以产生3个进位信号Cn+x、Cn+y、Cn+z,并且还产生大组进位产生函数和进位传递函数。
各片74181输出的组进位产生函数和组进位传递函数作为74182的输入,而74182输出的进位信号Cn+x、Cn+y、Cn+x作为74181的输入,74182输出的大组进位产生函数和大组进位传递函数可作为更高一级74182的输入。
3 浮点运算器举例
1.80x87的数据格式
80x87可处理7种不同的数据类型。对整数来说,最高位为符号位,用补码表示,有16、32和64位三种格式。压缩的十进制数串是用特殊形式表示的整数。十进制数的一位用4位二进制表示,80位的低72位表示18位十进制数,最高位为符号位,正数和负数都是以原码形式存储的。浮点数有32、64和80位三种格式,阶码的底为2,用移码表示,尾数用原码表示。
2.80x87的内部结构
80x87的内部结构由总线控制逻辑部件、数据接口与控制部件、浮点运算部件3个主要功能模块组成。
在80x87的浮点运算部件中,分别设置了阶码(指数)运算部件与尾数运算部件,并设有加速移位操作的移位器。
80x87与主微处理器协同工作,微处理器执行所有的常规指令,而80x87只执行专门的算术协处理器指令,称为换码(ESC)指令。微处理器和协处理器可以同时或并行执行各自的指令。