pic16单片机中双字节乘法子程序的更正

pic16单片机中双字节乘法子程序的更正

ID:15907249

大小:209.31 KB

页数:3页

时间:2018-08-06

pic16单片机中双字节乘法子程序的更正_第1页
pic16单片机中双字节乘法子程序的更正_第2页
pic16单片机中双字节乘法子程序的更正_第3页
资源描述:

《pic16单片机中双字节乘法子程序的更正》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、万方数据PIC16单片机中双字节乘法子程序的蔓正●福州大学江禾Ⅱ美国Microchip公司的PICl6系列单片机以其功能齐全、品种多、可靠性高著称,得到国内越来越多的相关技术人员的青睐。但是,PICl6系列单片机中无乘除指令,因此必须用加减和移位的办法实现乘法与除法运算。国内许多教材引用了Microchip公司的相关子程序或自编了通用子程序,给从事PIC系列单片机开发的人员带来了便利。但由于Microchip公司早期对外发布的子程序中存在错误,使得国内出版的几乎所有的PICl6系列单片机教材及文

2、献中的无符号双字节乘法子程序都存在错误口⋯。笔者最近在Microchip公司网站上新下载了该子程序口],发现已进行了修改,但仍存在错误,因此有必要对此做一个更正,否则若在产品中引用这个错误的程序,将导致不可预料的后果。1错误的由来在上述文献中,无符号双字节乘法S版本(占用程序空间少,Small;另一版本为F版本,即运行速度快,Fast)的程序如下(方便起见,程序加上行号):;双字节乘,ACCa(16位)×ACCb(16位),结果放入到ACCb、;ACCc(共32位)①DLMPYS②ML00P③④

3、⑤⑥⑦⑧⑨⑩⑩SETUP③⑩CALLSETUPRRFACCdHI。FRRFACCdLo。FBTFSCSTATUS,CCALLD_-ADDRRFACCbHI。FRRFACCbL0,FRRFACCcHI,FRRFACCcL0.FDECFsZTEⅣ咿,FGOToML00PRETURNMOVLW.16MOVWFTEMPMOVFACCbHI,WMOVWFACCdHI;乘数右移1次;是否要加被乘数;标志位为l要加被乘数;部分积右移1次;继续循环直到16次;16次循环lACCb一>ACCd⑩④MoVFMOVW

4、FCLRFACCbL0,WACCdL0AOCbHI;部分积A

5、CCb、AOCd清零ACCbL0⑨RETURN;双字节加,ACCb+Acca一>ACCb◎D_-ADDMOVFACCaL0,W④创)亡IWFAC(、bLo,F③BTFSCSTATUS,C③INCFACCbHI,F⑦MOVFACCaHI,W◎川]【)ⅥⅢ。Aa璃HI,F⑦RETURN;先加低字节;判断是否有进位;有进位高字节加1;加高字节可以看到,该乘法子程序使用的是移位及相加的办法:每次循环时判断乘数右移出的那一位是否为1,若为1则将

6、部分积加上被乘数,然后将部分积带标志位右移。初看没什么问题,但是如果用oXFFFF×oxFFFF验证就会发现,计算结果为0)【FDFE0001,而正确的结果应为oxFFFE0001。错误出在哪儿?仔细分析会发现,错误出在加法子程序D-ADD上。在加法子程序的第⑤行“AD—DWFACCbHI,F,,中,影响到状态字STATUS的进位标志位C,这样在其后的调用返回中第⑥行指令“RRFACCbHI,F”的移位中也是正确的,即这条指令已考虑了加法溢出的情况。但是程序中没有考虑在第⑤行加1时溢出的情况,因

7、此在计算中就可能出错。2错误的纠正及在编程中应注意的问题找到错误的所在,纠正就容易了,只须修改无符号双字节加法子程序。在加法子程序中增加一个寄存器(实际上只用到一个位就够了),当高字节加1溢出时,该位置1且在加法子程序返回时前置状态字STATUS的进位标志位C为1,这样返回到乘法时就能正确运行。具体程序如下:D.-ADDBCFACCeL0,o;清辅助进位标志位MoVFACCaL0,W70《平疗机{嵌入式糸碗矗冈》adv@mesnet.com.cn(广告专用)万方数据ADDWFACCbL0,F;先

8、加低字节BTFSSSTATUS,C;判断是否有进位GOT0D--ADDlINCFACCbHI,F;有进位高字节加lBTFSCSTATUS,Z;判断上一行加1是否有溢出BSFACceL0,O;有溢出,令ACCeL0.O=1D二ADDlMOVFACCaHI。WADDWFACCbHI,F;加高字节BTFSCACCeL0,0BSFSTATUS。C;若ACCeLo.O—O,令STATUS.C一1RETURN本程序中考虑了无符号数加1时溢出的情况。若有溢出,则返回时置sTATUS.C一1。可以从Microc

9、hip公司网站下载经过修正的无符号双字节乘法程序AN526嘲,用这个程序来验证o)【FFFF×oxFFFF是正确的,但是在计算oxl234×ox567时却是错的。其问题也是出在加法子程序上,其程序如下:①DLADDBCFFlags,C;清临时进位标志位②MOVFACCaL0,w;加AOCb+ACCa一>A(硒③ACCbL0,F;加低字节④BTFSCSTATUS,C;判断是否进位⑤INCFACCbHI,F⑥BTFSCSTATUS,C⑦BSFFlags,C⑧MOVFACCaHI,W⑨ADDwFACC

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。