




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(1)1616位定点数加、减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放加数或减数低8位ACCAHIEQU21 ;存放加数或减数高8位ACCBLOEQU23 ;存放被加数或被减数低8位ACCBHIEQU24 ;存放被加数或被减数高8位ORG0X0000STARTGOTOMAIN;*双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB*D_subCALLNEG_A ;求ACCA的补码;双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCBD_addMOVFACCALO,0 ;ACCB和ACCA低半字节相加ADDWFACCBLOBTFSCSTATUS, C ;有进位否?INCFACCBHI ;有,ACCB高字节加1,再加ACCAHIMOVFACCAHI,0 ;ACCA、ACCB高半字节相加ADDWFACCBHIRETURN ;子程序返回;ACCA取补子程序NEG_ACOMFACCALO;ACCALO取反加1INCFACCALOBTFSCSTATUS,Z;低8位有进位吗?DECFACCAHI ;有,ACCAHI减1,再取反COMFACCAHI ;否则ACCAHI直接取反RETURN ;子程序返回(2)1616位定点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放乘数低8位ACCAHIEQU21;存放乘数高8位ACCBLOEQU23 ;存放被乘数低8位和乘积第1623位ACCBHIEQU24 ;存放被乘数高8位和乘积第2431位ACCCLOEQU26 ;存放乘积低8位ACCCHIEQU27 ;存放乘积高8位ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器SIGNEQU2B ;存放乘积的符号ORG0X0000STARTGOTOMAINORG0X0100D_mpyCALLS_SIGN ;求取乘积的符号,并对负数取补CALLSETUP ;调用子程序,将ACCB的值送ACCDINCFTEMPCLRFACCCHI;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C;判断是否需要相加CALLD_add ;加乘数至ACCB,见加法程序BCFSTATUS,C;清进位位RRFACCBHI ;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLODECFSZTEMP;乘法完成否?GOTOMLOOP;否,继续求乘积BTFSSSIGN,7 ;是,确定乘积的符号GOTOOVER ;为正,乘法结束COMFACCCLO ;为负,乘积取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURN;子程序返回SETUPMOVLW15;初始化TEMP寄存器MOVWFTEMPMOVFACCBHI,0 ;ACCB送ACCDMOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHI;清ACCBCLRFACCBLORETURN;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7 ;ACCB为负吗?GOTOCHEK_A ;否,检查ACCACALLNEG_B ;是,求取ACCB绝对值CHEK_ABTFSCACCAHI,7;ACCA为负吗?CALLNEG_A ;ACCA为负,求取ACCA绝对值,RETURN ;ACCA和ACCB均为正,返回(3)1616位定点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放除数低8位ACCAHIEQU21;存放除数高8位ACCBLOEQU22 ;存放被除数和商的低8位ACCBHIEQU23 ;存放被除数和商的高8位ACCCLOEQU24;存放余数低8位ACCCHIEQU25;存放余数高8位ACCDLOEQU26 ;临时寄存器ACCDHIEQU27 ;临时寄存器TEMPEQU28 ;临时寄存器SIGNEQU29;存放商的符号ORG0X0000STARTGOTOMAINORG0X0100D_divCALLS_SIGN;确定商的符号,并将负数取补CALLSETUP ;初始化TEMP,将被除数移至ACCDINCFTEMPCLRFACCCHI;清余数寄存器CLRFACCCLODLOOPBCFSTATUS,C ;清进位位RLFACCDLO ;被除数、余数左移1位RLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHI,0 ;ACCCHI-ACCAHISUBWFACCCHI,0BTFSSSTATUS,Z;ACCCHI=ACCAHI?GOTONOCHKMOVFACCALO,0;是,ACCCLO-ACCALOSUBWFACCCLO,0NOCHKBTFSSSTATUS,C;ACCCACCA?GOTONOGOMOVFACCALO,0 ;是,余数减除数SUBWFACCCLOBTFSSSTATUS,CDECFACCCHIMOVFACCAHI,0SUBWFACCCHIBSFSTATUS,C ;置进位位NOGORLFACCBLO ;商左移1位RLFACCBHIDECFSZTEMP ;循环完毕?GOTODLOOPBTFSSSIGN,7 ;是,确定商的符号GOTODIVOVER ;为正,除法结束,跳转到结束行COMFACCCLO ;为负,商和余数分别取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHICALLNEG_B;见乘法程序中间NEG_BDIVOVERRETURN ;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7 ;ACCB为负?GOTOCHEK_A ;否,检查ACCACOMFACCBLO ;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A ;ACCA为负,取补(NEG_A子程序请参见 ;1616位定点数乘法子程序NEG_A)RETURN ;ACCA和ACCB均为负,返回(4)浮点数加减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放加数或减数的尾数ACCAHIEQU21EXPAEQU22 ;存放加数或减数阶码ACCBLOEQU23 ;存放被加数或被减数尾数以及和或差ACCBHIEQU24EXPBEQU25 ;存放被加数或被减数阶码ACCCLOEQU26 ;临时寄存器ACCCHIEQU27 ;临时寄存器ACCDLOEQU28 ;临时寄存器ACCDHIEQU29 ;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器ORG0X000STARTGOTOMAINORG0X0100F_subCALLNEG_A;求ACCA的补码,将减法转换为补码加法F_addCALLSUBADJ;调子程序判断EXPB和EXPA的大小BTFSCSTATUS,Z;参与运算的两个数阶码相等?GOTOPADD;是,求尾数的和BTFSCSTATUS,C;EXPBEXPA?CALLF_swap;是,ACCB与ACCA互换MOVFEXPA,0;否,求取两者的差值SUBWFEXPBSCLOOPCALLSHFTSR;ACCB右移规格化INCFSZEXPB;EXPBEXPA?GOTOSCLOOP;否,继续右移MOVFEXPA,0;是,存和(差)的阶码MOVWFEXPBPADDMOVFACCAHI,0;ACCAHI或ACCBHIIORWFACCBHI,0MOVWFSIGN;存于SIGN寄存器MOVFACCBHI,0;暂存ACCBHIMOVWFEXPACALLD_add;尾数相加BTFSSSIGN,7;ACCA和ACCB有负数?BTFSCACCBHI,7;否,把和的最高位和次高位同时进位?GOTOADD2;否,转ADD2BTFSSACCAHI,7;ACCA为负吗?GOTOADD3;ACCA和ACCB不同时为负,转ADD3BTFSSEXPA,7;是,ACCB为负吗?GOTOADD3BSFSTATUS,C;ACCA和ACCB同为负,带负号右移RRFACCBHIRRFACCBLOINCFEXPBADD3CLRFACCCHI;和(差)规格化CLRFACCCLOCALLF_normRETURN;子程序返回ADD2BCFSTATUS,C;最高位次高位不同时进位,ACCB右移INCFEXPBGOTOSHFTRSHFTSRBCFSTATUS,C;ACCB带符号右移子程序BTFSCACCBHI,7BSFSTATUS,CSHFTRRRFACCBHIRRFACCBLORETURN;子程序返回F_swapMOVFACCAHI,0;ACCAHI、ACCBHI互换MOVWFTEMPMOVFACCBHI,0MOVWFACCAHIMOVFTEMP,0MOVWFACCBHIMOVFACCALO,0;ACCALO、ACCBLO互换MOVWFTEMPMOVFACCBLO,0MOVWFACCALOMOVFTEMP,0MOVWFACCBLOMOVFEXPA,0;EXPA、EXPB互换MOVWFTEMPMOVFEXPB,0MOVWFEXPAMOVFTEMP,0MOVWFEXPBRETURNSUBADJMOVFEXPA,0;EXPA异或EXPB,结果送C_DIVXORWFEXPB,0MOVWFC_DIVMOVFEXPA,0;EXPB-EXPASUBWFEXPB,0BTFSSC_DIV,7;EXPA和EXPB同号?RETURN;是,进位位的值真确反映两者的大小,返回BTFSSSTATUS,C;否,进位位的值取反GOTOCHANGECBCFSTATUS,CRETURNCHANGECBSFSTATUS,CRETURNF_normMOVFACCBHI;ACCB0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETURN;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSC ACCBHI,6;为正。规格化完毕?RETURN;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACCB左移DECFEXPB;EXPB减1GOTOC_norm1;重新判断规格化完毕否?C_norm2BTFSSACCBHI,6;ACCB为负。规格化完毕否?RETURN;ACCBHI.6=0,规格化结束BCFSTATUS,CCALLSHFTSL;否,ACCB左移BSFACCBHI,7;加符号DECFEXPB;EXPB减1GOTOC_norm2;重新判断规格化完毕否?SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(5)浮点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放乘数尾数ACCAHIEQU21EXPAEQU22;存放乘数阶码ACCBLOEQU23 ;存放被乘数尾数和乘积高16位ACCBHIEQU24EXPBEQU25;存放被乘数阶码ACCCLOEQU26 ;存放乘积低16位ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B;存放乘积符号COUNTEQU2F ;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_mpyCALLS_SIGN;求取乘积的符号,并对负数取补CALLSETUP ;调用子程序将ACCB的值送ACCDCLRFACCCHI ;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C ;判断是否需要相加CALLD_add ;加乘数至ACCBBCFSTATUS,C;清进位位RRFACCBHI;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLODECFSZTEMP;乘法完成否?GOTOMLOOP;否,继续循环MOVFEXPA,0 ;是,乘数与被乘数阶码相加,得积的阶码ADDWFEXPBMOVFACCBHI;ACCBHI=0?BTFSSSTATUS,ZGOTOFINUP;否,转FINUPMOVFACCBLO;ACCB0?BTFSSSTATUS,ZGOTOSHFT08 ;否,只有ACCBHI=0,转SHFT08MOVFACCCHI,0 ;ACCB=0,将乘积左移15位MOVWFACCBHIMOVFACCCLO,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.15;乘积阶码减15(十进制数)SUBWFEXPBGOTOFINUPSHFT08MOVFACCBLO,0;只有ACCBHI0,乘积左移7位MOVWFACCBHIMOVFACCCHI,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.7;乘积阶码减7SUBWFEXPBFINUPCALLF_norm ;对乘积进行规格化BTFSSSIGN,7;确定乘积的符号GOTOOVER ;为正,乘法结束COMFACCCLO;为负,乘积取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURN;乘法结束,子程序返回S_SIGNMOVFACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGNXORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7;ACCB为负?GOTOCHEK_A;否,检查ACCACOMFACCBLO;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A;ACCA取补RETURN ;返回F_normMOVFACCBHI;ACCB0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETURN ;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完毕?RETURN ;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACCB左移DECFEXPB ;EXPB减1GOTOC_norm1 ;重新判断规格化完毕否?C_norm2BTFSSACCBHI,6;ACCB为负。规格化完毕否?RETURN ;ACCBHI.6=0,规格化结束BCFSTATUS,CCALLSHFTSL ;否,ACCB左移BSFACCBHI,7 ;加符号DECFEXPB ;EXPB减1GOTOC_norm2 ;重新判断规格化完毕否?SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(6)浮点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放除数的尾数ACCAHIEQU21EXPAEQU22;存放除数的阶码ACCBLOEQU23 ;存放被除数的尾数和商的尾数ACCBHIEQU24EXPBEQU25 ;存放被除数和商的阶码ACCCLOEQU26 ;存放余数ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29 ;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器SIGNEQU2B ;存放商的符号COUNTEQU2F;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_divCALLS_SIGN;确定商的符号,并将负数取补CLRFACCCHI ;初始化ACCC寄存器CLRFACCCLOCALLF_norm ;规格化ACCBCLRFACCCLOCLRFACCCHICLRFTIMESMOVFACCAHI;除数为零?BTFSSSTATUS,ZGOTOFD0 ;否,求商MOVFACCALOBTFSCSTATUS,ZRETLW01 ;是,返回FD0CALLNEG_A ;除数取补FD1MOVFACCBHI,0;ACCBHI送ACCDLOMOVWFACCDLOCALLD_add1 ;被除数尾数大于除数尾数?BTFSSSTATUS,CGOTOFD2RRF1BCFSTATUS,C;是,被除数右移规格化,直到小于除数为止RRFACCBHIRRFACCBLOINCFTIMESRRFACCCHIBCFSTATUS,CGOTOFD1FD2CALLDDIV;否,调用双字节除法子程序,求商的尾数MOVFTIMES,0 ;根据右移规格化次数调整ACCB阶码ADDWFEXPBMOVFEXPA,0;求商的阶码SUBWFEXPBCALLF_norm ;商规格化BTFSCSIGN,7;商为负?CALLNEG_B;是,取补CALLNEG_A;除数还原RETURN ;浮点数除法完成,返回DDIVMOVLW0X0F;初始化ACCDHIMOVWFACCDHIDV1BCFSTATUS,CRLFACCCLO;左移商RLFACCCHIRLFACCBLO;左移余数RLFACCBHIMOVFSTATUS,0 ;暂存STATUS寄存器MOVWFACCDLOMOVFACCBHI,0;ACCBHI送TEMP1MOVWFTEMP1MOVFACCALO,0 ;ACCB-ACCAADDWFACCBLO,0MOVWFTEMPBTFSCSTATUS,CINCFTEMP1MOVFACCAHI,0ADDWFTEMP1,0BTFSCACCDLO,0;左移余数时移出来的数为1?GOTODV2TESTCBTFSSSTATUS,C;是,再判断ACCB尾数是否大于ACCAGOTODV3DV2MOVWFACCBHI;是,余数送ACCBMOVFTEMP,0MOVWFACCBLOINCFACCCLO ;商加1DV3DECFSZACCDHI;商求取完毕?GOTODV1MOVFACCCHI,0;是,将商送ACCBMOVWFACCBHIMOVFACCCLO,0MOVWFACCBLORETLW00D_add1MOVFACCALO,0;加数、被加数低半字节相加ADDWFACCBLO,0BTFSCSTATUS,C ;有进位?INCFACCDLO ;ACCD低半字节加1MOVFACCAHI,0 ;ACCAHI+ACCDLOADDWFACCDLORETLW0;子程序返回SETUPMOVLW.15MOVWFTEMPMOVFACCBHI,0MOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHICLRFACCBLORETLW0NEG_ACOMFACCALO;ACCALO取反加1INCFACCALOBTFSCSTATUS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年护师考试常态化测试方式试题及答案
- 模具款保管合同书5篇
- 2025年新防疫防控安全员培训试题及答案
- 智能制造基地土地租赁与转让创新合作协议
- 文化娱乐产业合伙人版权合作与权益分配合同
- 2025年急诊急救医生试题及答案
- 生态农业租赁合同补充协议书(农业补贴)
- 二手房买卖合同签订中的房屋维修责任划分与处理
- 住宅小区泳池清洁及水质检测服务合同
- 限购政策下城市核心区域房产买卖及税费代缴协议
- 中央ppp项目管理办法
- 手术后盆腔脓肿查房
- 舞蹈教学教学课件
- 2024版电网公司反事故措施(2024版)
- 退伍军人离队安全教育培训纲要
- 工地剪彩活动方案
- 道路养护工程材料供应保障及进度措施
- 法院付款申请书
- 小儿心律失常的护理讲课件
- 2025-2030年积木产业市场深度调研及发展趋势与投资战略研究报告
- 校园各社团管理制度
评论
0/150
提交评论