. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
主题 : :  实验10   子程序2解决除法溢出问题      问题多多,请大虾指点!  [已解决] 回复[ 5次 ]   点击[ 404次 ]  
abcdwzxy
[帖 主] [ 发表时间:2009-05-18 21:05 ] 
荣誉值:0
信誉值:3
注册日期:2009-03-13 16:19
根据公式:    X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
                H=INT(X/65536);L=REM(X/65536)

我的程序是这样的:
assume
  data segment
     dw 0000000
  data ends
  code segment
   start:mov ax,data
         mov ds,ax
         mov ax,4240H
         mov dx,000fH     '设置被除数'
         mov cx,0aH       '设置除数'
         call divdw
         mov ax,4c00H
         int 21H
         
    divdw:mov bx,65536
          div bx          '计算X/65536,AX中放商(既公式中的H),DX中放余数(既公式中的L)'
          mov ds:[0],ax   '将H放在DS:[0]内存单元'
          mov ds:[2],dx   '将L放在DS:[2]内存单元'

          mov dx,0        '设置被除数,DX=0 高16位,AX低16位为H'
          div cx          '计算H/N,除数在CX中,计算后AX中为H/N的商,DX中为H/N的余数'
          
          mov ds:[4],ax   '将H/N的商放在DS:[4]内存单元'
          mov ds:[6],dx   '将H/N的余数放在DS:[6]内存单元'

          mul bx          '计算INT(H/N)*65536,结果的高16位放在DX中,低16位放在AX中'
  
          mov ds:[8],dx   '将INT(H/N)*65536结果的高16位放在DS:[8]内存单元'
          mov ds:[a],ax   '将INT(H/N)*65536结果的低16位放在DS:[A]内存单元'

          mov ax,ds:[6]   '将DS:[6]内存单元中的H/N的余数取出放在AX中'

          mul bx          '计算REM(H/N)*65536,结果的高16位放在DX中,低16位放在AX中'
 
          mov ds:[c],dx   '将REM(H/N)*65536结果的高16位放入DS:[C]内存单元'
          mov ds:[e],ax   '将REM(H/N)*65536结果的低16位放入DS:[E]内存单元'

          add ax,ds:[2]   '将REM(H/N)*65536与L相加,结果放在AX中'
          mov ds:[e],ax
           
          div cx          '计算[REM(H/N)*65536+L]/N'
 
          mov cx,dx       '结果的余数放入CX中'
          add ax,ds:[a]   'AX中放入结果的低16位'
          mov dx,ds:[8]   'DX中放入结果的高16位'
          ret
code ends
end start

这个程序我编译和连接都通过了,但是用DEBUG跟踪是会出现问题,得不到预想中的结果;
我分析了一下,在这个程序执行过中,
在  add ax,ds:[2]这条指令执行是参生了加法溢出,既REM(H/N)*65536与L相加后会参生溢出的情况(用DEBUG跟踪是看到的),但是附注的公式证明却证明了不会参生溢出情况;

还有一个问题是公式中的那个数65536  我觉得有点问题,65536刚好大于65535(FFFFH)既在BX中放不下;


请教各位该问题该如何解决啊  谢谢!!
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved