解决除法溢出问题

October 10, 2013
masm

被除数是dword型,除数是dword型,结果是dword型。

参数:

  ax=dword型数据的低16位

  dx=dword型数据的高16位

  cx=除数

返回:

  dx=结果的高16位,ax=结果的低16位

  cx=除数

assume cs:code, ss:stack

stack segment
    dw 10h dup(0)
stack ends

code segment
start:
    mov ax, 4240h
    mov dx, 0fh
    mov cx, 0ah
    call divdw

divdw:
    ; H=int(X/65536) L=rem(X/65536)
    push ax
    ; H / n
    mov ax, dx
    mov dx, 0
    div cx
    mov si, ax
    ; (rem(H/n) * 65536 + L) / n
    pop ax
    div cx
    ;remain cx gotten
    mov cx, dx
    mov dx, si
    ret

    mov ax, 4c00h
    int 21h
code ends

end start

这个程序写了差不多两天==

我只想说,当初我想复杂了,没有把问题i想清楚,没有分析清楚,搞的我各种分析溢出……写了差不多100行,彻底晕了=_=

后来才想明白。注意,*65536直接左移16位,也就是一个16位寄存器。

哎,今天心情糟糕透了……o(╯□╰)o

comments powered by Disqus