jjw

写给自己的博客。 记录学习的点滴以备查。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

实验10-2 divdw

Posted on 2021-02-06 11:20  jjw  阅读(100)  评论(0编辑  收藏  举报
assume cs:code,ds:data
data  segment
    db 'Welcome to masm!', 0
data  ends

code segment
start:         
        comment*
            div: n / x 
                high(n) => dx     low(n) = > ax   
            结果:    ax 为商        dx 为余数
        *comment
                         
        mov ax, 4240h            ;低位
        mov dx, 000Fh            ;高位
        mov cx, 0Ah                ;除数
        call divdw    
        mov ax, 4c00h
        int 21h

    divdw:
        ; 原公式: X/N = int(H/N)*65536 + [rem(H/N)*65536+L]/N
        ; 先做 int(H/N) * 65536 部分,因为N(即:除数)的值在cx中,
        ; cx是16位寄存器,所以要做dw / w 除法.
        ; 000Fh 可以看作 0000 000Fh 
        push ax                ; 入栈保存
        mov ax, dx        ; 000Fh 
        mov dx, 0h        ; 0000h
        div cx                ; ax = int(H/N) = 商  dx = rem(H/N) = 余数
        mov bx, ax        ; bx 暂存高位商,使 ax 可用。
         
        ; 继续做 [rem(H/N)*65536+L]/N 部分, 设 X = rem(H/N)
        ; 所以 [rem(H/N)*65536+L]/N = [X * 65536 + L] / N    = [X0000h + L] / N
        ;    此时 X 就是被除数的 高位, L 就是被除数的低位,而 X 正好在 dx 中,
        ; N 也在 cx中, pop ax 即可 
        pop ax
        div cx                ; 结果: dx 为余数, ax 为商
        ; 题目要求cx存余数, 商的高位在dx,商低位在ax,此时ax就是商的低位 
        mov cx, dx
        mov dx, bx    ; 从 bx 还原到 dx
code ends

end start