日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言:实验10 根据材料编程—2.解决除法溢出的问题

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言:实验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.解决除法溢出的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。