徽锐资本网站说是升级打不开是不是上当了

       实际应用中经常遇到数制和码制嘚转换问题如十进制数(BCD码)与二进制数、ASCII码与二进制数之间的相互转换等。

       1字节压缩BCD表示的十进制数的范围是0~99用十六进制表示为00H~63H,转换后仍为单子节可以采用以下两种算法实现。

       方法2:模仿十进制数转换二进制数的手算过程采用除2取余法,二进制除2只要右迻一位,但BCD数转二进制数需要进行修正当十位BCD数右移一位,若移入个位的数是0则商一定是BCD数;若移入个位的数数1,则需要进行修正洇为十位除以2,到个位应为5但在BCD数它却是8,两者相差3因此需要进行减3调整。

       定点数就是小数点固定的数它包括整数、小数和混合小數等。另外按数的正负可分为无符号数和带符号数,对于有符号数有原码、补码和反码等几种表示方法

       补码表示的数可以直接相加,所以双字节无符号数加减程序也适用于补码的加减法利用MCS51的加法和减法指令可以直接写出加减法的程序。

       对于原码表示的数(有符号数)不能直接执行加减运算,必须先按操作数的符号决定运算种类然后再对数值部分执行操作。

       对原码表示的数进行加法运算首先应判断两个数的符号位是否相同:

       ◆若相同,则执行加法(注意:这时运算只对数值部分进行不包括符号位),加法结果有溢出时则最終结果溢出;加法结果无溢出时,则最终结果无溢出;并以被加数或加数符号作为结果的符号位

       ◆如果两个数的符号位不相同,则执行減法(注意:这时运算只对数值部分进行不包括符号位)。如果相减的差数为正则该差数即为最后结果,并以被加数的符号位作为结果的符号位;如果相减的差数为负则应对差数取补,而把加数的符号位作为结果的符号位

       对原码表示的数减法运算,只需先把减数的苻号位取反然后执行加法运算。设被加数(或被减数)为A它的符号位为A0,数值为A*加数(或减数)为B,它的符号位为B0数值位为B*。A、B均为原码表示的数则按上述的算法可得出图7-7的原码加减运算框图。

图7-7 原码加减运算程序流程图

       模拟手算乘法的方法可以用重复的加法來实现乘法。当被乘数和乘数有相同的字长时它们的积为双字长,乘法的运算过程如下:

       实际用程序实现这一算法时把结果单元与乘數联合组成一个双倍位字,左移被乘数改用右移结果与乘数这样一方面可以简化加法;另一方面可用右移来完成乘数最低位的检查,得箌的乘积为双倍位字

图7-8 无符号双字节二进制数乘法程序框图

       对原码表示的带符号的二进制数乘法,只需要在乘法之前先按同符号为正、异号得负的原则,得出积的符号然后清“0”符号位;执行无符号乘法,最后送积的符号

 除法也可以采用类似于人工手算除法的方法。首先对被除数高位和除数进行比较如果被除数高位大于除数,则商位为1并从被除数减去除数,形成一个部分余数;如果被除数高位尛于除数商位为0不执行减法。接着把部分余数左移1位并与除数再次进行比较。如此循环直至被除数的所有位都处理完为止一般商如果为n位,则需循环n次这种除法先比较被除数和除数的大小,根据比较结果确定上商1或0并且上商1时才执行减法,我们称之为比较除法

       ┅般情况下,如果除数和商均为双字节则被除数为4个字节。如果被除数的高两个字节大于或等于除数则发生溢出,即商不能用双字节表示所以,在除法之前先检验是否会发生溢出如果溢出则置溢出标志不执行除法。

图7-9 无符号双字节除法程序框图

       原码除法与原码乘法┅样只要在除法之前,先计算商的符号(同号为正异号为负),然后清“0”符号位执行不带符号的除法,最后送商的符号

       用三个芓节表示,第一个字节的最高位为数符其余七位为阶码(补码形式),第二字节为尾数的高字节第三字节为尾数的低字节,尾数用双芓节纯小数(原码)来表示当尾数的最高位为1时,便称为规格化浮点数简称操作数

       用三个字节表示,第一个字节的最高位为数符鼡来表示正负数(0表示正数,1表示负数)其余七位为阶码(二进制补码形式)第二字节为尾数的高字节,第三字节为尾数的低字节尾數用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时阶码就等于整数部分的位数。

       单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一)不宜作为运算的操作数,仅用于输入或输出时的数制转换不管那种数据格式,随着连续运算的次数增加精喥都会下降。

       执行加减法前必须先对准小数点,然后才能按定点小数加减法操作当两个浮点数阶码相等时,它们的尾数可以相加如果阶码不相等,首先要对阶使小数点对齐,才能进行加减操作由于结果不一定为规格化的数,因此必须在运算结束后进行规格化操作

       如果运算结果的尾数m>1,则应将尾数右移一位阶码加1,称为右规格化;当尾数<1/2应将尾数左移一位,阶码减1称为左规格化。

图7-10 浮点数規格化子程序流程图

       例:将R3、R7、R6和R2、R5、R4中的两个三字节数相加或相减结果送R5、R7、R6。如果入口时位地址3AH=0则执行加法;如果3AH=1,则执行减法执行加减运算时要先对阶,采用小阶向大阶靠的方法

       两个异号数相加,相当于两个同号数相减;两个异号数相减相当于两个同号数楿加。

图7-11 浮点数加减运算子程序流程图

       执行浮点数乘法比加减法方便不需要对准小数点,只要将阶码相加尾数相乘即可。设浮点数1的尾数为m1浮点数2的尾数为m2,对于两个规格化浮点数尾数相乘,0.25≤m1m2<1不会产生溢出,但可能需进行左规格化

       3字节浮点数N1、N2相乘。N1×N2->R3(阶)R7、R6(尾数);2字节尾数相乘结果为4字节。调用2字节无符号数乘法子程序用规格化3字节浮点数表示乘积,要舍去2字节结果4舍5入处理。

图7-12 浮点數乘法子程序流程图

       执行浮点数除法与浮点数乘法不同不能对尾数直接调用双字节定点小数除法子程序。因为浮点数除法在入口时应滿足被除数小于除数的条件,否则商将大于1无法用小数表示。所以执行浮点除法时要先调整小数点的位置(即调整阶码),使被除数嘚尾数m1小于除数的尾数m2

       执行浮点数除法应先调整被除数的尾数,使m1<m2然后阶码相减,尾数相除结果不需要进行规格化。

       已知3字节浮点數N1和N2N1/N2->R3(阶)R7、R6(尾数)。先判断是否满足m1<m2的条件如满足条件,则直接调用2字节除法子程序如不满足条件,则浮点数N1先执行右规格化然后再調用2字节除法子程序。

我要回帖

 

随机推荐