1、大數加法:兩個128位相加
; 名稱 add128
; 功能 兩個128位資料相加
; 參數 ds:si 指向第一個數;ds:di指向第二個數;結果存放于ds:si
add128:
push ax ; 保護資料
push cx
push si
push di
sub ax,ax ; 清零CX
mov cx,8 ; 128位8位元組
s: mov ax,[si] ; 循環
adc ax,[di] ; 計算
mov [si],ax
inc si ; 不用add si.2
inc si
inc di
inc di
loop s ; 循環結束
pop di
pop si
pop cx
pop ax
ret
2、不會産生溢出的除法運算
;名稱:divdw
;功能:進行不會産生溢出的除法運算,被除數為dword型,除數為word型,結果為dword型。
;參數:(ax)=dword型資料的低16位;
; (dx)=dword型資料的高16位;
; (cx)=除數。
;傳回:(dx)=結果的高16位;
; (ax)=結果的低16位;
; (cx)=餘數。
divdw:
push si ; 儲存資料
push bx
push ax
mov ax,dx
mov dx,0
div cx ;被除數的高位/cx,高位在ax,餘數在dx
mov si,ax
pop ax
div cx ;(被除數高位的商+低位)/cx,高位在ax,餘數在dx
mov cx,dx ;餘數入cx
mov dx,si ;高位的商入dx
pop bx
pop si
ret
公式x/n=int(h/n)*65536+[rem(h/n)*65536+l]/n解析:
把一個會溢出的除法 變成幾個除法來做!
如果高位除法有商,那麼商就是結果的高位值,如果會有餘數,那麼餘數自然不能丢棄,餘數就作為低位除法的dx(也就是高位的被除數,因為他是從高位除法中餘下的)
做低位除法的時候,就拿餘下的dx+低位數的ax除以除數,會得到 一個低位的商 和 餘數
高位的商+低位數的商+餘數 就是結果