汇编网首页登录博客注册
assumechen的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2012-07-11 21:18] 实验10:divdw的实现

assume cs:code

code segment
start:
        mov ax,4240H
        mov dx,000FH
        mov cx,0AH
        call divdw
        
        mov ax,4c00H
        int 21H

; 名称: divdw
; 功能: 进行不会溢出的除法运算
; 参数:(ax)=dword型数据的低16位
;        (dx)=dword型数据的高16位
;        (cx)=除数
; 返回        (dx)=结果的高16位,(ax)=结果的低16位
;        (cx)=余数
; 公式: X/N = INT(H/N)*65536 + [REM(H/N)*65536+L]/N
divdw:        
        PUSH DI
        PUSH SI
        PUSH BX
        
        MOV BX,AX
        MOV BP,DX
        MOV AX,DX
        MOV DX,0
        DIV CX  ; AX保存商,DX保存余数
        MOV SI,AX        ; 保存高位的商
         
        MOV DX,0
        MOV AX,BP
        DIV CX
        MOV DI,DX  ; 保存高位的余数
        
        MOV DX,DI
        MOV AX,BX
        DIV CX     ; 计算低位字节
        
        MOV CX,DX
        MOV DX,SI
        
        POP BX
        POP SI
        POP DI
        RET
        
code ends

end start

经fpamc提醒后,简化后代码如下:

assume cs:code 

code segment 
start: 
        mov ax,4240H 
        mov dx,000FH 
        mov cx,0AH 
        call divdw 
         
        mov ax,4c00H 
        int 21H 

; 名称: divdw 
; 功能: 进行不会溢出的除法运算 
; 参数:(ax)=dword型数据的低16位 
;        (dx)=dword型数据的高16位 
;        (cx)=除数 
; 返回        (dx)=结果的高16位,(ax)=结果的低16位 
;        (cx)=余数 
; 公式: X/N = INT(H/N)*65536 + [REM(H/N)*65536+L]/N 
divdw:         
        PUSH DI 
        PUSH SI 
        PUSH BX 
         
        MOV BX,AX 
        MOV AX,DX 
        MOV DX,0 
        DIV CX                  ; 除法执行后AX保存商,DX保存余数 
        MOV SI,AX       ; SI保存高位的商
          
        MOV AX,BX 
        DIV CX                     ; 计算低位字节 
         
        MOV CX,DX 
        MOV DX,SI 
         
        POP BX 
        POP SI 
        POP DI 
        RET 
         
code ends 

end start
评论次数(3)  |  浏览次数(814)  |  类型(汇编作业) |  收藏此文  | 

[  assumechen   发表于  2012-07-11 21:19  ]

这个公式原来一直想不明白,总是觉得会溢出,直到看到这个贴子才转过来。
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1011&qkSg=2&qID=37084&readSg=1

[  fpamc   发表于  2012-07-11 23:26  ]

 MOV BX,AX 
        MOV AX,DX 
        MOV DX,0 
        DIV CX  ; AX保存商,DX保存余数 
        MOV SI,AX        ; 保存高位的商 
        
        MOV AX,BX 
        DIV CX     ; 计算低位字节 
         
        MOV CX,DX 
        MOV DX,SI 

我把你的代码简化后的样子,你看一下这样如何?

[  assumechen   发表于  2012-07-12 23:58  ]

呵呵,我把程序搞复杂了。谢谢!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码