📄 ieeechangebcdfloat.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 + -