版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
机器数的运算方法及运算器机器数的加减运算及其实现定点乘法及其实现定点除法及其实现浮点数的算术运算运算器的组成和结构浮点运算器习题4.1
机器数的加减运算及其实现4.1.1 原码加法符号相同的两个原码相加,运算比较简单;符号不相同的两个原码相加,实际上就是做减法运算,而在计算机中实现减法运算是很复杂的。1.符号相同的两个原码相加符号相同的两个原码相加,只要两个数的数值相加即可,其符号不变。【例4.1】设X=+10001,Y=+01011,求Z=X+Y。解:(+10001)+(+01011)+11100即Z=+11100。【例4.2】设X=-10001,Y=-01011,求Z=X+Y。解:(-10001)+ (-01011)-11100即Z=-11100。2.符号相异的两个原码相加符号相异的两个原码相加,实际上是要做减法运算,做减法运算时先比较两数的绝对值大小,用绝对值大的数减去绝对值小的数,结果的符号是绝对值大的数的符号。【例4.3】设X=+10101,Y=-01010,求Z=X+Y。解:先比较X与Y的绝对值,本题|X|>|Y|,所以做减法|X|-|Y|,即有10101- 0101001011结果是Z=+01011。【例4.4】设X=+01010,Y=-10111,求Z=X+Y。解:先比较X与Y的绝对值,本题|Y|>|X|,所以做减法|Y|-|X|,即有10111- 0101001101结果是Z=-01101。用原码进行符号不同的两个数相加时有以下三步运算:①比较两个数的绝对值的大小。②绝对值大的数的绝对值减去绝对值小的数的绝对值。③结果赋以绝对值大的那个数的符号。由上述各例可以看出,用原码进行加法运算是很麻烦的,实际上计算机中不用原码进行运算,而是用补码来进行运算。1.定点补码运算性质性质1 两数之和的补码等于两数补码之和。[X+Y]补=[X]补+[Y]补4.1.2
补码加法【例4.5】设X=+11010,Y=-10101,用补码的加法求Z=X+Y。解:加数和被加数的数值位都是5位,在数值位之前加1位符号位。这样,[X]补=011010,[Y]补=101011[X+Y]补=[X]补+[Y]补=011010+101011=000101所以,X+Y=+00101。注意:在运算中,数值位和符号位有进位,本例采用单符号位,以2为模,进位的1就丢掉了。【例4.6】设X=+10101,Y=-11010,用补码的加法求Z=X+Y。解:[X]补=010101,[Y]补=100110[X+Y]补=[X]补+[Y]补=010101+100110=111011所以,X+Y=-00101。性质2 一个负数的补码的补码就是这个负数的原码。[[X]补]补=[X]原【例4.7】设有两个定点小数X=-0.10011,Y=-0.11001求这两个负数补码的补码。解:[X]原=1.10011[Y]原=1.11001[X]补=1.01101[Y]补=1.00111[[X]补]补=1.10011=[X]原[[Y]补]补=1.11001=[Y]原补码的这一性质,为计算机处理运算结果提供了方便,计算机中计算结果的补码均可化成该数的原码。【例4.8】设有两个定点小数X=-0.1101,Y=0.0111(-1<X+Y<0),求这两数之和。解:[X]补=1.0011 [Y]补=0.0111[X]补+[Y]补=1.0011+0.0111=1.1010[X+Y]原=[[X]补+[Y]补]补=[1.1010]补=1.0110所以,X+Y=-0.0110。用真值进行运算:X+Y=-0.1101+0.0111=-0.0110结果相同。可见,用补码做加法是数值位连同符号位一起参加运算的。但是在有溢出的情况下,用一般的补码加法就得不到正确的结果,再看下面的例子。【例4.9】设有两个定点小数X=+0.10111,Y=+0.10001,用补码的加法求Z=X+Y。解: [X]补=0.10111,[Y]补=0.10001[X+Y]补=[X]补+[Y]补=0.10111+0.10001=1.01000Z=X+Y=-0.11000两个大于0.5的正数相加,结果就为负值,结果显然是错误的。【例4.10】设X=-0.10111,Y=-0.10001,用补码的加法求Z=X+Y。解: [X]补=1.01001,[Y]补=1.01111[X+Y]补=[X]补+[Y]补=1.01001+1.01111=0.11000Z=X+Y=+0.11000两个绝对值大于0.5的负数相加,结果为正值,这显然也是错误的。为什么在上面的两个例子中用一般的补码加法运算得不出正确的结果呢?原因是它们的和超出了机器数所能表示的最大范围,即产生了溢出,在有溢出的情况下,用一般补码加法就无法得到正确结果。从上面的两个例子也可以看到,溢出都是发生在同符号两数相加时,而两个异符号数相加是不会发生溢出的。【例4.11】设有两个定点小数X=+0.10111,Y=-0.10001,用补码的加法求Z=X+Y。解:[X]补=0.10111,[Y]补=1.01111[X+Y]补=[X]补+[Y]补=0.10111+1.01111=0.00110所以,Z=+0.00110,没有发生溢出,结果是正确的。【例4.12】设有两个定点小数X=-0.10111,Y=+0.10001,用补码的加法求Z=X+Y。解:[X]补=1.01001,[Y]补=0.10001[X+Y]补=[X]补+[Y]补=1.01001+0.10001=1.11010[[X+Y]补]补=1.00110Z=X+Y=-0.00110所以,Z=-0.00110,没有发生溢出,结果也是正确的。溢出的问题可用变形补码来解决。下面介绍变形补码。2.变形补码加法变形补码是符号位用两位来表示的补码。变形补码的定义为:对于变形补码,补码的加法性质公式同样适用,即:[X+Y]变形补=[X]变形补+[Y]变形补[[X]变形补]变形补=[X]原用该公式进行加法运算就能及时判断出溢出。用双符号位进行判断,若和的两个符号位相同(00或11),不发生溢出;若和的两个符号位相异(01或10)就说明发生了溢出。遇到溢出,就要停机进行如下处理:选取一个合理的比例因子H=2i,对每个加数都除以H,然后相加,其结果再乘以H,即得所求。下面对例4.9和例4.10用变形补码加法来求结果。【例4.13】设X=+10111,Y=+10001,用变形补码的加法求Z=X+Y。解:设比例因子H=2,则有[1/2X]变形补=00.01011,[1/2Y]变形补=00.01001[1/2(X+Y)]变形补=[1/2X]变形补+[1/2Y]变形补=00.01011+00.01001=00.10100所以,1/2(X+Y)=+10100,X+Y=+101000。【例4.14】设X=-10111,Y=-10001,用变形补码的加法求Z=X+Y。解:设比例因子H=2,则有[1/2X]变形补=11.10101,[1/2Y]变形补=11.10111[1/2(X+Y)]变形补=[1/2X]变形补+[1/2Y]变形补=11.10101+11.10111=11.01100所以,[1/2(X+Y)]=-10100,X+Y=-101000。说明:(1) 舍入处理。在变形补码运算中,加数除以H=2i,是通过把[X]补右移1位得到的。在移位时,末几位可能超出机器的最末位而丢失,造成误差。为了减少误差,通常要进行舍入处理,一般有两种方法。①恒置1。即移位后机器末位总是1。上面的例子就是用的恒置1的方法。②0舍1入。即移出去的数是0则抹去,移出去的数是1则进1到末位。(2) 符号位扩展。补码在右移时,要注意符号位要一起移,且最左边一位要补上原符号位的值,这就叫做符号位扩展,即把符号位扩展到为3位。总结以上内容,得出补码相加的规则:①若两数符号不同,相加的结果即为和的补码。②若两数符号相同,相加后若其和的符号不变,则结果是和的补码。③若两数符号相同,相加后若其和的符号改变,则表示发生了溢出。两个正数相加,结果的符号为“01”,表示发生正溢出;两个负数相加,结果的符号为“10”,表示发生负溢出。两数相减的减法运算仍可用补码的加法进行。性质3 两数之差的补码等于被减数的补码与负的减数补码之和。[X-Y]补=[X]补+[-Y]补这可由性质1推导而得:[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补4.1.3
减法运算【例4.15】两个正数相减,被减数大于减数的例子。设X=+11001,Y=+10001,求Z=X-Y。解: [X]补=00.11001,[-Y]补=11.01111[X-Y]补=[X]补+[-Y]补=00.11001+11.01111=00.01000X-Y=+01000所以,Z=+01000。【例4.16】两个正数相减,被减数小于减数的例子。设X=+10011,Y=+11001,求Z=X-Y。解: [X]补=00.10011,[-Y]补=11.00111[X-Y]补=[X]补+[-Y]补=00.10011+11.00111=11.11010X-Y=-00110所以,Z=-00110。【例4.17】两负数相减,被减数大于减数的例子。设X=-10011,Y=-11001,求Z=X-Y。解:[X]补=11.01101,[-Y]补=00.11001[X-Y]补=[X]补+[-Y]补=11.01101+00.11001=00.00110X-Y=+00110所以,Z=+00110。【例4.18】两负数相减,被减数小于减数的例子。设X=-11001,Y=-10011,求Z=X-Y。解:[X]补=11.00111,[-Y]补=00.10011[X-Y]补=[X]补+[-Y]补=11.00111+00.10011=11.11010X-Y=-00110所以,Z=-00110。在线路实现上,若已有[Y]补,求[-Y]补可用把[Y]补每一位(包括符号位和数值位)取反,再在最低位加1来实现。实现补码加减运算的逻辑电路如图4.1所示。4.1.4
补码加减法运算线路的实现图4.1实现补码加减运算的逻辑电路图中各个部件的名称和功能是:F 表示多位并行加法器,它的功能是接收参加运算的两个数X和Y,实现加法运算,并在输出端给出本次运算结果。加法器的最低一位可以接收一个进位信号1→F。X和Y 临时存放参加运算数据的两个寄存器,X还用来保存运算的结果。A “与”门,功能是控制寄存器X输出的内容是否送到加法器F的左输入端,用X→F信号控制。C “与”门,功能是控制加法器F的运算结果是否写回寄存器X,用F→X信号控制。B“与或”门,功能是通过控制信号Y→F和→F分别把Y寄存器中的内容是原数据送加法器F还是各位取反后送加法器F。加法器和寄存器由若干二进制位组成,位数就是定点运算器的字长,一般可为16.32或64位等。它们的最高一位一般用作符号位,其余各位是数值位。4.2
定点乘法及其实现4.2.1 原码一位乘法及其实现用原码进行乘法运算比较方便。在定点计算机中,用两个原码表示的数相乘,其乘积的符号由两数的符号位异或得到,乘积的数值部分是两数的绝对值相乘之积。可见,原码的乘法的实质是两个正数相乘。在计算机中实现乘法运算的方法是移位相加,采用部分积右移的方法。其运算规则是:根据乘数Y绝对值每个数位上的值Yi是“1”还是“0”(从最低位Y0开始),决定本次部分积是加上被乘数X的绝对值,还是加上全“0”,得到的新部分积右移一位,再重复上面的动作,直到乘法做完为止。【例4.19】X=+11010,Y=+10110,求Z=X*Y。解: [X]原=0.11010,[Y]原=0.10110乘积的符号位Z0=0 0=0。乘积的数值部分是两数的绝对值相乘。开始时,部分积为全“0”。所得结果Z=+0.1000111100。在上述算式中,是两数的绝对值相乘,但有时部分积的符号位出现“1”,并不是出现了负数,而是部分积的值超出了“1”,右移时符号位应补“0”部分积每次右移一位,最低位进入了乘数寄存器中,这一位下次不需要参加运算,运算只在高位进行。乘数和部分积连在一起进行右移,乘数最低一位自动丢失。部分积的低位就依次进入乘数寄存器中。用这种形式计算乘法,两个n位数相乘,只需要n+1位全加器就够了。运算结果为2n位。要实现原码一位乘法,乘积的符号可以用异或门实现,异或门的两个输入为相乘两数的符号,输出即为乘积的符号。图4.2给出了实现原码一位乘法的逻辑电路框图,以实现对相乘两数的数值位相乘。现对该图说明如下。图4.2实现原码一位乘法的逻辑电路框图主要组成部件有:寄存器A,存放计算的部分积Z,具有自动移位功能;寄存器B,存放被乘数X;寄存器C,存放乘数Y,具有自动移位功能;加法器F,进行部分积和被乘数相加;计数器i,用来控制逐位相乘的次数。控制信号A→F、B→F分别通过与门控制部分积、被乘数送入加法器F进行相加;控制信号A/2→A.C/2→C分别控制寄存器A.C自行右移一位。乘法开始时,寄存器A被清零,作为初始部分积。通过控制命令A→F和B→F把部分积和被乘数送入加法器,实现部分积和被乘数相加,得到新的部分积,部分积的右移是通过控制信号A/2→A实现的。乘法运算开始时,发“启动”信号,使控制触发器Cx置“1”,于是开启时序脉冲T。当乘数寄存器C最末位为“1”时,部分积Z和被乘数X在加法器中相加,其结果输出到寄存器A中,只要控制脉冲T到来,控制信号A/2→A就使部分积右移一位;与此同时,乘数寄存器C也在控制信号C/2→C的作用下,实现右移一位,其最低位的值Yn可用作B→F控制命令。图中,寄存器A与寄存器C是连接起来的,右移时寄存器A的最低位将移入寄存器C的最高数值位,乘法结束时,乘积的高位部分保留在寄存器A中,而积的低位部分保存在寄存器C中,原来的乘数在逐位右移过程中全部移出丢失。所得乘积为2n+1位,其中符号位1位,数值位2n位。计数器中的初值是乘数位数的补码值,完成一位运算,就计数一次(实际上是减一次),直至计数器值为0,给出结束乘法运算的控制信号。很多计算机是直接用补码相乘的。两个补码数相乘,其结果应直接得到乘积的补码:[X]补*[Y]补=[X*Y]补但由于乘数可能为正,也可能为负,情况就不相同。4.2.2
定点补码一位乘法及其实现(1) 当被乘数X的符号为任意,乘数Y的符号为正。因为Y≥0,[Y]补=Y,则[X]补*[Y]补=[X]补*Y=[X*Y]补这种情况,可以由两个补码数直接相乘得到正确的结果。运算过程中的加、移位等操作均按补码规则进行。(2) 当被乘数X的符号为任意,乘数Y的符号为负。因为Y<0,[Y]补=2n+Y,则[X]补*[Y]补=[X]补*[2n+Y]=[X]补*2n+[X]补*Y而正确的乘积应为[X]补*Y,上面结果显然多了一项[X]补*2n。这种情况,结果应该进行修正,把[X]补*2n作为修正值,这就是修正法补码乘法。总结修正法补码乘法的运算规则是:①符号位参加运算,结果的符号由运算结果得出,重复执行n步右移操作进行相加。②当乘数为负时,需进行n+1步操作,进行修正。(3) 当被乘数X和乘数Y的符号都任意时。当被乘数X和乘数Y的符号都任意时,应该用比较法补码乘法。比较法又叫BOOTH法,是由修正法导出的用两个补码直接相乘后就得到正确结果的方法。这种方法有更大的适应性。由此,可以总结出比较法补码乘法的规则。在作补码一位乘法时,要用两位判别位判别本次部分积作什么运算。因此在乘数的最末位后面再加一位附加位Yn。开始时,Yn=0,第一步运算是根据Yn-1Yn这两位的值判断后决定,然后再根据Yn-2Yn-1这两位的值判断第二步该作什么运算,再根据Yn-3Yn-2这两位的值判断第三步该作什么运算,如此等等。因为每进行一步,乘数都要右移一位,Yn-2Yn-1就移到Yn-1Yn位置上。作第三步时,原来的Yn-3Yn-2移到了Yn-2Yn-1位置上。所以每次只要判断Yn-1Yn这两位的值就行。判断规则如表4.1(见书100页)所示。比较法计算用流程图表示,如图4.3所示。在做补码一位乘法时,开始时部分积为0,然后根据上述规则决定本次做什么运算,共作n+1步,最后一步不移位。图4.3比较法计算的流程图【例4.20】利用补码一位乘法计算Z=X*Y,其中X=-0.1101,Y=0.1011。解:[X]补=11.0011,[Y]补=0.1011,[-X]补=00.1101乘积的数值部分是两数的绝对值相乘。开始时,部分积为全“0”。所以[X*Y]补=11.01110001,结果Z=X*Y=-0.10001111。实现一位补码乘法的逻辑原理图如图4.4所示。它与一位原码乘法的逻辑原理图有些相似,不同的地方有以下几点:图4.4补码一位乘法逻辑原理图被乘数和乘数的符号位参加运算。乘数寄存器C有附加位Yn,其初始状态为“0”。当乘数和部分积每次右移时,部分积最低位移入寄存器C的首位位置,所以寄存器C必须是具有右移功能的寄存器。被乘数寄存器B的每一位用原码或反码(可用触发器的Q端或Q端输出)经多路开关传送到加法器对应位的一个输入端,而多路开关的控制信号由Yn-1.Yn的输出译码器产生。当Yn-1Yn=01时,送[X]补;当Yn-1Yn=10时,送[-X]补,即送寄存器B内容的反码且在加法器末位加1。寄存器A用来保存部分积,该寄存器也应具有右移的功能,其符号位与加法器的符号位始终一致。当计数器i=n+1时,封锁A/2→A.C/2→C控制信号,使最后一步不移位。定点原码两位乘法是根据乘数中相邻两位数码的值来确定乘法的每一步作什么运算。两位乘法的判别位是2位,即YnYn+1,共有4种可能,即00、01.10、11,其操作方法如表4.2(见书102页)所列。4.2.3
原码两位乘法【例4.21】设X=1101,Y=1001,用原码两位乘法求Z=X*Y。解:以X为被乘数,Y为乘数,其判别位Y1Y0=01,Y3Y2=10,其两位乘法的运算过程如下:所得结果Z=1110101。【例4.22】用原码两位乘法求Z=X*Y,其中X=101011,Y=001001。解:以X为被乘数,Y为乘数,其判别位Y1Y0=01,Y3Y2=10,Y5Y4=00,其两位乘法的运算过程如下:所得结果Z=110000011。说明:①部分积减去被乘数X,是用补码进行运算,即用+[-X]补的方法实现。②部分积减去被乘数所得结果一般为负数,这是因为部分积要右移2位,所以总是小于被乘数的缘故。③当判别位为11时,要用上次部分积减被乘数,右移2位,再在下一个判别位上加1。其原因是判别位为11(即3),应加上3倍的被乘数。两种方法是等效的。④符号位扩展的实质是采用几位加法器的问题。若采用n+2位加法器,符号位扩展2位;若采用n+3位加法器,则符号位应扩展3位。进行定点补码两位乘法,要有3位判别位,3位判别位的组合关系为:-2Yi+Yi-1+Yi-2它们的组合值与相应的加法操作,如表4.3(见书104页)所示。进行定点补码两位乘法运算需注意如下问题:4.2.4
补码两位乘法(1) 判别位。乘数的判别位涉及其附加位和符号位。在乘数的最低位后,一定要增加一位附加位。定点补码两位乘法是从判别乘数的最低两位与附加位的组合值开始的。而乘数的符号位要视数值部分的位数来决定。若数值部分的位数为偶数,则必须采用2位符号位;否则,就采用1位符号位。这就是说,乘数的数值部分连同符号位要保证为偶数。实际上,我们所使用的计算机,一般地说,其字长均为偶数,因此,若乘数的位数(包括1位符号位)为计算机的字长,符号位取1位即可。加法操作的次数。定点补码两位乘法运算所做加法操作的次数为乘数的位数(包括符号位)除以2的值。被乘数的符号位。可采用2位符号位或3位符号位,视情况而定。符号位扩展。在进行定点补码两位乘法运算中,在进行右移2位操作时,要注意符号位的扩展,即右移时符号要一起移,空出的符号位以符号的原值填充。最后一步的移位。视乘数的符号位而定。若符号位为2位,则不用移位;若符号位为1位,则要进行右移1位的操作。【例4.23】设X=-1101,Y=-0101,用补码的两位乘法求Z=X*Y。解:[X]补=11.0011,[-X]补=00.1101,[Y]补=11.1011采用2位符号位,[X*Y]补的补码两位乘法运算过程如下:最后一步组合值为0,应加0,没有在运算步骤中列出,也不用移位,故运算结果为:[X*Y]补=00.01000001所以Z=X*Y=+10000014.3
定点除法及其实现4.3.1 定点原码除法与乘法运算类似,原码除法的结果是两个正数相除的结果,结果的符号是两个数的符号位的异或值。在进行定点数除法时,只考虑被除数小于除数的情况,因为在这种情况下,商的小数点就在最左边1位有效数字的前面,操作规范。本小节介绍除法的两种方法。1.恢复余数法我们先从手算除法的例子说起。设被除数X=1011,除数Y=1101,求Z=X÷Y。其运算过程为:X除以Y的结果,商为0.1101,余数为0.0111×2-4,商的符号位为0。可以看出,手算除法的过程,就是不断地比较除数和被除数(第一次是被除数X,以后是上次余数Ri的两倍2Ri)的过程。若2Ri>Y,则够减,商1;若2Ri<Y,则不够减,商0(若X<Y,则第一次就比较2X与Y),直至除尽(余数为0)或除到符合要求的商的位数为止(有余数)。计算机如何判断够减不够减呢?它是先做减法,即2X或2Ri+(-Y)补,如果余数为正,说明够减,就商1;如果余数为负,说明不够减,就商0。这时本来不够减而减了,所以要把除数再加回去,恢复成原来的余数,因此本方法称为“恢复余数法”。恢复余数法的运算规则如下:(1) 从被除数减去2n-1倍除数,如果第一次余数为正,则除法溢出,停止运算;如果第一次余数为负,表示除法不溢出。当余数为负时,将2n-1倍除数加到余数上,以恢复原来余数,然后减去2n-2倍的除数。如果余数为正,表示够减,商为“1”;如果余数为负,表示不够减,商为“0”。并需要恢复余数。重复第(2)步,一直做到余数减去20为止,计算结束。下面用具体例子进行运算来说明。【例4.24】设X=1011,Y=1101,用恢复余数法求Z=X÷Y。解:[-Y]补=110011,除法过程如下:所以,结果是:商D=0.1101,余数R=0.0111。2.加减交替法恢复余数法进行除法运算的缺点是不能预先知道商0还是商1,因而运算步骤不能预先确定,这样会使控制设备复杂化。加减交替法就克服了这一缺点,加减交替法是在恢复余数法的基础上发展而来的,是对恢复余数法的一种改进,应用很广。加减交替法的运算步骤是固定的,它的运算规则如下:商的符号位单独处理,由ZS=XS YS求得。被除数与除数同符号,被除数减去除数;被除数与除数异号,被除数加上除数。余数与除数同符号,上商“1”,余数左移一位,下次减除数,得到新的余数;余数与除数异号,上商“0”,余数左移一位,下次加除数,得到新的余数。重复第(3)步,共做n次(n为除数的位数),除法结束。下面举两个例子,说明用加减交替法求两定点原码数的除法。【例4.25】设X=1011,Y=1101,用加减交替法求Z=X÷Y。解:加减交替法中经常要加除数,减除数。减除数Y,就是加[-Y]补,[-Y]补=110011。运算过程如下可见,得到同样结果:D=0.1101,余数R=0.0111。说明:如果最末一位商为0,则要在负余数上加上除数才是真正的余数。本题中,商到第3位时,商为0,此时真正的余数应为111101+1101,即1.010。【例4.26】设X=00101011,Y=0110,用加减交替法求Z=X÷Y。解:[-Y]补=11010,运算过程如下:结果是:商D=0.0111,余数R=0.0001。实现原码加减交替除法的逻辑结构框图表示于图4.5中。图4.5原码加减交替除法逻辑结构框图与补码乘法类似,也可以用补码完成除法操作,即用[X]补÷[Y]补直接求得[X/Y]补。补码除法的规则要比原码除法的规则复杂一些。由于加减交替法运算除法其操作步骤整齐划一,因此定点补码除法经常使用加减交替法。4.3.2
定点补码除法当除数和被除数用补码表示时,判别是否够除,就不再是简单地用被除数(余数)减去除数,而是要比较它们的绝对值的大小。因此,若两数同符号,要用减法;若两数符号相异,则要用加法。对于判断是否够减,及确定本次上商1还是上商0的规则,都要区分是正除以正、负除以负、正除以负以及负除以正等不同情况进行处理。第三,结果商的符号,与数值位上商过程有关,商为正时,商的每一位上的值与原码表示一致,而当商为负时,商的各位应是补码形式的值,很难直接判断。在计算机中,往往是先按各位的反码值上商,除完后,再用在最低位上加1的办法求出正确的补码值。补码除法的运算规则如下:如果被除数与除数同号,求商时,用被除数减去除数;若两数异号,则用被除数加上除数的办法处理。若余数与除数同号,上商1,左移一位后下次作余数减除数操作;若余数与除数异号,上商0,左移一位后下次作余数加除数操作。商的符号是在第一次试算时求出的,若定点除不溢出,得到的就是正确的符号位的值。(4) 商的修正问题。在对精度要求不高时,将商的最低一位恒置1。此时最大误差为|2-n|。若对商的精度要求较高时,可对n位数求商n+1次,按得到的不同结果对商进行修正。当商为负时,要在商的最低一位加1,从反码的结果得到商的正确的补码值。下面给出一个补码除法运算的实例。【例4.27】设X=-1001,Y=+1101,用补码除法求Z=X÷Y。解:[X]补=110111,[Y]补=001101,[-Y]补=110011,运算过程如下:运算结果: 商的补码[q]补=110101,余数的补码[r]补=110010;商q=-1011,余数为r=-1110。【例4.28】设X=+1011,Y=+1101,用补码加减交替除法求Z=X÷Y。解:[X]补=001011,[Y]补=001101,[-Y]补=110011,运算过程如下:运算结果:商的补码[q]补=001101,余数的补码[r]补=000111;商q=+1101,余数为r=+0111。4.4
浮点数的算术运算4.4.1 浮点数的补码加法运算运算在浮点数中,阶码和尾数有时都用补码表示。两浮点数进行加减,首先要看两数的阶码是否相同,也就是小数点位置是否对齐。若两数的阶码是相等的,表示小数点是对齐的,就可进行尾数的加减。反之,若两数的阶码不等,表示两数小数点的位置没有对齐,此时必须使两数的阶码相等,这个工作称为“对阶”。对阶完后,才能进行两尾数的加减运算。运算结果可能不是规格化的数,为了保证运算精度,需要对运算结果进行规格化处理。而在对阶和规格化的过程中,可能有数码丢掉,为了减少误差,还需要进行舍入处理。总之,要完成浮点数的加减运算,应按如下三步进行:对阶。方法是,小阶向大阶看齐,阶码较小的数的尾数每向右移1位,该数阶码便加1,直到两数的阶码相同为止。对阶时要进行舍入处理。尾数求和。尾数连同符号相加。规格化。若进行右规,还需要进行舍入处理。下面以具体例子说明。【例4.29】有两个浮点数A=210(-0.110100),B=2100(+0.101011),求A+B=?解:(1) 对阶先把A.B两数用补码表示:[A]补=00.010;11.001100[B]补=00.100;00.101011可以看出,[A]补的阶码小,应向[B]补阶码看齐,[A]补阶码增2,尾数向右移2位。尾数求和11110011+ 00101011100.011110规格化上述结果为: A+B=2100×(+0.011110)这是一个非规格化的数,对上述结果规格化,即进行左规:尾数向左移1位,阶码减1。得到最后结果:A+B=2011×(+0.111100)(4) 舍入处理舍入处理不是对每一个题目都是必须的,主要看在对阶和右规格化尾数向右移位时,尾数的低位部分有否被丢掉。常用的舍入方法有两种:一种是“0舍1入”法,即如果右移时被丢掉的数位的最高位为0,则舍去;反之则将尾数的末位加“1”。另一种是“恒置1”法,即只要有数位被移掉,就在尾数的末位恒置“1”。浮点数乘法的运算规则是:乘积的尾数是相乘两数的尾数之积,乘积的阶码是相乘两数的阶码之和。结果也要进行规格化和舍入处理。如有两个浮点数X和Y:X=2ex·SxY=2ey·Sy则Z=X×Y=2(ex+ey)·(Sx×Sy)在具体实现中,两数阶码的求和运算可在阶码加法器中进行,两个尾数的乘法运算就是定点数的乘法运算。4.4.2
浮点数的乘法运算浮点数除法的运算规则是:商的尾数是相除两数的尾数之商,商的阶码是相除两数的阶码之差。结果也要进行规格化和舍入处理。如有两个浮点数X和Y:X=2ex·SxY=2ey·Sy则Z=X÷Y=2(ex-ey)·(Sx÷Sy)在具体实现中,两数阶码的相减运算可在阶码加法器中进行,两个尾数的除法运算则与定点数的除法运算相同。4.4.3
浮点数的除法运算综上所述,浮点数的算术运算比定点数的算术运算要复杂许多,从运算器的结构来说,不但要有尾数运算器,而且还要有阶码运算器。阶码运算器用来求阶差、修改阶码等,一般只进行加减运算。而尾数运算器不但要有加法器用以求和,还应有左移和右移的功能,以实现对阶操作和规格化操作。关于浮点运算器的一般结构,将在本章的最后小节进行介绍。前面已经介绍,中央处理器由运算器、控制器、总线和时钟等部件组成。图4.6表示了中央处理器CPU的简图,该图的右半部分为运算器,左半部分为控制器。运算器是计算机对数据进行加工处理的中心,它主要由算术逻辑单元ALU、通用寄存器组、状态寄存器、数据多路选择器MUX等组成。4.5
运算器的组成和结构图4.6中央处理器CPU简图ALU的主要功能是对二进制数据进行算术运算、
逻辑运算和各种移位操作。算术运算包括定点加、减、乘和除的运算;逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非操作;移位操作主要完成逻辑左移、逻辑右移、算术左移、算术右移及其他一些移位操作。在某些机器上ALU还要完成数值比较、变更数值符号、计算操作数在存储器中的地址等工作。4.5.1
算术逻辑单元ALUALU能够处理数据的位数和机器的字长有关,如Z80微处理器的ALU是8位;286以前的PC机,ALU是16位;386.486和奔腾微机,ALU是32位。通常字长越长,运算的速度就越快。现在市场上提供一种型号为AM29332的32位ALU,其操作数从输入到结果输出,只需要几十纳秒(ns)时间。图4.6右半部分运算器中的ALU就是算术逻辑部件。从图中可以看出,它有两个数据输入端A和B,一个数据输出端Y。输入输出数据的宽度与ALU处理的数据宽度相同。ALU一般具有A+B.A-B.B-A等算术运算功能,A.OR.B.A.AND.B.A.XOR.B等几种逻辑运算功能,还有左移、右移的功能。74181是一种典型的4位ALU器件。图4.7是74181的电路图,图4.8示出了用正逻辑和负逻辑表示的4位ALU74181的方框图。表4.4(见书114页)是74181的运算功能表。图4.7
74181的电路图图4.8
74181
ALU的方框图近代计算机的运算器中都有一组通用寄存器,它的主要用途是保存参加运算的操作数和运算的结果。寄存器是计算机中存取速度最快的存储器件,寄存器的存取周期一般是十几个纳秒,远远快于内存储器的存取周期,如果ALU的两个操作数都来自于寄存器,可以极大地提高运算速度。这也就是为什么近代计算机都有一组相当数目的通用寄存器的道理。4.5.2
通用寄存器组通用寄存器同时还可以兼作某些指令的专用寄存器。例如,IBMPC系列微型计算机中,其CPU有8个16位的通用寄存器,其结构如图4.9所示。这8个16位寄存器,除作通用寄存器使用外,有的还有各自专门的用途,如BX寄存器,在作变址运算时,又可作为基地址寄存器使用;CX寄存器又作为计数器使用。例如MOVS指令,它就是把存储器的某一段中的内容传送到存储器的另一段中去,源地址指针由SI寄存器指出,目的地址指针由DI寄存器指出,传送的字节数由CX寄存器指出。图4.9
IBM
PC系列微型计算机的通用寄存器组在运算器中,都有一个记录运算结果状态的状态寄存器(有的称标志寄存器或状态标志寄存器、条件码寄存器),一般设置下面几种标志状态位:Z(零标志位)。当运算结果为零时,Z位置1;结果非零时,Z位清0。N(符号标志位)。当运算结果为负时,N位置1;结果为正时,N位清0。V(溢出标志位)。当运算结果有溢出发生时,V位置1;无溢出时,V位清0。4.5.3
状态寄存器C(进位或借位标志位)。当作加法时,如果运算中最高有效位向前有进位,C位置1;否则C位清0。当作减法运算时,如果不够减,最高位向前有借位时,C位置1;否则C位清0。有的机器还有其他一些标志位,视不同的机器不同功能而有不同的规定。在程序设计中,状态标志位通常作为转移指令的判断条件。一台计算机的各个功能部件要互相连接,信号要能够顺利传送,被传送的信号包括数据和控制信号两大类。图4.6所示的CPU的各功能部件之间的连接方法是原理性的,仅简单地表示了数据信号的发送与接收的关系,而且省略了控制信号,实际上,控制器部件中的由操作命令产生部件产生的所有命令都必须连接到被操作部件。我们通常把从一个功能部件向另一个功能部件传送数据所经过的功能部件、总线等称为数据通路。数据通路是个很重要的概念,正确理解数据通路,能帮助我们理解指令执行过程,也就是计算机总体运行过程。4.5.4
数据通路下面以图4.6所示的右半部分运算器为例,解释其数据通路,进而说明运算器的工作过程。图中,MUX1.MUX2分别是两个多路数据选择器,用它们来选择当前哪两组数据送到ALU中。MUX1数据有三个来源:通用寄存器的输出、指令中的相对位移量和常数“0”;MUX2数据也有三个来源:通用寄存器的输出、程序计数器的输出和数据寄存器的输出。ALU的输出信息通过内部数据总线送到通用寄存器中。假设这个通用寄存器组有两个输出端口RA和RB,有一个输入端口RI。寄存器中的数据以补码表示。并假设寄存器组中的寄存器1用R1表示,寄存器2用R2表示,寄存器3用R3表示。运算之前,R1=0110,R2=1100,Z、N、C.V标志位全为0。进行下面的操作后,标志位Z、N、C.V和R3的值如何?(1) 第一种操作:R1加R2,结果送R3。其操作过程如下:R1的内容通过端口RA输出,MUX1选择RA的内容送到ALU的A输入端;R2的内容通过端口RB输出,MUX2选择RB的内容送入ALU的B输入端。令ALU作A+B算术加法操作,从Y输出端输出加的结果,并存入R3寄存器中。运算结果R3=0010,标志位C由0变为1,其他标志位不变。(2) 第二种操作:0减R1,结果送R3,即求与R1相补的数。其操作过程如下:R1的内容从RB输出,经过MUX2选择,送到ALU的B输入端,在MUX1处选择常数“0”送入ALU的A输入端,在ALU中选择A-B的算术运算功能。由于运算器要进行的是补码运算,A-B功能是通过[A]补+[-B]补来完成的。结果1010从ALU的Y输出送入R3。由于结果为负,N标志位由0变1,其他标志位不变。(3)第三种操作:利用运算器计算操作数地址或转移地址。假设当前执行转移指令,转移地址由程序计数器的值加上相对位移量得出。运算器计算转移地址的过程是:MUX2选择程序计数器PC的内容送往ALU的B输入端,MUX1选择指令字中的相对位移量到ALU的A输入端,令ALU做A+B算术加运算,从Y输出的内容送往程序计数器PC中,这时PC中就为转移地址了。下次执行指令就从转移地址开始执行。(4) 第四种操作:关于移位操作。①算术右移所有的位向右移一位,最低位被移出,最高位保持不变。移位后的结果是原数的1/2。如果右移n位,则移位后的结果是原数的(1/2)n。②算术左移所有的位向左移一位,最高位被移出,最低位由0填充。移位后的结果(如果没有溢出发生)是原数的2倍。如果左移n位,又没有溢出发生,则移位后的结果是原数的2n倍;若有溢出发生,则移位后的结果数据不定。③逻辑右移所有的位顺序向右移一位,最低位被移出,最高位由0填充。结果与算术右移不同。④逻辑左移所有的位顺序向左移一位,最高位被移出,最低位由0填充。逻辑移位没有溢出问题。⑤循环右移所有的位顺序向右移一位,最高位由最低位循环移入。⑥循环左移所有的位顺序向左移一位,最低位由最高位循环移入。循环移位是头尾相连接的移位,有的机器还有带状态标志位的循环移位,如带进位位的循环右移和循环左移的示意图如下。【例4.30】把R2的内容1100算术右移一位后放入R3中。操作过程是:R2的内容从RA输出,通过MUX1进入ALU的A输入端,ALU选择向右移一位的操作,ALU的输出端Y就是R2右移1位后的内容,为1110。因为R2原来的数是负数,右移后应保持符号位不变。最后把1110送入R3中。运算器包括算术逻辑部件ALU、通用寄存器组、累加器、状态寄存器、多路开关、数据总线等。运算器的设计主要围绕ALU和寄存器同数据总线之间如何传送操作数和运算结果而进行的。在决定方案时,需要考虑数据传送的方便性和操作速度。在微型机中还要考虑总线在硅片上的制作工艺。现代计算机的运算器大体上有三种结构形式。简述如下。4.5.5
运算器的基本结构1.单总线结构的运算器运算器所有部件都接到同一条总线上的运算器结构是单总线结构的运算器,如图4.10所示。这种结构的运算器,数据可以在任何两个寄存器之间,或者在任一个寄存器和ALU之间传送。在同一时间内,只能有一个操作数放在总线上。为了把两个操作数输入到ALU,需要分两次传送,而且还需要两个数据缓冲寄存器A.B。图4.10单总线结构的运算器例如要执行一次加法操作,需要先把第一个操作数放入A缓冲器,然后再把第二个操作数放入B缓冲器,只有当这两个操作数同时出现在ALU的两个输入端,ALU才能执行加法操作。当加法结果出现在单总线上时,由于输入数已保存在缓冲寄存器中,它并不会对输入数据产生影响。当再来一个传送命令后,单总线上的加法结果便送到目的寄存器中。由此可见,这种结构的运算器主要缺点是操作速度较慢。虽然在这种结构中输入数据和操作结果需要三次串行的选通操作,但它并不会对每种指令都增加很多执行时间。例如,有一个输入数是从存储器来的,且运算结果又送回存储器,那么限制数据传送速度的主要因素是存储器的访问时间。只有在对全都是CPU寄存器中的两个操作数进行操作时,单总线结构的运算器才会造成一定的时间损失。但是由于它只控制一条总线,故控制电路比较简单。2.双总线结构的运算器双总线结构的运算器如图4.11所示。在这种结构中,两个操作数同时加到ALU进行运算,只需要一次操作控制,而且马上可以得到运算结果。从图中可以看出,两条总线各自把其数据送到ALU的输入端。特殊寄存器分成两组,它们分别与一条总线交换数据,这样,通用寄存器中的数就可以进入到任一组特殊寄存器中去,从而使数据传送更灵活。ALU的输出不能直接加到总线上,必须在ALU的输出端设置一个缓冲寄存器。整个操作分两步完成:第一步,在ALU的两个输入端输入操作数,形成结果并送入缓冲寄存器;第二步,把结果送入目的寄存器。图4.11双总线结构的运算器3.三总线结构的运算器三总线结构的运算器如图4.12所示。在三总线结构运算器中,ALU的两个输入端分别由两条总线供给,而ALU的输出则与第三条总线相连。这样,算术逻辑操作就可以在一步的控制之内完成。由于ALU本身有时间延迟,所以,打入输出结果的选通脉冲必须考虑到包括这个延迟。另外设置了一个总线旁路器。如果一个操作数不需要修改,而直接从总线2传送到总线3,那么可以通过控制总线旁路器把数据传出;如果一个操作数传送时需要修改,那么就借助于ALU。很显然,三总线结构的运算器的特点是操作时间快。图4.12三总线结构的运算器1.最简单的运算器图4.13示出了一个最简单的运算器的组成结构图。这个运算器只有三个逻辑部件:算术逻辑运算单元ALU、累加寄存器AC和数据缓冲寄存器DR。4.5.6
运算器组成实例图4.13最简单的运算器运算器和存储器之间通过一条双向数据总线进行联系。我们举一个两个数相加的例子来说明。两个数相加进行加法操作,首先从存储器中取出第一个数,经数据缓冲器DR送至累加器AC;然后再从存储器取出第二个数,放在数据缓冲器中。两个数同时送算术逻辑运算单元ALU进行相加,相加后的结果又送回到累加寄存器AC中。此时,AC中的原先放入的第一个数随即被冲掉。如果要把求和结果存入存储器,那么数据就由AC送至缓冲寄存器DR,再由DR发送至双向数据总线,然后写入存储器。2.一台小型机的运算器图4.14示出了一台小型机的运算器逻辑框图。该运算器的基本功能包括:两数的加减运算,一个数的加1运算,两数的逻辑加运算,一个数的变补、变反传送以及数码的左移、右移、直送和字节交换等操作。图4.14某小型机的运算器框图该运算器由以下几部分组成:算术逻辑运算单元ALU由4片74181ALU芯片和1片74182CLA(CarryLookaheadAdder,先行进位加法器)芯片组成16位字长的运算部件,因而具有两级先行进位。锁存器在ALU的两个输入端上有两个锁存器A和B,用来暂存来自外部设备或存储器(经数据总线)的数据,或者暂存来自通用寄存器(R0~R7)和源寄存器、暂存寄存器中的数据。一旦数据放入锁存器,不管其外部的数据如何变化,ALU将依据锁存器A和B中的数据进行运算。(3)移位寄存器将ALU的输出进行左移、右移、直送、半字交换。因此这里的移位寄存器也是一个4选1的多路开关,每次只能从4路输入中选择1路进行输出。(4) 寄存器组寄存器组包括8个可由程序编址的通用寄存器(R0~R7)和两个程序不能访问的工作寄存器(源寄存器SR和暂存寄存器DR)。通用寄存器可作为累加器使用,它们的数据经锁存器A和B进入ALU,再经移位寄存器输出可以送至通用寄存器;也可以经三态发送门送至数据总线,再由数据总线送至存储器或外部设备,从而实现数据的输出操作。反之,来自外部设备或存储器的数据,经过总线接收门送至锁存器,再经ALU和移位器,送到通用寄存器,从而实现数据的输入操作。由于有双操作数指令,即一条指令中同时有源操作数和终点操作数,因此在执行指令时,必须两次计算操作数地址和两次从存储器取操作数。源操作数从内存经数据总线取出来后,不能放到锁存器A或B中,因为可能马上要使用数据通路(包括锁存器A和B)进行第二个操作数地址的寻址计算,故必须设置一个程序上看不见的“源寄存器”以暂存源操作数。只有终点操作数取出来后,才能从源寄存器中读出源操作数,送至锁存器和ALU进行运算。暂存寄存器用来暂存ALU计算出来的计算结果数据,以等待数据总线传送出去。计算结果出来后,CPU就申请总线的控制权,当取得总线控制权后,才能把暂存寄存器中的数据经数据通路和发送门,发送至数据总线上。应注意,在某一时刻,寄存器组的10个寄存器中只有一个寄存器可与数据通路发生联系。至于是哪个寄存器被连接到数据通路,则由控制器发出的寄存器地址加以确定。(5)状态寄存器运算器中设有一个状态寄存器,运算过程中产生的“进位”、“溢出”、“零”、“负”等状态标志可以保存在这个寄存器中,以供程序判断之用。状态寄存器的状态数据也可经由数据总线送到存储器加以保存。典型的浮点运算器有Intel公司在1980年研制出的8087,1983年推出的80287,1987年推出的80387等。由于这些浮点运算器必须和主处理器配对使用,故常常称它们为协处理器。8087是与微处理器8086/8088配对使用的协处理器,80287是与微处理器80286/80386配对使用的协处理器,80387则是与微处理器80386配对使用的协处理器。本节主要介绍功能较强的80387协处理器。4.6
浮点运算器80387是在80287的基础上扩展了三角函数的功能而制成的高性能的协处理器。它的主要特性如下:具有高性能的80位的体系结构。时钟频率较高,一般工作频率为16MHz,改进后可达20MHz。可执行IEEE754标准的浮点运算。能处理7种数据类型,这7种数据类型如表4.5(见书124页)所示。4.6.1
80387的主要性能(5) 可在386/486微机系统的两种模式下工作。①实模式。是把80386微处理器当作高速的8086来使用,即使用24位地址中的低20位,可用的存储空间是1MB。②保护模式。可使用16MB的主存空间,支持虚拟存储器的管理与运行,充分发挥80386的效能。(6)扩展了80386/80486的硬件指令。80387的主要指令包括数据传送类指令的取数、存数、交换指令,算术运算类指令的加、减、乘、除、反减、反除、换算、求余、取整、变符号、取绝对值、开平方、分解实数等指令,比较类指令的比较、检测、测试指令,超越函数(正切、反正切、2x-1、Y·log2(X+1)、Y·log2(X)),常数(0、1、π、lg2.log210、log2e),处理器控制类指令的取控制字、存控制字、存状态字、取环境、存环境、保护、恢复、允许中断、禁止中断、消除事故、初始化等指令,以及三角函数指令等。(7) 能检测出数据运算的6种错误:非法处理、非法操作数、零作除数、上溢、下溢和精度下降。80387的内部结构与80287、8087基本相同,都含有8个80位的寄存器堆栈、3个16位的寄存器(用作控制字寄存器、状态字寄存器和特征字寄存器)和2个32位寄存器(用作指令指针和数据指针)。分别简述于下。1.寄存器堆栈寄存器堆栈中有8个80位的寄存器,这8个寄存器是一个整体,头尾相接,组成一个能容纳8个临时浮点数的先进后出的堆栈。4.6.2
80387的内部结构8个寄存器的编号为0~7,处于栈顶的寄存器称为栈顶寄存器,其编号由状态寄存器的TOP字段给出。在协处理器的指令中,用ST表示栈顶寄存器,而用ST(i)访问相对于栈顶寄存器的偏移量为i的寄存器。应注意i是相对于栈顶的偏移量,而不是8个寄存器中的实际编号。例如,当栈顶为0号寄存器时,寄存器正好用ST(1)~ST(7)表示;而当栈顶为5号寄存器时,则ST(1)~ST(7)分别表示寄存器6.7、0、1、2、3、4,如图4.15所示。图4.15寄存器栈顶的表示方法2.特征字寄存器特征字寄存器是个16位的寄存器,每两位表示寄存器栈的一个寄存器状态。共有8个特征字段,每个字段占2位,可有4种取值。00——表示相应寄存器中有正确的数据。01——表示相应寄存器中的值为0。10——表示相应寄存器中的数据非法或无限大。11——表示相应寄存器处于空状态。特征字寄存器的内容允许用户读写。3.控制字寄存器控制字寄存器也是个16位的寄存器,用于控制协处理器的内部操作。各位的含义是:IM——该位为1,屏蔽非法处理中断。DM——该位为1,屏蔽非法操作数中断。ZM——该位为1,屏蔽0作除数中断。OM——该位为1,屏蔽上溢中断。UM——该位为1,屏蔽下溢中断。PM——该位为1,屏蔽精度下降中断。PC——2位,用于表示寄存器栈运算结果的精度,该2位的取值00表示24位尾数;01未用;10表示53位尾数;11表示64位尾数。RC——2位,用于浮点数转换为整数时的舍入控制,该2位的取值00表示转换为最接近的值,若无奇偶限制,则转换为偶数;01舍掉小数部分;10表示小数部分按整数1处理;11表示靠近0值方向舍入。IC——1位,用于对无限大的数值的处理,该位为0时,把+∞和-∞作同值处理;该位为1时,把+∞和-∞作不同值处理。4.状态字寄存器状态字寄存器也是个16位的寄存器,用于表示协处理器的处理情况。各位的含义是:IE——该位为1,表示非法处理。DE——该位为1,表示非法操作数。ZE——该位为1,表示0作除数。OE——该位为1,表示发生了上溢。UE——该位为1,表示发生了下溢。PE——该位为1,表示精度下降。以上6位统称为异常中断允许标志位,当某位为1,且控制字的对应位又为0时,协处理器将产生相应的中断信号。ES——用来反映上述6种异常中断允许标志位的情况。该位为1,表示发生了某种异常中断;为0,表示未发生异常中断。C3C2C1C0——该4位用来保存数据比较等指令的结果,用于条件转移。TOP——3位,用来表示寄存器栈顶的寄存器编号。B——为忙标志位,该位为1时,表示协处理器正在执行一条指令;为0时,表示其空闲。1.80387的硬件特性80387的硬件特性可归纳为如下几点:80387采用1.5μm的高速CHMOS工艺制作,有68个引脚,采用PGA封装,速度快,功耗低。具有84位宽度的内部数据通路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天麻订购合同范本
- 视频兼职合同范本
- 相机购销合同范本
- 平台维护服务合同范本
- 2024【个人鱼塘承包合同范本】个人承包工地合同范本
- 2024年度建筑合同:多功能体育场馆设计与施工总承包合同
- 二零二四年度设备租赁服务合同:比亚迪弗迪设备租赁协议
- 2024版沉井施工风险管理与应急处理合同
- 2024年麻毛圣诞节装项目可行性研究报告
- 2024年硅藻土制品项目可行性研究报告
- 冷缩电缆附件
- 护理人力资源管理(课堂PPT)
- 工程地质及水文地质:6 地下水的运动
- 生物安全应急处置演练记录
- 酒店企业员工消防防火安全知识培训
- 台车司机(理论)试题及答案
- 教案(餐巾折花)
- 医院装修工程量清单
- 最新四川省教师资格认定体检表.docx
- 球形网架结构的吊顶施工做法
- 起重机轨道修理施工方案
评论
0/150
提交评论