Beng! 发表于 2012-4-20 00:41:11

【实验十】2.解决除法溢出问题

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

绞尽脑汁想出来的方法{:5_99:}
有点繁琐,不知道谁有比较好的方法 学习一下
我的程序如下:
;X/N=int(H/N)*10000H+/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的值,再计算/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),完成
div cx      ;/N


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

code ends
end start

hxs554f 发表于 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,   ;放置除数 注意这是数字,两个数字为一个字节
               mov ax,   ;将被除数的高8位放在ax中
               mov dx,0         ;将dx置零
               div cx
               push ax          ;将高位的除法结果保护起来
                              
               mov ax,         ;将被除数的低8位放在ax中
         div cx         ;注意,16位除法默认dx放高位,ax放低位。
                   ;而之前除法的余数是放在dx中   公式:X/N=int(H/N)*65536+/N
               mov ,dx   ;将结果的余数放入
               mov ,ax       ;将商的低位放入
               pop ax
               mov ,ax      ;将商的高位放入
               ret
code ends
end start

Beng! 发表于 2012-4-20 14:58:37

hxs554f 发表于 2012-4-20 12:35 static/image/common/back.gif
;半年前写的,拿来分享一下
;设计一个子程序,用于解决除法溢出问题。被除数为dword型,除数为word型
ass ...

终于看明白内个公式是怎么回事了~
谢谢亲{:5_106:}
页: [1]
查看完整版本: 【实验十】2.解决除法溢出问题