注册 登录
编程论坛 汇编论坛

求助双精度数输出的问题

loveajtl 发布于 2007-11-21 12:17, 1889 次点击
一个双精度数,高位数在DX寄存器,低位在AX寄存器,怎么样实现这个数的输出??
请路过的帮一下忙,先谢了.
6 回复
#2
蓝色神话2007-11-21 16:36

你所说的双精度数是浮点数还是整数?

#3
loveajtl2007-11-25 13:27
是整数
现在知道了,嘻嘻,整个数除10,之后一位一位数的放到一个字符串中,再输出.不过前提是那个双精度数除后的数只能放得下在AX里,如果太大了就要用到386以上的EAX寄存器了.
谢谢楼上.
#4
永夜的极光2007-11-25 15:38
;不会溢出的除法(32位除16位,商如果只能是16位,则可能溢出,比如FFFFF div 1)
;因此,把商也要增大到32位
;输入参数:ax 保存被除数低16位,dx 保存被除数高16位,cx 保存除数
;输出参数:ax 保存商低16位,dx 保存商高16位,cx保存余数
;计算方法:商的高16位=被除数高16位 div 除数 的 商
; 商的低16位=((被除数高16位 div 除数 的 余数)*FFFF+被除数低16位)div 除数 的 商
; 余数=上式的余数
public divdw
segdivdw segment 'code'
divdw proc far
push bx ;保存bx
mov bx,ax ;先把低16位保存
mov ax,dx ;高16位移到低16位
mov dx,0 ;高16位置零
div cx ;除
push ax ;保存商
mov ax,bx ;取出原来保存的低16位,高16位是上次除法的余数,已经在dx里面了
div cx ;再除
mov cx,dx ;把余数保存到cx
pop dx ;把第一次除的商,放入dx,作为结果的高16位
pop bx ;恢复bx
ret ;返回
divdw endp
segdivdw ends
end
#5
loveajtl2007-11-26 12:17
真是超劲啊,非常谢谢版主的详细解答,嘻嘻,我懂了,之前就是这个搞混了我,还以为只能用386以上的寄存器呢.
再次表示感谢.
#6
loveajtl2007-11-26 12:41
我又有个问题了,不知道为什么我用div除的话就没错,但如果我用idiv除的话,第二个除法那里就有出错了,我试着把DX置0,就没了除法错误,但结果就不对了(我也知道不对的了)
就是不知道为什么idiv除会有错咯?奇怪?
#7
永夜的极光2007-11-26 13:07
呃,这个是无符号的,有符号的话没研究过
1