PIC单片机应用开发典型模块第八章程序Word下载.docx
《PIC单片机应用开发典型模块第八章程序Word下载.docx》由会员分享,可在线阅读,更多相关《PIC单片机应用开发典型模块第八章程序Word下载.docx(45页珍藏版)》请在冰豆网上搜索。
NEG_A
;
求ACCA的补码
;
双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB
D_add
MOVF
ACCALO,0;
ACCB和ACCA低半字节相加
ADDWF
ACCBLO
BTFSC
STATUS,C;
有进位否?
INCF
ACCBHI;
有,ACCB高字节加1,再加ACCAHI
ACCAHI,0;
ACCA、ACCB高半字节相加
ACCBHI
RETURN
;
子程序返回
ACCA取补子程序
COMF
ACCALO取反加1
ACCALO
STATUS,Z
低8位有进位吗?
DECF
ACCAHI;
有,ACCAHI减1,再取反
ACCAHI;
否则ACCAHI直接取反
RETURN;
(2)16×
16位定点数乘法程序
存放乘数低8位
存放乘数高8位
存放被乘数低8位和乘积第16~23位
存放被乘数高8位和乘积第24~31位
ACCCLO
26
存放乘积低8位
ACCCHI
27
存放乘积高8位
ACCDLO
28
临时寄存器
ACCDHI
29
TEMP
2A
SIGN
2B
存放乘积的符号
0X0100
D_mpy
S_SIGN
求取乘积的符号,并对负数取补
SETUP
调用子程序,将ACCB的值送ACCD
TEMP
CLRF
ACCCHI;
清ACCC
ACCCLO
MLOOP
BCF
STATUS,C;
清进位位
RRF
;
ACCD右移
ACCDLO
STATUS,C
判断是否需要相加
加乘数至ACCB,见加法程序
右移部分乘积
ACCCHI
DECFSZ
TEMP;
乘法完成否?
否,继续求乘积
BTFSS
SIGN,7
是,确定乘积的符号
OVER
为正,乘法结束
为负,乘积取补
STATUS,Z
NEG_B
RETURN;
MOVLW
15;
初始化TEMP寄存器
MOVWF
ACCBHI,0
ACCB送ACCD
ACCDHI
ACCBLO,0
清ACCB
ACCAHI,0
ACCAHI异或ACCBHI,结果送SIGN单元
XORWF
ACCBHI,0
ACCBHI,7
ACCB为负吗?
CHEK_A
否,检查ACCA
是,求取ACCB绝对值
ACCAHI,7
ACCA为负吗?
ACCA为负,求取ACCA绝对值,
ACCA和ACCB均为正,返回
(3)16×
16位定点数除法程序
20;
存放除数低8位
存放除数高8位
22
存放被除数和商的低8位
存放被除数和商的高8位
存放余数低8位
25
存放余数高8位
26;
27;
28;
存放商的符号
D_div
确定商的符号,并将负数取补
初始化TEMP,将被除数移至ACCD
清余数寄存器
DLOOP
RLF
被除数、余数左移1位
ACCCHI-ACCAHI
SUBWF
ACCCHI,0
ACCCHI=ACCAHI?
NOCHK
ACCALO,0
是,ACCCLO-ACCALO
ACCCLO,0
NOCHK
ACCC>
ACCA?
NOGO
是,余数减除数
STATUS,C
ACCAHI,0
BSF
置进位位
NOGO
商左移1位
循环完毕?
DLOOP
是,确定商的符号
DIVOVER
为正,除法结束,跳转到结束行
为负,商和余数分别取补
见乘法程序中间NEG_B
ACCB为负?
是,ACCB取补
ACCA为负?
ACCA为负,取补(NEG_A子程序请参见
16×
16位定点数乘法子程序NEG_A)
ACCA和ACCB均为负,返回
(4)浮点数加减法程序
存放加数或减数的尾数
21
EXPA
存放加数或减数阶码
存放被加数或被减数尾数以及和或差
24
EXPB
存放被加数或被减数阶码
TEMP1
30
TIMES
31
0X000
F_sub
NEG_A;
求ACCA的补码,将减法转换为补码加法
F_add
SUBADJ
调子程序判断EXPB和EXPA的大小
参与运算的两个数阶码相等?
PADD
是,求尾数的和
EXPB>
EXPA?
F_swap
是,ACCB与ACCA互换
EXPA,0
否,求取两者的差值
EXPB
SCLOOP
SHFTSR
ACCB右移规格化
INCFSZ
EXPB=EXPA?
否,继续右移
是,存和(差)的阶码
ACCAHI或ACCBHI
IORWF
存于SIGN寄存器
暂存ACCBHI
EXPA
尾数相加
ACCA和ACCB有负数?
ACCBHI,7;
否,把和的最高位和次高位同时进位?
ADD2
否,转ADD2
ADD3
ACCA和ACCB不同时为负,转ADD3
EXPA,7
是,ACCB为负吗?
ACCA和ACCB同为负,带负号右移
和(差)规格化
F_norm
最高位次高位不同时进位,ACCB右移
SHFTR
ACCB带符号右移子程序
ACCBHI,7
SHFTR
ACCAHI,0;
ACCAHI、ACCBHI互换
ACCAHI
TEMP,0
ACCALO、ACCBLO互换
EXPA、EXPB互换
EXPB,0
RETURN
EXPA,0;
EXPA异或EXPB,结果送C_DIV
C_DIV
EXPB-EXPA
C_DIV,7
EXPA和EXPB同号?
是,进位位的值真确反映两者的大小,返回
否,进位位的值取反
CHANGEC
CHANGEC
F_norm
ACCB=0?
C_norm
是,不需规格化,返回
C_norm
ACCBHI,7;
否。
C_norm2
C_norm1
ACCBHI,6;
为正。
规格化完毕?
ACCBHI.6=1,规格化结束
SHFTSL
ACCB左移
EXPB减1
重新判断规格化完毕否?
ACCBHI,6
ACCB为负。
规格化完毕否?
ACCBHI.6=0,规格化结束
否,ACCB左移
加符号
STATUS
,C
ACCB左移子程序
(5)浮点数乘法程序
存放乘数尾数
存放乘数阶码
存放被乘数尾数和乘积高16位
存放被乘数阶码
存放乘积低16位
存放乘积符号
COUNT
2F
ACCEHI