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