鱼C论坛

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

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

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

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

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

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


          
  1. assume cs:code
  2. data segment
  3.        dd 0,0,0,0,0,0,0,0
  4.        dw 0,0,0,0,0,0,0,0
  5. data ends
  6. code segment
  7. start:
  8.        mov ax,4240h
  9.            mov dx,000fh
  10.            mov cx,0ah
  11.            call divdw
  12.           
  13.            mov ax,4c00h
  14.            int 21h
  15.           
  16. divdw:
  17.        mov bx,data
  18.            mov ds,bx                     ;定义存储单元地址
  19.           
  20.            mov ds:[0],dx
  21.       
  22.            mov dx,0
  23.            div cx                        ;做低位除法
  24.            mov ds:[2],ax                 ;存储低位商
  25.            mov ds:[4],dx                 ;存储低位余数
  26.           
  27.            mov dx,0
  28.            mov ax,ds:[0]
  29.            div cx                         ;做高位除法
  30.            mov ds:[6],ax                  ;存储高位商
  31.            mov ds:[8],dx                  ;存储高位余数
  32.           
  33.            mov ax,0
  34.            div cx                         ;用高位余数继续做除法(断言:该除法不超界)
  35.            mov ds:[10],ax                 ;存储高位余数除法的商
  36.            mov ds:[12],dx                 ;存储高位余数除法的余数
  37.           
  38.            mov ax,ds:[4]
  39.            add dx,ax
  40.            mov ax,dx
  41.            mov dx,0
  42.            div cx                         ;用余数之和继续做除法(这里存疑,因为余数之和可能超界)
  43.            mov ds:[14],ax                 ;存储余数之和除法的商
  44.            mov ds:[16],dx                 ;存储余数之和除法的余数
  45.           
  46.            mov cx,ds:[16]                 ;给出最终余数
  47.           
  48.            mov ax,ds:[2]
  49.            mov dx,ds:[10]
  50.            add ax,dx
  51.            mov dx,ds:[14]
  52.            add ax,dx                      ;给出最终商的低16位(断言:该加法不超界)
  53.           
  54.            mov dx,ds:[6]                  ;给出最终商的高16位
  55.           
  56.            ret
  57.           
  58. code ends
  59. end start
  60.           
复制代码

问题:解决标示存疑处加法溢出问题,以及该方案的效率
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-12 21:16:21 | 显示全部楼层
不直接使用书中给出的提示公式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

加法超界,先判断是否超界
若是超界,则寄存器里的值小于加的数,则高位需要加1
若是未超界,则寄存器的值不小于加的数,则高位无需加1
问题就转化成判断两个数大小的问题
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-15 14:13:34 | 显示全部楼层
多谢分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 17:37:47 | 显示全部楼层
看看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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