浮点数保存代码

时间:2005-12-13

;程序说明:浮点数变为压缩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

〖文章转载或出处〗≡中国电子技术信息网



  
上一篇:一种电子附图的制作方法
下一篇:AT89S51是什么?

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料