COMF ACCCHI
BTFSC STATUS,Z
NEG_B DECF ACCBLO ;
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;子程序返回
;****************************************
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
;*******乘法运算确定结果符号判断子程序******
S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7 ;ACCB为负吗?
GOTO CHEK_A ;否,检查ACCA
CALL NEG_B ;是,求取ACCB绝对值
CHEK_A BTFSC ACCAHI,7 ;ACCA为负吗?
CALL NEG_A ;ACCA为负,求取ACCA绝对值,
;见双字节加法程序
RETURN ;ACCA和ACCB均为正,返回
【校验举例1】:-24555×(-7391)=181486005(十进制)
化为十六进制数:A015H×E321H
结果:0AD141B5H(十六进制)
【校验举例2】 16405×13089=214725045(十进制)
化为十六进制数:4015H×3321H
结果:0CCC71B5H(十六进制)
【例程】
MAIN MOVLW 0X15 ;被乘数4015H送ACCB
MOVWF ACCBLO
MOVLW 0X40
MOVWF ACCBHI
MOVLW 0X21 ;乘数3321H送ACCA
MOVWF ACCALO
MOVLW 0X33
MOVWF ACCAHI
CALL D_mpy ;调用双字节乘法子程序,求积
END
2.3 16×16位定点数除法子程序
子程序采用反复的减法算法,除数和被除数分别为16位二进制有符号数(均采用补码表示,第16位为符号位),商为16位二进制有符号数,第16位为符号位。子程序的入口条件和出口条件如下:
入口条件:被除数存放在ACCBHI、ACCBLO单元中;
除数存放在ACCAHI、ACCALO单元中。
出口条件:商存放在ACCBHI、ACCBLO单元中;
余数存放在ACCCHI、ACCCLO单元中。
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放除数低8位
ACCAHI EQU 21 ;存放除数高8位
ACCBLO EQU 22 ;存放被除数和商的低8位
ACCBHI EQU 23 ;存放被除数和商的高8位
ACCCLO EQU 24 ;存放余数低8位
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

