解决除法溢出问题
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