匯編練習:不會溢出的除法

王爽老師的《匯編語言》在實驗10.2中提出了div指令可能出現(xiàn)的除法溢出的問題负蠕。例如對于16位除以8位的情形敬惦,考慮被除數(shù)是0x1234,除數(shù)是0x01儡首。根據(jù)div的約定蔬胯,商在AL中氛濒,余數(shù)在AH中迈勋。但是顯然計算結果的商是0x1234,8位的AL無法容納,因此會產(chǎn)生除法溢出馍惹。使用Bochs調(diào)試時,會在div之后出現(xiàn)iret窥突,即CPU產(chǎn)生了一個中斷返回指令努溃。
為了兼容32位對16位的除法硫嘶,設計一個雙字除法調(diào)用過程divdw:

  • 輸入:
    • 被除數(shù):一個32位的整數(shù)阻问,高16位在DX中,低16位在AX中
    • 除數(shù):一個16位的整數(shù)沦疾,存儲在CX中
  • 輸出:
    • 商:32位的整數(shù)称近,高16位在DX中第队,低16位在AX中
    • 余數(shù):16位整數(shù),儲存在CX中

因為商也是雙字長刨秆,因此divdw過程一定不會發(fā)生除法溢出凳谦。這是因為,考慮被除數(shù)最大是0xFFFFFFFF衡未,除數(shù)最小是0x0001尸执,則商最大為0xFFFFFFFF,不會超過雙字長缓醋。但是直接使用div指令是無法辦到的如失,所以我們下面需要設計divdw的過程。首先給出一個數(shù)論中關于帶余數(shù)除法的引理:

(帶余數(shù)除法):設a,b是兩個整數(shù)送粱,b\neq0褪贵,則存在唯一的整數(shù)對(p,r),使得a=pb+r\quad (0\leqslant r <|b|)

我們接下來約定抗俄,符號\frac{a}{ b}表示實數(shù)除法脆丁,\mathrm{int}(\frac{a})表示整數(shù)除法的商动雹,相當于上面的p槽卫;\mathrm{rem}(\frac{a})表示整數(shù)除法的余數(shù)胰蝠,相當于上面的r晒夹。例如,對于a=7,b=3姊氓,我們有\frac{a}{ b}=2.333\dotsc,\mathrm{int}(\frac{a}丐怯)=2,\mathrm{rem}(\frac{a})=1

現(xiàn)在來考慮雙字除法翔横。設被除數(shù)如下:D=\mathrm{0x\ }\underbrace{a_{31}a_{30}\dotsc a_{16}}_{DX}\underbrace{a_{15}a_{14}\dotsc a_{0}}_{AX}如同我們可以把10進制數(shù)1234寫成12\times100+34读跷,16進制下的數(shù)D可以寫為\begin{split} D&=\mathrm{0x\ }\underbrace{a_{31}a_{30}\dotsc a_{16}}_{H}\times \mathrm{0x}\underbrace{100\dotsc0}_{16\;0's}+\mathrm{0x}\underbrace{a_{15}a_{14}\dotsc a_{0}}_{L}\\&=H\times65536+L\end{split}顯然HL分別是寄存器DXAX中的值。
現(xiàn)在設除數(shù)是n禾唁,從而\frac{D}{n}=\frac{H}{n}\times 65536+\frac{L}{n}再次強調(diào)此時我們表示的是實數(shù)除法效览。根據(jù)整數(shù)帶余數(shù)除法引理,對于H,n荡短,又存在唯一的如下表示H=\mathrm{int}(\frac{H}{n})\times n+\mathrm{rem}(\frac{H}{n})其中0\leqslant \mathrm{rem}(\frac{H}{n}) <n丐枉,從而\frac{H}{n}=\mathrm{int}(\frac{H}{n})+\frac{\mathrm{rem}(H/n)}{n},于是\begin{split} \frac{D}{n}&=\left(\mathrm{int}(\frac{H}{n})+\frac{\mathrm{rem}(H/n)}{n}\right)\times 65536+\frac{L}{n}\\ &=\mathrm{int}(\frac{H}{n})\times 65536+\frac{1}{n}\left(\mathrm{rem}(\frac{H}{n})\times65536+L \right)\end{split}因為H是16位的掘托,因此H除以n的整數(shù)部分\mathrm{int}(H/n)必然也不超過16位瘦锹。
對于括號中的部分,討論其取值范圍(設n是正整數(shù))\begin{split} 0\leqslant& \mathrm{rem}(\frac{H}{n})\leqslant n-1\\ 0\leqslant& \mathrm{rem}(\frac{H}{n})\times 65536 + L \leqslant 65536\times (n-1)+L \end{split}因為L是16位整數(shù),故L<65536弯院,于是\begin{split} 0\leqslant& \mathrm{rem}(\frac{H}{n})\times 65536 + L <65536\times n \\ 0\leqslant& \frac{1}{n}\left(\mathrm{rem}(\frac{H}{n})\times65536+L \right)< 65536 \end{split}由此可知辱士,對其取整的結果:\mathrm{int}\left[\frac{1}{n}\left(\mathrm{rem}(\frac{H}{n})\times65536+L \right)\right]不超過16位。

現(xiàn)在听绳,令\begin{cases} P&=\mathrm{int}(H/n)\\ Q&=\mathrm{int}\left[\frac{1}{n}\left(\mathrm{rem}(\frac{H}{n})\times65536+L \right) \right]\\ r&=\frac{1}{n}\left(\mathrm{rem}(\frac{H}{n})\times65536+L \right) -Q \end{cases}我們重新敘述結果:
\frac{D}{ n}=P\times 65536 + (Q+r)\quad(P,Q\in\mathbb{N},r\in\mathbb{R})換句話說
D=(P\times65536+Q)\times n + r\times n顯然n\times r是整數(shù)颂碘,并且n\times r<r。這是因為通過定義可知椅挣,r是實數(shù)(\mathrm{rem}(H/n)\times65536+L)/n減去它的整數(shù)部分(即Q)头岔,因此結果就是該實數(shù)的小數(shù)部分,因此r\in[0,1)鼠证,從而n\times r\in\{0,1,\dotsc,n-1\}切油,根據(jù)帶余數(shù)除法引理,這個余數(shù)n\times r是唯一的名惩。

因此我們有
\begin{cases} \mathrm{int}(\frac{D}{ n})&=P\times 65536 +Q \\ \mathrm{rem}(\frac{D}{ n})&=n\times r=D-(P\times65536+Q) \end{cases} 因為P,Q均不超過16位澎胡,因此除法結果,商的高16位P存儲在DX中娩鹉,低16位Q存儲在AX中攻谁,余數(shù)\mathrm{rem}(\frac{D}{n})不能大于除數(shù)n,故而也可以安全存儲在CX中弯予。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戚宦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锈嫩,更是在濱河造成了極大的恐慌受楼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呼寸,死亡現(xiàn)場離奇詭異艳汽,居然都是意外死亡,警方通過查閱死者的電腦和手機对雪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門河狐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑟捣,你說我怎么就攤上這事馋艺。” “怎么了迈套?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵捐祠,是天一觀的道長。 經(jīng)常有香客問我桑李,道長踱蛀,這世上最難降的妖魔是什么窿给? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮星岗,結果婚禮上填大,老公的妹妹穿的比我還像新娘戒洼。我一直安慰自己俏橘,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布圈浇。 她就那樣靜靜地躺著寥掐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷蜀。 梳的紋絲不亂的頭發(fā)上召耘,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音褐隆,去河邊找鬼污它。 笑死,一個胖子當著我的面吹牛庶弃,可吹牛的內(nèi)容都是我干的衫贬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼歇攻,長吁一口氣:“原來是場噩夢啊……” “哼固惯!你這毒婦竟也來了?” 一聲冷哼從身側響起缴守,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤葬毫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屡穗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贴捡,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年村砂,在試婚紗的時候發(fā)現(xiàn)自己被綠了栈暇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍镜,死狀恐怖源祈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色迂,我是刑警寧澤香缺,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站歇僧,受9級特大地震影響图张,放射性物質發(fā)生泄漏锋拖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一祸轮、第九天 我趴在偏房一處隱蔽的房頂上張望兽埃。 院中可真熱鬧,春花似錦适袜、人聲如沸柄错。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售貌。三九已至,卻和暖如春疫萤,著一層夾襖步出監(jiān)牢的瞬間颂跨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工扯饶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恒削,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓尾序,卻偏偏與公主長得像钓丰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹲诀,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349