. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  除法溢出问题,我这哪错了啊,调试过不了  [已解决] 回复[ 3次 ]   点击[ 445次 ]  
jhszcn
[帖 主]   [ 发表时间:2008-03-30 21:19 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
divdw:        ;公式:X/N=int(H/N)*65536+[rem(H/N)*65536十L]/N

                        push bx
                        push cx
                        push di
                        push si                                        ;可能用到的寄存器入栈
                        
                        push ax                                        ;被除数低字入栈
                        mov ax,dx
                        sub dx,dx
                        div cx                                        ;计算H/N
                        push dx                                        ;余数压栈
                        mov dx,ax                                ;int(H/N)*65536
                        sub ax,ax                                ;ax清空
                        mov di,dx
                        mov si,ax                                ;di保存高字,si保存低字
                        pop dx                                        ;ren(H/N)*65536,ax已空
                        pop bx                                        ;bx=L
                        add ax,bx                                ;ax,dx=rem(H/N)*65536+L
                        div cx                                        ;再除以N,结果在ax中余数在dx中
                        mov dx,0                                ;余数清零
                        add ax,si                                ;
                        adc dx,di                                ;计算结果
                        
                        pop si                                        
                        pop di
                        pop cx
                        pop bx                                        
                        retf
kafka
[第1楼]   [ 回复时间:2008-03-30 22:09 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2007-09-18 20:38
看来楼主对公式并没有理解清楚,我给你举个例子吧: 921 / 4 , ax = 21,dx = 9,cx = 4,int(H/N)*65536+[rem(H/N)*65536十L]/N 里面的65536 变成了 100,先把 ax = 21 入栈。 9/4 = 商为2,余数为1,ax = 2,dx =1。把 ax = 2 让bx保存,mov bx,ax。dx 不用管,因为 rem(H/N)*100 还要用,pop ax ,这时dx 就是 1,ax =21,其实 就是 rem(H/N)*100十L,然后 div cx ,结果就是 商是 30 余数是1,ax = 30,dx =1,把 dx =1 给 cx,再把 刚才的 让bx 保存的余数 2 转给 dx, mov dx,bx.结果就是 dx = 2,ax=30 ,余数是 1,230 余1.
遇到问题 应该从简单开始思考,看似 复杂的东西,其实就是 简单东西的变形。

理解了 公式,这个 程序就好写了 ,除了可能用到的寄存器入栈出栈,divdw 这个子程序用 10 条指令就可以 完成了,不信?我给你发我的源代码,开个玩笑。如果需要 我的代码 交流,我会 发出来。
jhszcn
[第2楼]   [ 回复时间:2008-03-31 21:06 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
此贴由 贴主 于 [ 2008-03-31 21:06 ] 结贴。 结贴原因:问题已解决
jhszcn
[第3楼]   [ 回复时间:2008-03-31 21:07 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
谢谢dafka的指点:)
得分情况: 1楼(kafka):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved