⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ieeechangebcdfloat.asm

📁 标准的四字节IEEE浮点型数据转换为BCD码源代码
💻 ASM
字号:
FLAG_SG   bit   08h
FLAG_CXS  bit   09h
FLAG_CZS  bit   0ah
;-----------------------------
disp_buf0   equ   40h    ;存BCD码的连续5个单元
disp_buf1   equ    41h
disp_buf2   equ   42h
disp_buf3   equ   43h
disp_buf4   equ   44h    ;jiema
;-----------------------------------
dig_0     equ   30h
dig_1     equ   31h      ;存二进制码的连续4个单元
dig_2     equ   32h
dig_3     equ   33h
;-----------------------------------
org       0000h
ljmp      init
org       0030h
init:
         mov     dig_3,#41h  ;阶码位
         mov     dig_2,#0bdh  ;尾数的连续三位
         mov     dig_1,#0f5h
         mov     dig_0,#024h
         clr     FLAG_SG
         clr     FLAG_CXS
         clr     FLAG_CZS
;*****************************************
main_loop:
         lcall   change_bcd
         ret
;*****************************************
;in:dig_0到dig_3的4个字节的二进制数
;fun:把标准的二进制数转换为普通的压缩BCD码的浮点数的形式
;out:disp_buf0到的八个字节存压缩BCD其中放阶码以7eh代表阶码为零其他4个单元存尾数
change_bcd:
         mov     r3,#05h
         clr     a
         mov     r1,#40h     ;把存BCD码的首地址赋给r1
change_clear:                ;所存bcd单元里清零
         mov     @r1,a
         inc     r1
         djnz    r3,change_clear
         mov     a,dig_2     ;二进制阶码和数符处理
         jb      acc.7,change_b0
         clr     c
         setb    acc.7
         mov     dig_2,a
         ljmp    change_b1
change_b0:
         setb    c
change_b1:
         mov     a,dig_3
         rlc     a
         mov     dig_3,a
         jnc     change_b2
         setb    FLAG_SG
;-----------------------------------------
change_b2:                     ;二进制的阶码判断
         mov     a,dig_3
         jz      change_ret1
         clr     c
         subb    a,#7fh
         jc      change_cxs    ;阶码小于7F跳到纯小数
         inc     a
         mov     r5,a
;------------------------------求bcd码的整数部分
change_zs:
         mov     disp_buf4,#7eh
change_lp1:
         mov     r0,#dig_0
         mov     r2,#03h
         clr     c
change_lp2:
         mov     a,@r0
         rlc     a
         mov     @r0,a
         inc     r0
         djnz    r2,change_lp2
         mov     r1,#disp_buf0
         mov     r3,#04h
change_lp3:                       ;BCD单元剩2
         mov     a,@r1
         addc    a,@r1
         da      a
         mov     @r1,a
         inc     r1
         djnz    r3,change_lp3
         jnc     change_lp5       ;判断CY标志是否为1,如果为1则跳到纯整数处理
change_lp4:
         mov     f0,c
         setb    FLAG_CZS
         mov     a,r5              ;判断二进制的整数部分是否处理完
         cjne    a,#01h,change_lp7
         mov     a,disp_buf0
         anl     a,#0fh
         clr     c
         subb    a,#05h
         jnc     change_lp6
         ljmp    change_lp7
change_lp6:
         lcall   add_1            ;四舍五入处理
change_lp7:
         lcall   bcd_rst          ;bcd码右移一位
         inc     disp_buf4          ;阶码加1
change_lp5:
         djnz    r5,change_lp1
;---------------------------------------求bcd的阶码
change_lj2:
         lcall   change_jm
         jnb     FLAG_CZS,change_lj3
change_ret1:
         ret
change_lj3:
         mov     a,#8
         clr     c
         subb    a,r7             ;求出所需BCD码小数部分所要的位数
         mov     r7,a
;-----------------------------------------
change_xs:
         lcall   ejz_mul10
         lcall   bcd_lst
         mov     a,r4
         mov     r1,#disp_buf0
         xchd    a,@r1
         djnz    r7,change_xs
         lcall   ejz_mul10
         mov     a,r4
         clr     c
         subb    a,#05h
         jnc     change_xs1
         ret
change_xs1:
        mov     r1,#disp_buf0
        mov     r3,#04h
        setb    c
        lcall   add_l1
        ret
;--------------------------------阶码小于7F的二进制纯小数的转换
change_cxs:
         mov     r7,#8
         mov     disp_buf4,#7eh
change_cxs0:
         lcall   ejz_mul10
         mov     r5,dig_3
         cjne    r5,#7eh,change_cxs2   ;对纯二进制小数剩10以后对阶码进行判断
         mov     a,#00
         orl     a,disp_buf0
         orl     a,disp_buf1
         orl     a,disp_buf2
         orl     a,disp_buf3
         jz      change_cxs1
         ljmp    change_cxs3
change_cxs1:
         mov     a,r4
         jz      change_cxs4
         ljmp    change_cxs3
change_cxs2:
         mov     a,r4
         jz      change_cxs4
         clr     c
         rrc     a
         mov     r4,a
         lcall   erjinzhi_rst
         inc     dig_3
         mov     r5,dig_3
         cjne    r5,#7eh,change_cxs2
         mov     a,r4
         jz      change_cxs4
change_cxs3:
         lcall   bcd_lst
         mov     a,r4
         mov     r1,#disp_buf0
         xchd    a,@r1
         djnz    r7,change_cxs0
         ret
change_cxs4:
         dec     disp_buf4
         ljmp    change_cxs0
;--------------------------------------------
bcd_lst:
         mov     r6,#04h
bcd_lst_1:
         mov     r3,#04h
         mov     r1,#disp_buf0
         clr     c
bcd_lst_2:
         mov     a,@r1
         rlc     a
         mov     @r1,a
         inc     r1
         djnz    r3,bcd_lst_2
         djnz    r6,bcd_lst_1
         ret
;----------------------------------------
bcd_rst:
         mov     c,f0
         mov     r6,#04h
bcd_rst_1:
         mov     r3,#04h
         mov     r1,#disp_buf3
bcd_rst_2:
         mov     a,@r1
         rrc     a
         mov     @r1,a
         dec     r1
         djnz    r3,bcd_rst_2
         clr     c
         djnz    r6,bcd_rst_1
         ret
;------------------------------- ;求BCD的阶码
change_jm:
         mov     r1,#disp_buf3
         mov     r3,#04h
         mov     r7,#8
change_j00:
         mov     a,@r1
         jz      change_j2
         anl     a,#0f0h
         jz      change_j1
         setb    FLAG_CZS
         ljmp    change_j3
change_j0:
         mov     a,@r1
         jz      change_j2
         anl     a,#0f0h
         jz      change_j1
         ljmp    change_j3
change_j1:
         dec     r7
         ljmp    change_j3
change_j2:
         dec     r7
         dec     r7
         dec     r1
         djnz    r3,change_j0
change_j3:
         mov     a,disp_buf4
         add     a,r7
         mov     disp_buf4,a
change_ret:
         ret
;----------------------------------------二进制右移1位
erjinzhi_rst:
        mov       r0,#dig_2
        mov       r2,#03h
erjinzhi_rst1:
       mov       a,@r0
       rrc       a
       mov       @r0,a
       dec       r0
       djnz      r2,erjinzhi_rst1
       ret
;------------------------------------------
add_1:
       mov       a,disp_buf0
       add       a,#10h
       da        a
       mov       disp_buf0,a
       mov       r1,#disp_buf1
       mov       r3,#03h
add_l1:
       mov       a,#0h
       addc      a,@r1
       da        a
       mov       @r1,a
       inc       r1
       djnz      r3,add_l1
       ret
;-------------------------------------------
ejz_mul10:
         mov    r0,#dig_0
         mov    r2,#03h
         clr    c
         mov    r4,#00h
ejz_1:
         mov     a,@r0
         mov     b,#0ah
         push    psw
         mul     ab
         pop     psw
         addc    a,r4
         mov     @r0,a
         mov     r4,b
         inc     r0
         djnz    r2,ejz_1
         ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -