. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  求教    实验10,第2题,解决除法溢出 ,如何 乘以 65536?  [待解决] 回复[ 12次 ]   点击[ 374次 ]  
miaoasm
[帖 主]   [ 发表时间:2011-06-20 11:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
求教

16位只能表示 0~65535,可公式里有 个 65536?如何处理?
乘以 65535再加上 被乘数么?

还是有什么更好的办法?
miaoasm
[第1楼]   [ 回复时间:2011-06-20 15:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
我好像明白了
那个65536没有必要真的去乘以它,

他前面的数字可以当做数据的高位

可以这样理解么
miaoasm
[第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
对这个公式还是不打理解,
究竟 商的高位 低位,余数,分别是公式里的哪个部分呢?
miaoasm
[第3楼]   [ 回复时间:2011-06-20 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
。。。好像明白了,我再想想看。。。。4连了都
miaoasm
[第4楼]   [ 回复时间:2011-06-21 10:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
好的,问题解决了 ~5连~
rotapple
[第5楼]   [ 回复时间:2011-06-23 12:20 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
它表示它是高位,不是让你乘。
shweei
[第6楼]   [ 回复时间:2011-06-25 17:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-25 01:04
我明白,但是讲不明白.
quexiao521
[第7楼]   [ 回复时间:2011-06-26 21:45 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2011-04-27 23:01
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。
miaoasm
[第8楼]   [ 回复时间:2011-06-28 15:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。
------------------
回复:

我没有QQ。其实你仔细看看后面的附录,有关于这个问题的解释。

65536只是一种说明,并不是真的让你去做乘法
miaoasm
[第9楼]   [ 回复时间:2011-06-28 15:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-13 15:40
楼主能把你的QQ留下么
我也遇到这个问题有点纠结,公式倒是懂了但是算法我有点迷惑;我没有学过任何语言基础遇到这样的问题很是纠结。
------------------
回复:

我没有QQ。其实你仔细看看后面的附录,有关于这个问题的解释。

65536只是一种说明,并不是真的让你去做乘法
------------------
回复:
欢迎+我MSN一起学习讨论。最近 事情比较多,没什么时间,在 课程设计1卡着呢。。
miaoyunlong88730@hotmail.com
zyek
[第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
zyek
[第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位。
然后算第二个除法。得到低位。
然后,再恢复入栈的高位。
vs9841
[第12楼]   [ 回复时间:2011-07-05 17:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29
论坛一位大侠回答不错,可以看看。
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1011&qkSg=2&qID=37084&readSg=1
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved