z827901654 发表于 2020-1-12 21:13:46

关于除法超界实验的设计带来的疑问(加法超界限)

本帖最后由 z827901654 于 2020-1-12 21:13 编辑


           assume cs:code
data segment
       dd 0,0,0,0,0,0,0,0
       dw 0,0,0,0,0,0,0,0
data ends
code segment
start:
       mov ax,4240h
           mov dx,000fh
           mov cx,0ah
           call divdw
          
           mov ax,4c00h
           int 21h
          
divdw:
       mov bx,data
           mov ds,bx                     ;定义存储单元地址
          
           mov ds:,dx
      
           mov dx,0
           div cx                        ;做低位除法
           mov ds:,ax               ;存储低位商
           mov ds:,dx               ;存储低位余数
          
           mov dx,0
           mov ax,ds:
           div cx                         ;做高位除法
           mov ds:,ax                  ;存储高位商
           mov ds:,dx                  ;存储高位余数
          
           mov ax,0
           div cx                         ;用高位余数继续做除法(断言:该除法不超界)
           mov ds:,ax               ;存储高位余数除法的商
           mov ds:,dx               ;存储高位余数除法的余数
          
           mov ax,ds:
           add dx,ax
           mov ax,dx
           mov dx,0
           div cx                         ;用余数之和继续做除法(这里存疑,因为余数之和可能超界)
           mov ds:,ax               ;存储余数之和除法的商
           mov ds:,dx               ;存储余数之和除法的余数
          
           mov cx,ds:               ;给出最终余数
          
           mov ax,ds:
           mov dx,ds:
           add ax,dx
           mov dx,ds:
           add ax,dx                      ;给出最终商的低16位(断言:该加法不超界)
          
           mov dx,ds:                  ;给出最终商的高16位
          
           ret
          
code ends
end start
          
问题:解决标示存疑处加法溢出问题,以及该方案的效率

z827901654 发表于 2020-1-12 21:16:21

不直接使用书中给出的提示公式

z827901654 发表于 2020-1-12 21:24:56

以上是在参考书中给出提示之前自己给出的代码,若是按照书中,则直接将高位余数左移4位加上低位被除数,这样可以直接跳过分开做除法,导致的余数之和可能溢出问题,所以是否可以给出解决加法超界问题的子程序

z827901654 发表于 2020-1-13 02:40:38

z827901654 发表于 2020-1-12 21:24
以上是在参考书中给出提示之前自己给出的代码,若是按照书中,则直接将高位余数左移4位加上低位被除数,这 ...

加法超界,先判断是否超界
若是超界,则寄存器里的值小于加的数,则高位需要加1
若是未超界,则寄存器的值不小于加的数,则高位无需加1
问题就转化成判断两个数大小的问题

z827901654 发表于 2020-1-13 02:54:11

z827901654 发表于 2020-1-13 02:40
加法超界,先判断是否超界
若是超界,则寄存器里的值小于加的数,则高位需要加1
若是未超界,则寄存器 ...

初步设想,比较大小可以通过jcxz指令来实现
比如比较ax 和 bx 内值的大小
把ax+1的值放入cx中,dx设为0,开始循环
每次循环用dx和bx做减法,结果放入cx,jcxz成立,则跳出循环到ax大于等于bx
否则dx加1,
若是直到cx变为0,循环自然结束,则认为ax小于bx

z827901654 发表于 2020-1-13 03:01:57

z827901654 发表于 2020-1-13 02:54
初步设想,比较大小可以通过jcxz指令来实现
比如比较ax 和 bx 内值的大小
把ax+1的值放入cx中,dx设为0 ...

进一步设想,是否可以直接用加法和与FFFFH比较大小
设ax与bx相加,先验证bx是否为0,这里考虑bx不为0的情况
把bx放入cx,进入循环
用FFFFH与ax相减,结果放入cx,使用jcxz,若成立,则跳出循环跳转至ax加bx超界,更高位需要加1
否则,ax加1
若是直到cx为0,循环自然结束,则认为ax加bx不超界,高位无需加1

我来学习学习 发表于 2020-1-15 14:13:34

多谢分享!

gang19840815 发表于 2020-1-27 17:37:47

看看看
页: [1]
查看完整版本: 关于除法超界实验的设计带来的疑问(加法超界限)