浮点除法!
fdiv 功能:浮点数除法
入口条件:被除数在[r0]中,除数在[r1]中。
出口信息:ov=0时,商仍在[r0]中,ov=1时,溢出。
影响资源:psw、a、b、r2~r7、位1eh、1fh 堆栈需求: 5字节
fdiv: inc r0
mov a,@r0
inc r0
orl a,@r0
dec r0
dec r0
jnz div1
mov @r0,#41h;被除数为零,不必运算
clr ov
ret
div1: inc r1
mov a,@r1
inc r1
orl a,@r1
dec r1
dec r1
jnz div2
setb ov ;除数为零,溢出
ret
div2: lcall mvr0 ;将[r0]传送到第一工作区中
mov a,@r0
xrl a,@r1 ;比较两个操作数的符号
rlc a
mov 1fh,c ;保存结果的符号
lcall mvr1 ;将[r1]传送到第二工作区中
lcall div3 ;调用工作区浮点除法
ljmp mov0 ;回传结果
div3: clr c ;比较尾数的大小
mov a,r4
subb a,r7
mov a,r3
subb a,r6
jc div4
lcall rr1 ;被除数右规一次
sjmp div3
div4: clr a ;借用r0r1r2作工作寄存器
xch a,r0 ;清零并保护之
push acc
clr a
xch a,r1
push acc
mov a,r2
push acc
mov b,#10h ;除法运算,r3r4/r6r7-→r0r1
div5: clr c
mov a,r1
rlc a
mov r1,a
mov a,r0
rlc a
mov r0,a
mov a,r4
rlc a
mov r4,a
xch a,r3
rlc a
xch a,r3
mov f0,c
clr c
subb a,r7
mov r2,a
mov a,r3
subb a,r6
anl c,/f0
jc div6
mov r3,a
mov a,r2
mov r4,a
inc r1
div6: djnz b,div5
mov a,r6 ;四舍五入
clr c
rrc a
subb a,r3
clr a
addc a,r1 ;将结果存回r3r4
mov r4,a
clr a
addc a,r0
mov r3,a
pop acc ;恢复r0r1r2
mov r2,a
pop acc
mov r1,a
pop acc
mov r0,a
mov a,r2 ;计算商的阶码
clr c
subb a,r5
lcall md ;阶码检验
ljmp rln ;规格化
发表时间:2003年5月13日14:11:42