《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

浮点数保存代码
程序匠人 发表于 2005-10-23 20:54:00  阅读全文 | 回复(0) | 引用通告 | 编辑

浮点数保存代码 

;程序说明:浮点数变为压缩BCD码,保存在以数组中
;         第1字节的位7:0正,1负.位6:0(位5--0代表小数点前的位数),1(位5--0代表小数
点后0的位数)
;         2--4字节为压缩BCD码,有效位为7位,3个半字节,最后半个字节请使用者自行放

;         程序占用资源PSW,A,B,DPTR,R0--R7,SP深度6,RAM 5个放数据
;         keil 兼容,调用KEIL 的FPMUL子程序。
;程序作者:*************陈远征**************
;目    的:追求更快的执行速度,与最小的程序代码
;发布时间:2003--05--08
;编写背景:精通汇编,研究C51半个月。身感C51方便中的不便
;         研究了几种汇编及KEIL的浮点算法,特做此程序.
;声    明:转载时请保留以上的信息

C程序:
extern float ftod(float i);

unsigned char cyz[5];

main(){
     float i=1234.567;
     ftod(i);
while(1);
      }

汇编程序:

PUBLIC   _FTOD          ;程序段
FTODP    SEGMENT CODE   ;入口地址
RSEG     FTODP          ;程序段

EXTRN     CODE  (?C?FPMUL)
EXTRN    DATA  (CYZ)
_FTOD:              ;参数传递在R4--R7中,浮点数IEEE标准seeeeeee emmmmmmm
mmmmmmmm mmmmmmmm
FTOD:
         MOV     A,R4       ;保存数符
         RLC     A              
         CLR     A             
         RRC     A             
         MOV     CYZ,A
         MOV     A,R4       ;取绝对值
         CLR     ACC.7
         MOV     R4,A
         ORL     A,R5
     JNZ     FCMP_1E10
         MOV     CYZ,#0      ;数值为0
         MOV     CYZ+1,#0
         MOV     CYZ+2,#0
         MOV     CYZ+3,#0
         MOV     CYZ+4,#0
     RET
FCMP_1E10: 
         MOV     DPTR,#YUANZHENG_DE10
         LCALL   FR0DPTR               ;数值装入R0--R3
         LCALL   FCMP
         JNC     FCMP_1E0              ;数值小于等于1e10,跳
         MOV     DPTR,#YUANZHENG_DE_10 ;数值大于1e10,X=X*(1e-10)
         LCALL   FR0DPTR               ;数值1e-10装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         MOV     A,CYZ
         CLR     ACC.6
         ADD     A,#10
         MOV     CYZ,A
         JMP     FCMP_1E10
FCMP_1E0:
         MOV     DPTR,#YUANZHENG_DE0
         LCALL   FR0DPTR               ;数值装入R0--R3
         LCALL   FCMP
         JZ      FCMP_1E0_10           ;数值等于1e0,跳
         JC      FCMP_1E0_10           ;数值大于1e0,跳
         MOV     DPTR,#YUANZHENG_DE10  ;数值小于1e0,X=X*(1e10)
         LCALL   FR0DPTR               ;数值1e10装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         MOV     A,CYZ
         SETB    ACC.6
         ADD     A,#10
         MOV     CYZ,A
         JMP     FCMP_1E10
FCMP_1E0_10:                           ;查表,找到一个比待转换浮点数大的整数幂.
         MOV     DPTR,#YUANZHENG_DE0
FCMP_FIND:                 
         LCALL   FR0DPTR
         LCALL   FCMP
         JNZ     FCMP_UNEQU
         MOV     CYZ+1,#10H            ;正好是表格中的数,尾数为0.10000000
         MOV     CYZ+2,#00H
         MOV     CYZ+3,#00H
         MOV     CYZ+4,#00H
     LCALL   CYZDEAL_JIE
         RET   
FCMP_UNEQU:
         JC      FCMP_NEXT            ;待转换浮点数大,跳转
         MOV     CYZ+1,DPH            ;a,b,c    a=b-(c-b)
         MOV     CYZ+2,DPL
         MOV     DPTR,#YUANZHENG_DE0
         CLR     C
         MOV     A,CYZ+2
         SUBB    A,DPL
         MOV     CYZ+2,A
         MOV     A,CYZ+1
         SUBB    A,DPH
         MOV     CYZ+1,A
         CLR     C
         MOV     A,DPL
         SUBB    A,CYZ+2
         MOV     DPL,A
         MOV     A,DPH
         SUBB    A,CYZ+1
         MOV     DPH,A
         INC     DPTR
         INC     DPTR
         INC     DPTR
         INC     DPTR
         LCALL   FR0DPTR               ;数值1e?装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         JMP     YUANZHENG_FBCD        ;得到一个二进制浮点数的纯小数。
FCMP_NEXT:
         MOV     A,CYZ                 ;幂值调整
         JB      ACC.6,FCMP_NEXT1
         INC     CYZ
         JMP     FCMP_FIND
FCMP_NEXT1:
         DEC     CYZ
         JMP     FCMP_FIND

YUANZHENG_FBCD:
         MOV     A,R5       ;恢复阶码
         RLC     A
         MOV     A,R4
         RLC     A
         CLR     C
         SUBB    A,#126
         MOV     R4,A
         MOV     A,R5       ;恢复尾数
         SETB    ACC.7
         MOV     R5,A
CYZFTB0:
         MOV     A,R4       ;取阶码
         JZ      CYZFTB1    ;为零吗?
     CLR    C
     LCALL    RR1         ;右规。
     SJMP    CYZFTB0
CYZFTB1:
         ACALL   HB2      ;转换尾数的十分位和百分位
         MOV     CYZ+1,A
         ACALL   HB2      ;转换尾数的千分位和万分位
         MOV     CYZ+2,A
         ACALL   HB2      ;转换尾数的十万分位和百万分位
         MOV     CYZ+3,A
         ACALL   HB2      ;转换尾数的千万分位和亿分位
         MOV     CYZ+4,A

      MOV    A,R5      ;四舍五入。
     RLC    A
     MOV     A,#05H   ;此处后半字节(BCD码的第8位)的值不保证
     ADDC    A,CYZ+4
     DA    A
     MOV    CYZ+4,A
     CLR    A
     ADDC    A,CYZ+3
     DA    A
     MOV    CYZ+3,A
     CLR    A
     ADDC    A,CYZ+2
     DA    A
     MOV    CYZ+2,A
     CLR    A
     ADDC    A,CYZ+1
     DA    A
     MOV    CYZ+1,A
     JNC    CYZFTB2
     MOV    CYZ+1,#10H
     LCALL   CYZDEAL_JIE        ;十进制浮点数的阶码。
CYZFTB2:  
         RET
CYZDEAL_JIE:
         MOV     A,CYZ              ;幂值调整
         JNB      ACC.6,CYZDEAL_JIE1
         DEC     CYZ
         RET
CYZDEAL_JIE1:
         INC     CYZ
         RET

RR1:     MOV    A,R5       ;第一操作数右规一次
     RRC    A       ;尾数缩小一半
     MOV    R5,A
     MOV    A,R6
     RRC    A
     MOV    R6,A
     MOV    A,R7
      RRC    A
     MOV    R7,A
     INC    R4         ;阶码加一
     CLR    OV         ;清溢出标志
     CJNE    R4,#80H,RR1E ;阶码上溢否?
     MOV    R4,#7FH         ;阶码溢出
     SETB    OV
RR1E:     RET

HB2:  
         MOV    A,R7    ;尾数扩大100倍。
     MOV    B,#100
     MUL    AB
     MOV    R7,A
     MOV    A,B
     XCH    A,R6
     MOV    B,#100
     MUL    AB
     ADD    A,R6
     MOV    R6,A
     MOV    A,B
     XCH    A,R5
     MOV    B,#100
     MUL    AB
     ADD    A,R5
     MOV    R5,A
     JNC    HB21
     INC    B
HB21:     MOV    A,B    ;将整数部分转换成BCD码。
     MOV    B,#10
     DIV    AB
     SWAP    A
     ORL    A,B
     RET
FR0DPTR:
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R0,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R1,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R2,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R3,A
         INC     DPTR
         RET
FCMP:                    ;比较两个正的浮点数
         CLR     C
         MOV     A,R0
         SUBB    A,R4
         JNZ     FCMP1
         MOV     A,R1
         SUBB    A,R5
         JNZ     FCMP1
         MOV     A,R2
         SUBB    A,R6
         JNZ     FCMP1
         MOV     A,R3
         SUBB    A,R7
FCMP1:
         RET

YUANZHENG_DE_10:
         DB 02EH,0DBH,0E6H,0FFH ;1E-10
         DB 030H,089H,070H,05FH ;1E-9
         DB 032H,02BH,0CCH,077H ;1E-8
         DB 033H,0D6H,0BFH,095H ;1E-7
         DB 035H,086H,037H,0BDH ;1E-6
         DB 037H,027H,0C5H,0ACH ;1E-5
         DB 038H,0D1H,0B7H,017H ;1E-4
         DB 03AH,083H,012H,06FH ;1E-3
         DB 03CH,023H,0D7H,00AH ;1E-2
         DB 03DH,0CCH,0CCH,0CDH ;1E-1
YUANZHENG_DE0:
         DB 03FH,080H,000H,000H ;1E0
         DB 041H,020H,000H,000H ;1E1
         DB 042H,0C8H,000H,000H ;1E2
         DB 044H,07AH,000H,000H ;1E3
         DB 046H,01CH,040H,000H ;1E4
         DB 047H,0C3H,050H,000H ;1E5
         DB 049H,074H,024H,000H ;1E6
         DB 04BH,018H,096H,080H ;1E7
         DB 04CH,0BEH,0BCH,020H ;1E8
         DB 04EH,06EH,06BH,028H ;1E9
YUANZHENG_DE10:
         DB 050H,015H,002H,0F9H ;1E10
 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!