彙編實驗10-2 解決除法溢位的問題
阿新 • • 發佈:2019-02-03
程式碼及註釋:
;本程式主要意圖為製作一個子程式,實現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了
程式碼截圖及結果:
小結:
主要是演算法高階~~我沒起啥作用
必要的東西都寫在上面了。
加油把!