鱼C论坛

 找回密码
 立即注册
查看: 2995|回复: 2

[争议讨论] 【实验十】2.解决除法溢出问题

[复制链接]
发表于 2012-4-20 00:41:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Beng! 于 2012-4-20 00:50 编辑

绞尽脑汁想出来的方法
有点繁琐,不知道谁有比较好的方法 学习一下
我的程序如下:
;X/N=int(H/N)*10000H+[rem(H/N)*1000H+L]/N
assume cs:code

stack segment
dw 10 dup (0)
stack ends

code segment

start:mov ax,stack
mov ss,ax
mov sp,20
mov ax,0

mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw ;(sp)=(x)
mov ax,4c00h
int 21h

divdw:push ax  ;(sp)=(x-2)
push dx  ;(sp)=(x-4)
;思路是先计算 int(H/N)*10000H的值,再计算[rem(H/N)*1000H+L]/N 的值。
;int(H/N)*10000H=int(H/N)*8000H*2
pop ax          ;取出H ;(sp)=(x-2)
mov dx,0      ;初始化DX
div cx            ;H/N 取商ax=1,dx=5

mov bx,8000h
mul bx         ;高位dx,低位ax
sub sp,2       ;(sp)=(x-4)
push dx       ;保存高位dx,(sp)=(sp-6)
mov bx,2
mul bx         ;高位dx1,低位ax1(一定为0)
pop ax         ;取出dx,(sp)=(x-4)
push dx       ;保存dx1,(sp)=(sp-6)
mul bx         ;高位dx2(一定为0),低位ax2
pop bx        ;(sp)=(x-4)
add ax,bx   ;完成 int(H/N)*1000H
push ax      ;保存 int(H/N)*1000H 的值,(sp)=(x-6)

add sp,2     ;(sp)=(x-4)
pop ax       ;取出H(sp)=(x-2)
div cx         ;取余数 dx
mov ax,dx
mov bx,8000h
mul bx       ;高位dx,低位ax
sub sp,4     ;(sp)=(x-6)
push dx     ;保存高位dx,(sp)=(x-8)
mov bx,2
mul bx       ;高位dx1,低位ax1(一定为0)
pop ax       ;取出dx,(sp)=(x-6)
push dx     ;保存dx1,(sp)=(x-8)
mul bx      ;高位dx2(一定为0),低位ax2
pop bx      ;(sp)=(x-6)
add ax,bx ;完成 rem(H/N)*1000H

add sp,4    ;(sp)=(x-2)
mov dx,ax ;将高位转移到dx
pop ax      ;取出L(sp)=(x),完成[rem(H/N)*1000H+L]
div cx        ;[rem(H/N)*1000H+L]/N


sub sp,6   ;(sp)=(x-6)
pop dx    ;(sp)=(x-4)
add sp,4  ;(sp)=(x)
ret

code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-20 12:35:10 | 显示全部楼层
本帖最后由 hxs554f 于 2012-4-20 12:36 编辑

;半年前写的,拿来分享一下
;设计一个子程序,用于解决除法溢出问题。被除数为dword型,除数为word型
assume cs:code,ds:date
date segment
  dd 33333333h             ;放置被除数
  dw 2222h              ;放置除数
  db 16 dup (0)  ;用于存放结果,低8位放商,高8位放余数
date ends
code segment
start:   mov ax,date
         mov ds,ax
                 call s
                 mov ax,4c00h
                 int 21h
        s:          mov bx,0   
                 mov cx,[bx+4]     ;放置除数 注意这是数字,两个数字为一个字节
                 mov ax,[bx+2]     ;将被除数的高8位放在ax中
                 mov dx,0           ;将dx置零
                 div cx
                 push ax          ;将高位的除法结果保护起来
                                
                 mov ax,[bx]           ;将被除数的低8位放在ax中
         div cx           ;注意,16位除法默认dx放高位,ax放低位。
                   ;而之前除法的余数是放在dx中   公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
                 mov [bx+14],dx     ;将结果的余数放入
                 mov [bx+10],ax       ;将商的低位放入
                 pop ax
                 mov [bx+6],ax      ;将商的高位放入
                 ret
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-20 14:58:37 | 显示全部楼层

终于看明白内个公式是怎么回事了~
谢谢亲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 02:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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