|
主题 : : 求教 实验10,第2题,解决除法溢出 ,如何 乘以 65536? [待解决] |
回复[ 12次 ]
点击[ 374次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-06-20 11:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
求教
16位只能表示 0~65535,可公式里有 个 65536?如何处理?
乘以 65535再加上 被乘数么?
还是有什么更好的办法? | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-06-20 15:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
我好像明白了
那个65536没有必要真的去乘以它,
他前面的数字可以当做数据的高位
可以这样理解么 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-06-20 17:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
X/n = int(H/n)*65536+[rem(H/n)*65536+L]/n
对这个公式还是不打理解,
究竟 商的高位 低位,余数,分别是公式里的哪个部分呢? | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-06-20 17:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
|
|
|
|
|
[第4楼]
[ 回复时间:2011-06-21 10:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
|
|
|
|
|
[第5楼]
[ 回复时间:2011-06-23 12:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20 |
|
|
|
|
|
[第6楼]
[ 回复时间:2011-06-25 17:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-25 01:04 |
|
|
|
|
|
[第7楼]
[ 回复时间:2011-06-26 21:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2011-04-27 23:01 |
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2011-06-28 15:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。
------------------
回复:
我没有QQ。其实你仔细看看后面的附录,有关于这个问题的解释。
65536只是一种说明,并不是真的让你去做乘法 | | |
|
|
|
|
[第9楼]
[ 回复时间:2011-06-28 15:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40 |
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。
------------------
回复:
我没有QQ。其实你仔细看看后面的附录,有关于这个问题的解释。
65536只是一种说明,并不是真的让你去做乘法
------------------
回复:
欢迎+我MSN一起学习讨论。最近 事情比较多,没什么时间,在 课程设计1卡着呢。。
miaoyunlong88730@hotmail.com | | |
|
|
|
|
[第10楼]
[ 回复时间:2011-07-04 02:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-01 23:30 |
刚写出来,也不知道,对不对。不过自我感觉良好,这是为什么呢,因为这是我真正的独立完成的一个程序。
还没来及看别人的答案,先放这,欢迎大家点评。为什么不先看别人的呢,我怕我的思路是错的,看了别人的,我怕我不好意思再放这啦,嘿嘿......
assume cs:code
code segment
start:mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:push ax
mov ax,dx
div cl
mov bl,ah
mov bh,0
mov ah,0
mov dx,ax
pop ax
push dx
mov dx,bx
div cx
pop dx
ret
code ends
end start | | |
|
|
|
|
[第11楼]
[ 回复时间:2011-07-04 02:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-01 23:30 |
我的思路呢就是除法最终的结果是什么呢,我仔细的研究了下div用法。
最终结果是,dx放高位,ax放低位
div 用法:
除法是8位,被除数是16位(为什么是16位呢,他不是20位吗?比如:10000h,即65536.那65536是干吗的?是个标记而已,标记是dx位而已),结果高位放在dx,低位放在ax.
mov dx,高位数
mov ax,低位数
div cl
ok,结果就出来啦,套用一下上面的公式。
那就说明是我只要把结果放在它应该呆的地方不就完成了吗。
于是,仔细研究x/n=int(h/n)*65536+[rem(h/n)*65536+L]/n
那不是把一个除法,变成两个。65536是用来标明dx位的。第一个除法算出,保存dx位。
然后算第二个除法。得到低位。
然后,再恢复入栈的高位。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2011-07-05 17:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29 |
|