关于除法超界实验的设计带来的疑问(加法超界限)
本帖最后由 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
问题:解决标示存疑处加法溢出问题,以及该方案的效率 不直接使用书中给出的提示公式 以上是在参考书中给出提示之前自己给出的代码,若是按照书中,则直接将高位余数左移4位加上低位被除数,这样可以直接跳过分开做除法,导致的余数之和可能溢出问题,所以是否可以给出解决加法超界问题的子程序 z827901654 发表于 2020-1-12 21:24
以上是在参考书中给出提示之前自己给出的代码,若是按照书中,则直接将高位余数左移4位加上低位被除数,这 ...
加法超界,先判断是否超界
若是超界,则寄存器里的值小于加的数,则高位需要加1
若是未超界,则寄存器的值不小于加的数,则高位无需加1
问题就转化成判断两个数大小的问题 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 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 多谢分享! 看看看
页:
[1]