鱼C论坛

 找回密码
 立即注册
查看: 3206|回复: 7

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

[复制链接]
发表于 2020-1-12 21:13:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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:[0],dx
       
           mov dx,0
           div cx                        ;做低位除法
           mov ds:[2],ax                 ;存储低位商
           mov ds:[4],dx                 ;存储低位余数
           
           mov dx,0
           mov ax,ds:[0]
           div cx                         ;做高位除法
           mov ds:[6],ax                  ;存储高位商
           mov ds:[8],dx                  ;存储高位余数
           
           mov ax,0
           div cx                         ;用高位余数继续做除法(断言:该除法不超界)
           mov ds:[10],ax                 ;存储高位余数除法的商
           mov ds:[12],dx                 ;存储高位余数除法的余数
           
           mov ax,ds:[4]
           add dx,ax
           mov ax,dx
           mov dx,0
           div cx                         ;用余数之和继续做除法(这里存疑,因为余数之和可能超界)
           mov ds:[14],ax                 ;存储余数之和除法的商
           mov ds:[16],dx                 ;存储余数之和除法的余数
           
           mov cx,ds:[16]                 ;给出最终余数
           
           mov ax,ds:[2]
           mov dx,ds:[10]
           add ax,dx
           mov dx,ds:[14]
           add ax,dx                      ;给出最终商的低16位(断言:该加法不超界)
           
           mov dx,ds:[6]                  ;给出最终商的高16位
           
           ret
           
code ends
end start
           
问题:解决标示存疑处加法溢出问题,以及该方案的效率
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-12 21:16:21 | 显示全部楼层
不直接使用书中给出的提示公式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-12 21:24:56 | 显示全部楼层
以上是在参考书中给出提示之前自己给出的代码,若是按照书中,则直接将高位余数左移4位加上低位被除数,这样可以直接跳过分开做除法,导致的余数之和可能溢出问题,所以是否可以给出解决加法超界问题的子程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

加法超界,先判断是否超界
若是超界,则寄存器里的值小于加的数,则高位需要加1
若是未超界,则寄存器的值不小于加的数,则高位无需加1
问题就转化成判断两个数大小的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-15 14:13:34 | 显示全部楼层
多谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 17:37:47 | 显示全部楼层
看看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 02:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表