1. 程式人生 > >彙編實驗10-2 解決除法溢位的問題

彙編實驗10-2 解決除法溢位的問題

程式碼及註釋:

;本程式主要意圖為製作一個子程式,實現32位被除數/16位除數因為16位暫存器不夠儲存
;而產生除法溢位的情況(如FFFFFFFF/1,16位暫存器ax儲存不了32位資料)
;子程式的實現過程在書中實驗的提示給了演算法,在理解的基礎上寫出程式即可
;以下為程式
assume cs:code,ss:stack
stack segment
	db 16 dup (0)
stack ends

code segment
start:
	mov ax,stack
	mov ss,ax		
	mov sp,16		;源程式中這條指令沒寫,無傷大雅,以上為初始化棧指標指向棧底
	
	mov ax,4240h
	mov dx,0fh
	mov cx,0ah	;ax為32位被除數的低16位資料,dx為高16位資料,cx為16位除數
	
	call divdw
	
	mov ax,4c00h
	int 21h
;子程式描述
;名稱:divdw
;功能:進行不會產生溢位的除法運算,被除數dword型,除數word型,結果為dword型
;引數:(ax)=被除數低16位、(dx)=被除數高16位、(cx)=除數
;返回:(dx)=結果的高16位、(ax)=結果低16位、(cx)=餘數
;實驗提示:
;X:被除數
;N:除數
;H:X高16
;L:X低16
;int():描述性運算子,取商
;rem():描述性運算子,取餘
;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
divdw:
	push ax
	mov ax,dx
	mov dx,0
	div cx		;計算H/L,ax中的值為最終結果的高16位(看公式可知)
	mov si,ax
	mov di,dx
	pop ax
	div cx		;因為dx儲存著H/L的餘數,可以做公式後面運算的高16位。
;取出X的低16位
   mov cx,dx	;公式後面運算結果的餘數給cx
   mov dx,si	;公式前面的運算結果之前儲存給si了


程式碼截圖及結果:


小結:

主要是演算法高階~~我沒起啥作用

必要的東西都寫在上面了。

加油把!