汇编语言:实验10 根据材料编程—2.解决除法溢出的问题
問題描述
用div做除法的時候可能產生除法溢出。由于有這樣的問題,在進行除法運算的時候要注意除數和被除數的值,比如1000000/10就不能用div指令來計算。那么怎么辦?我們用下面的子程序divdw解決
實驗效果
實驗要求
子程序描述
名稱:divdw
功能:進行不會產生溢出的除法運算,被除數為dword型,除數為word型,結果為dword型。
參數:(ax)=dword型數據的低16位
???? (dx)=dword型數據的高16位
???? (cx)=除數
返回:(dx)=結果的高16位,(ax)=結果的低16位
(cx)=余數
數學公式說明
書上給出提示公式:X/N = int(H/N)*65536+[rem(H/N)*65536+L]/N,到底什么意思呢?剛開始博主也是一臉懵逼。
其實書上說了 int(H/N)表示取H/N的商,商用16位才能包的住,然后?int(H/N)*65536,并不是真正的將商*65536,65536=2^16,剛好表示將商往左移16位,H/N的商為X/N結果的高16位!
[rem(H/N)*65536+L]/N 又是什么意思呢?rem(H/N)表示H/N的余數,然后右移16位 將原數據的低16位放到低位,構成32位的被除數!由于int(H/N)*65536鐵定是整數且沒有余數為X/N結果的高16位,那么結果的低16位和余數就在[rem(H/N)*65536+L]/N 中產生!后半部分除法運算的結果作為X/N的低16位,余數作為X/N的余數。
實驗代碼
;實驗10 問題2 解決除法溢出的問題 ;用div做除法的時候可能產生除法溢出。由于有這樣的問題,在進行除法運算的時候要注意除數和被除數的值 ;比如1000000/10就不能用div指令來計算。那么怎么辦?我們用下面的子程序divdw解決。 assume cs:codecode segment start:mov ax,4240hmov dx,000fhmov cx,0ahcall divdwmov ax,4c00hint 21h;名稱:divdw;功能:進行不會產生溢出的除法運算,被除數為dword型,除數為word型,結果為dword型。;參數:(ax)=dword型數據的低16位; (dx)=dword型數據的高16位; (cx)=除數;返回:(dx)=結果的高16位,(ax)=結果的低16位;(cx)=余數;核心公式X/N = INT(H/N)*65536+[REM(H/N)*65536+L]/N;X:被除數,N(cx):除數,H(dx):X的高16位,L(ax):X的低16位divdw:push bx ;寄存器不夠用,將bx拿來用push ax ;臨時存放低16位(L);計算 INT(H/N)*65536 32位除16位,商16位存放在AX中 是整個X/N結果的高16位,余數16位在DX中 剛好作為 [REM(H/N)*65536+L]的高16位mov ax,dxmov dx,0div cx mov bx,ax ;不能直接放到dx中,后面還要用到dx;計算 [REM(H/N)*65536+L]/N,商16位存放AX中 剛好作為X/N結果的低位,余數16位放DX中-> 放到CX中去pop ax ;被除數低16位還原(L),剛好作為 [REM(H/N)*65536+L]的低16位div cxmov cx,dx ;余數16位放-> CX中去mov dx,bx ;將結果高16位放->DX中去pop bx ;還原bxret code ends end start
總結
以上是生活随笔為你收集整理的汇编语言:实验10 根据材料编程—2.解决除法溢出的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ansi与Unicode编码
- 下一篇: python版:装饰器模式