IceRainow 发表于 2011-12-24 16:57:09

关于除法溢出的问题

请教各位高手,这个公式中X/N的结果是商吗
那么余数该如何得到

X/N=INT(H/N)*65536+/N

IceRainow 发表于 2011-12-24 19:58:59

不会没人听懂我的意思吧

就是X/N的结果是商,但是余数怎么办呢

IceRainow 发表于 2011-12-25 14:45:00

余数是否应该是L除N的低8位,的余数

IceRainow 发表于 2011-12-28 07:09:39

难道大家都不明白吗

IceRainow 发表于 2011-12-31 23:09:37

这个问题很复杂吧,嘿嘿

415968430 发表于 2011-12-31 23:38:45

个人感觉,牵涉到其他语言了,是不是C啊,我只学过VB。反正我记得div的结果商和余数是放在寄存器的高低位的,你看看视频吧。我也忘记了

nbceshi 发表于 2012-1-2 15:11:32

千万别看这个公式,虽然书里的解法我是明白了,但这个公式还是看不懂。
我的理解是比如1000h/1
1000h放ax里,1放bl
指令为div bl
因为要溢出,解决方法是                       
1000/1先把1000h的低位先保存起来,把高位放到al里,ah置0运算
10/1    然后得到al商 10,ah余数 0
然后把al的值保存到ch,把前面保存的低位放入al,因为余数已经在高位了
所以不用再弄高位了,这时候做0 00/1得到商0,余数0
把商放入cl把余数放入dx就得到商cx1000,余数dx0了

nbceshi 发表于 2012-1-2 15:13:46

附上我的代码,都有注释,也许能帮你assume cs:code, ss:stack

stack segment stack
dw 8 dup(0)
stack ends

data segment
dd 2001;20342357 ;给出被除数
dw 2;291 ;给出除数
data ends

code segment
start:
mov ax, stack ;设置栈段
mov ss, ax
mov sp, 16
mov ax, data ;设置用户数据
mov ds, ax

mov ax, ds: ;给出子程序的参数低位
mov dx, ds: ;给出子程序的参数高位
mov cx, ds: ;给出子程序的参数除数
call divdw ;调用子程序进行运算

mov ax, 4c00h ;运算结束
int 21h

;在主程序dx中给出被除数的高位
;在主程序ax中给出被除数的低位
;在主程序cx中给出除数
;程序将返回商的高位在dx,低位在ax,余数在cx
;程序会占用bx寄存器,继承dx,ax,cx寄存器
divdw:
push bx ;计算中用到bx故先保存bx
push ax ;先将低位被除数ax入栈
mov ax, dx ;将高位给ax做高位商运算
mov dx, 0 ;将dx置0
div cx ;得到高位的商在ax余数在dx
mov bx, ax ;将高位商保存到bx
pop ax ;取出低位被除数到ax
div cx ;计算低位的商和余数分别在ax和dx
mov cx, dx ;将余数给cx
mov dx, bx ;将bx保存的高位商给dx
pop bx ;将保存的主程序bx的值返回
ret ;子程序返回

code ends
end start
页: [1]
查看完整版本: 关于除法溢出的问题