转换程序
实际应用中经常遇到数制和码制的转换问题,如十进制数(BCD码)与二进制数、ASCII码与二进制数之间的相互转换等。
例:将内部RAM 30H中1字节压缩BCD表示的十进制数转换为二进制数,并存入内部RAM的20H中。
1)题目分析
1字节压缩BCD表示的十进制数的范围是0~99,用十六进制表示为00H~63H,转换后仍为单子节。可以采用以下两种算法实现。
2)参考程序
方法1:十位×10+个位
MOV A,30H ;取压缩BCD
SWAP A
ANL A,#0FH ;处理压缩BCD高4位
MOV B,#10
MUL AB ;BCD高4位×10
ANL 30H,#0FH ;取压缩BCD低4位
ADD A,30H
MOV 20H,A ;存结果
SJMP $
方法2:模仿十进制数转换二进制数的手算过程。采用除2取余法,二进制除2,只要右移一位,但BCD数转二进制数需要进行修正。当十位BCD数右移一位,若移入个位的数是0,则商一定是BCD数;若移入个位的数数1,则需要进行修正。因为十位除以2,到个位应为5,但在BCD数它却是8,两者相差3,因此需要进行减3调整。
MOV 20H,#0 ;余数单元清0
MOV A,30H ;取数
MOV R2,#8 ;8位余数
BCD1: CLR C
RRC A ;BCD数除以2
XCH A,20H ;将余数移入20H单元
RRC A
XCH A,20H
JNB ACC.3.BCD2 ;判别高位除以2移入低位,为1则减3修正
CLR C
SUBB A,#3
BCD2: DJNZ R2,BCD1 ;判断移位8位是否结束
MOV 20H,A ;存结果
SJMP $
例:将ASCII码转换为二进制数
1)题目分析
从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变为相应的ASCII码。若4位二进制数大于等于10,则应加上37H。
2)硬件资源分配
入口参数:R2:存转换前ASCII码
出口参数:R2:存转换后的二进制数
3)参考程序
ORG 1000H
L1: MOV A,R2
CLR C
SUBB A,#30H ;ASCII码减30H
MOV R2,A
SUBB A,#0AH
JC LOOP ;该数小于10则返回主程序
MOV A,R2
SUBB A,#07H
MOV R2,A
LOOP: RET
7.5.3 定点数运算程序
定点数就是小数点固定的数,它包括整数、小数和混合小数等。另外,按数的正负可分为无符号数和带符号数,对于有符号数有原码、补码和反码等几种表示方法。
1)双字节数取补子程序
例:将(R4、R5)中的双字节数取补结果送R4、R5
参考程序:
CMPT: MOV A,R5
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
RET
2)双字节无符号数加减程序
补码表示的数可以直接相加,所以双字节无符号数加减程序也适用于补码的加减法。利用MCS51的加法和减法指令可以直接写出加减法的程序。
例:将(R2)(R3)和(R6)(R7)两个双字节无符号数相加,结果送R4、R5。
参考程序:
NADD:MOV A,R3
ADD A,R7
MOV R5,A
MOV A,R2
ADDC A,R6
MOV R4,A
RET
例:将(R2)(R3)和(R6)(R7)两个双字节数相减,结果送R4、R5。
参考程序:
NSUB1:MOV A,R3
CLR C
SUBB A,R7
MOV R5,A
MOV A,R2
SUBB A,R6
MOV R4,A
RET
3)原码加减运算程序
对于原码表示的数(有符号数),不能直接执行加减运算,必须先按操作数的符号决定运算种类,然后再对数值部分执行操作。
对原码表示的数进行加法运算,首先应判断两个数的符号位是否相同:
◆若相同,则执行加法(注意:这时运算只对数值部分进行,不包括符号位),加法结果有溢出时,则最终结果溢出;加法结果无溢出时,则最终结果无溢出;并以被加数或加数符号作为结果的符号位。
◆如果两个数的符号位不相同,则执行减法(注意:这时运算只对数值部分进行,不包括符号位)。如果相减的差数为正,则该差数即为最后结果,并以被加数的符号位作为结果的符号位;如果相减的差数为负,则应对差数取补,而把加数的符号位作为结果的符号位。
对原码表示的数减法运算,只需先把减数的符号位取反,然后执行加法运算。设被加数(或被减数)为A,它的符号位为A0,数值为A*,加数(或减数)为B,它的符号位为B0,数值位为B*。A、B均为原码表示的数,则按上述的算法可得出图7-7的原码加减运算框图。
图7-7 原码加减运算程序流程图
4)无符号二进制数乘法程序
模拟手算乘法的方法,可以用重复的加法来实现乘法。当被乘数和乘数有相同的字长时,它们的积为双字长,乘法的运算过程如下:
◆清“0”部分积。
◆从最低位开始检查各个乘数位。
◆如乘数位为1,加被乘数至部分积;否则不加。
◆左移1位被乘数。
◆步骤(2)~(4)重复n次(n为字长)。
实际用程序实现这一算法时,把结果单元与乘数联合组成一个双倍位字,左移被乘数改用右移结果与乘数,这样一方面可以简化加法;另一方面可用右移来完成乘数最低位的检查,得到的乘积为双倍位字。
例:将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。根据图7-8(a)的算法,可以得到如图7-8(b)所示的双字节乘法程序框图。
(a) (b)
图7-8 无符号双字节二进制数乘法程序框图
5)原码有符号乘法程序
对原码表示的带符号的二进制数乘法,只需要在乘法之前,先按同符号为正、异号得负的原则,得出积的符号,然后清“0”符号位;执行无符号乘法,最后送积的符号。
6)无符号二进制数除法程序
除法也可以采用类似于人工手算除法的方法。首先对被除数高位和除数进行比较,如果被除数高位大于除数,则商位为1,并从被除数减去除数,形成一个部分余数;如果被除数高位小于除数,商位为0不执行减法。接着把部分余数左移1位,并与除数再次进行比较。如此循环直至被除数的所有位都处理完为止。一般商如果为n位,则需循环n次。这种除法先比较被除数和除数的大小,根据比较结果确定上商1或0,并且上商1时才执行减法,我们称之为比较除法。
一般情况下,如果除数和商均为双字节,则被除数为4个字节。如果被除数的高两个字节大于或等于除数,则发生溢出,即商不能用双字节表示。所以,在除法之前先检验是否会发生溢出,如果溢出则置溢出标志不执行除法。
例:将(R2、R3、R4、R5)和(R6、R7)中两个无符号数相除,结果商送R4、R5,余数送R2、R3。
(a) (b)
图7-9 无符号双字节除法程序框图
7)原码表示的有符号双字节除法程序
原码除法与原码乘法一样,只要在除法之前,先计算商的符号(同号为正,异号为负),然后清“0”符号位,执行不带符号的除法,最后送商的符号。
7.5.4 浮点数运算程序
(1)浮点数的表示
1)二进制浮点数操作
用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数
2)十进制浮点数操作
用三个字节表示,第一个字节的最高位为数符,用来表示正负数(0表示正数,1表示负数)其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数。
例如:156.6 的阶码是03H,-156.6 的阶码是 83H ;
当十进制数的绝对值小于 1 时,阶码就等于 80H 减去小数点后面零的个数。
例如 :0.00362的阶码是 7EH ,-0.00362 的阶码是 0FEH 。
例如:有一个十进制浮点操作数存放在30H、31H、32H中,数值是-0.07315,即-0.7315 乘以10 的-1 次方,则阶码为7FH,若加上数符(30H)=0FFH,31H=73H,(32H)=15H 。
3)运算精度
单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。
(2)浮点数加减法子程序
执行加减法前,必须先对准小数点,然后才能按定点小数加减法操作。当两个浮点数阶码相等时,它们的尾数可以相加。如果阶码不相等,首先要对阶,使小数点对齐,才能进行加减操作。由于结果不一定为规格化的数,因此必须在运算结束后进行规格化操作。
如果运算结果的尾数m>1,则应将尾数右移一位,阶码加1,称为右规格化;当尾数<1/2,应将尾数左移一位,阶码减1,称为左规格化。
例:3字节浮点数通用规格化子程序
1)题目分析 子程序功能为:
CY=0 执行右规格化
CY=1 执行左规格化
F0=0 对浮点数1:R3(阶)R7、R6(尾)进行右移一位
F0=1 对浮点数2:R2(阶)R5、R4(尾)进行右移一位
2)硬件资源分配
R7、R6:浮点数1的尾数,R3:浮点数1的阶
R5、R4:浮点数2的尾数,R2:浮点数2的阶
39H:右移输入位
3)程序流程图如图7-10所示
图7-10 浮点数规格化子程序流程图
例:将R3、R7、R6和R2、R5、R4中的两个三字节数相加或相减,结果送R5、R7、R6。如果入口时位地址3AH=0,则执行加法;如果3AH=1,则执行减法。执行加减运算时要先对阶,采用小阶向大阶靠的方法。
1)题目分析
两个异号数相加,相当于两个同号数相减;两个异号数相减,相当于两个同号数相加。
2)硬件资源分配
R7、R6:浮点数1的尾数,R3:浮点数1的阶
R5、R4:浮点数2的尾数,R2:浮点数2的阶
38H:存被加数符号,39H:运算溢出标志,3AH:加减标志位
3)程序流程图如图7-11所示
图7-11 浮点数加减运算子程序流程图
(3)浮点数乘法子程序
执行浮点数乘法比加减法方便,不需要对准小数点,只要将阶码相加,尾数相乘即可。设浮点数1的尾数为m1,浮点数2的尾数为m2,对于两个规格化浮点数,尾数相乘,0.25≤m1m2<1,不会产生溢出,但可能需进行左规格化。
例:浮点数乘法子程序
1)题目分析
3字节浮点数N1、N2相乘。N1×N2->R3(阶)R7、R6(尾数);2字节尾数相乘,结果为4字节。调用2字节无符号数乘法子程序。用规格化3字节浮点数表示乘积,要舍去2字节。结果4舍5入处理。
2)硬件资源分配
R7、R6:浮点数1的尾数,R3浮点数1的阶
R5、R4:浮点数2的尾数,R2浮点数2的阶
38H:存积符号
3)程序流程图如图7-12所示
图7-12 浮点数乘法子程序流程图
(4)浮点数除法子程序
执行浮点数除法与浮点数乘法不同,不能对尾数直接调用双字节定点小数除法子程序。因为浮点数除法在入口时,应满足被除数小于除数的条件,否则商将大于1,无法用小数表示。所以执行浮点除法时,要先调整小数点的位置(即调整阶码),使被除数的尾数m1小于除数的尾数m2。
执行浮点数除法应先调整被除数的尾数,使m1<m2,然后阶码相减,尾数相除。结果不需要进行规格化。
例:浮点除法子程序
1)题目分析
已知3字节浮点数N1和N2。N1/N2->R3(阶)R7、R6(尾数)。先判断是否满足m1<m2的条件。如满足条件,则直接调用2字节除法子程序,如不满足条件,则浮点数N1先执行右规格化,然后再调用2字节除法子程序。
2)硬件资源分配
R7、R6:浮点数1的尾数,R3浮点数1的阶
R5、R4:浮点数2的尾数,R2浮点数2的阶
38H:存积符号
3)程序流程图如图7-13所示。
?????????????????
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试