王爽汇编语言实验10除法溢出公式疑惑

公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
我本想按照公式一步一步来,却发现65536在寄存器放不下啊。然后上网搜了下答案,发现他们都不*65536,这是为什么? 为什么不按照公式来?

其实相当于用C语言中的数组,来解决,比如两个数组第一个放12第二个放34 现在把第一个数组放前面第二个放后面连接在一起就变成1234,相当于12已经乘以100了,而现在变成二进制而已,汇编代码如下:
1;子程序名称:divdw
2. ;功能:进行不会产生溢出的除法运算,被除数为dword型
3. ; 除数为word型,结果为dword型
4. ;参数: (ax)=dword型数据的低16位
5. ; (dx)=dword型数据的高16位
6. ; (cx)=除数
7. ;返回: (dx)=结果的高16位,(ax)=结果的低16位
8. ; (cx)=余数
9. ;计算公式:X/N=int(H/N)*2^16+[rem(H/N)*2^16+L]/N
10. divdw:
11. jcxz divdw_return ;除数cx为0,直接返回
12. push bx ;作为一个临时存储器使用,先保存bx的值
13.
14. push ax ;保存低位
15. mov ax, dx ;把高位放在低位中
16. mov dx, 0 ;把高位置0
17. div cx ;执行H/N,高位相除的余数保存在dx中
18. mov bx, ax ;把商保存在bx寄存器中
19. pop ax ;执行rem(H/N)*2^16+L
20. div cx ;执行[rem(H/N)*2^16+L]/N,商保存在ax中
21. mov cx, dx ;用cx寄存器保存余数
22. mov dx, bx ;把bx的值复制到dx,即执行int(H/N)*2^16
23. ;由于[rem(H/N)*2^16+L]/N已保存于ax中,
24. ;即同时完成+运算
25. pop bx ;恢复bx的值
26. divdw_return:
27. ret
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-21
把一个 32 位的数字 X,分成两个 16 位的寄存器存放,如:

DX 为高字,AX 为低字。

用语言描述 X 时,就要说:X = DX * 65536 + AX。

编程时,分开存放,就行了。并不需要真的乘以 65536。
第2个回答  2018-04-04

在画圈的地方 被除数是ax=4240h, dx=0005h

也就是     54240h/0ah=86a0h

所以最后部分还是 (rem(h/n)*65536+l)/n

相似回答