王爽书上这个无溢出除法,看不懂啊,求讲解

[复制链接]
查看11 | 回复3 | 2021-1-27 05:56:20 | 显示全部楼层 |阅读模式
dx装被除数高位,ax装被除数低位,cx装除数,计算0f4240h除以0ah,用下面公式:
高位/cx的商*65536+[高位/cx的余数*65536+低位]/cx可以实现无溢出除法,
divew段代码看不懂啊,它是怎样实现的啊,它连公式里面的*65536这个都没看到,怎么就实现了呢,
最终结果是dx装商的高位,ax装结果的低位,cx装余数。
assumecs:code,ss:stack
stacksegment
dw8dup(0)
stackends
codesegment
start:
movax,stack
movss,ax
movsp,10h
movax,4240h
movdx,0fh
movcx,0ah
calldivdw
movax,4c00h
int21h
divdw:;子程序定义开始
pushax
movax,dx
movdx,0
divcx
movbx,ax
popax
divcx
movcx,dx
movdx,bx;dx:ax/cx=高位的商*65536+[高位的余数*65536+位]/cxret;子程序定义结束
codeends
endstar

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:56:20 | 显示全部楼层
公式里面的*65536,是用ax=0,dx=(高位/cx的商)来实现的,也就是说一个数要*65535,只要把这个数左移16位,在这里因为ax是被除数的低位,dx是被除数的高位,只要把数值放到dx中,再把ax置0就可以了。
movdx,bx;dx:ax/cx=高位的商*65536+[高位的余数*65536+位]/cx
这里没有把ax置0,是因为前面的
popax
divcx
已经算出来ax是低16位除以cx的商,本来就要加上ax的值作为被除数。
回复

使用道具 举报

千问 | 2021-1-27 05:56:20 | 显示全部楼层
movax,dx
movdx,0
divcx
movbx,ax;bx=高位/cx的商
popax;dx=高位/cx的余数,ax=原来的低位,就是高位/cx的余数*65536+低位
divcx
movcx,dx
movdx,bx;dx=最后结果的商的高位,ax=最后结果的商的低位,cx=最后结果的余数
回复

使用道具 举报

千问 | 2021-1-27 05:56:20 | 显示全部楼层
(dx,ax)/cx本身就表示(dx*65536+ax)/cx
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行