天天看點

13、王爽《彙編語言》筆記_子程式二

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除以除數,會得到 一個低位的商 和 餘數

高位的商+低位數的商+餘數 就是結果