编写不会产生除法溢出的子程序

divdw:           不溢出除法,被除数为dword,除数为word,结果为dword 

;参数:(dx):(ax)=被除数高、低16位  (cx)=除数 
;返回:(dx):(ax)=结果的高、低16位  (cx)=余数 

h,L表示被除数H的高16位和低16位,int(h/n)取商,rem(h/n)取余。n代表除数.

 采用公式:x/n=int(h/n)*65536+[rem(h/n)*65536+L]/n 

即:int(h/n)作高16位,             rem(h/n)做被除数高16位,L做低16位,除以n 的结果做 低16位。

最开始相当很复杂,答案很简单:

assume cs:code

code segment
start:mov ax,4240h ;dword型数据的低16位
        mov dx,000fh ;dword型数据的高16位
        mov cx,0Ah   ; c除数
        call divdw 
        mov ax,4c00h
        int 21h

divdw:   push si
         push ax
         mov ax,dx ;ax存储高位
         mov dx,0
         div cx
         mov si,ax ;si存储商,dx存放余数
         
         pop ax ;ax存储低位
         div cx   ;运算后ax存储结果的低位
         
         mov cx,dx ;余数
         mov dx,si ;dx存储高位
         pop si
         
         ret


  code ends
  end start

  下面是自己写的一段简洁的代码:

divdw:
        mov di,ax 
        mov ax,dx ;ax 存储高16位
        mov dx,0
        div cx ;ax 商,dx余
         
        push ax
        
        mov ax,di
        div cx  ;ax运算后为余安照公式存储低16位
        mov  cx,dx ;存储余数,最开始忘记了
        
        pop dx ;dx接受开始的ax
        
        ret

下面的代码跟以上类似:

divdw: ;子程序定义开始

push ax

mov ax,dx

mov dx,0

div cx

mov bx,ax

pop ax

div cx

mov cx,dx

mov dx,bx

ret ;子程序定义结束
原文地址:https://www.cnblogs.com/youxin/p/2524751.html