第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

DOSBox上的8086匯編:帶有idiv指令的Bug?

DOSBox上的8086匯編:帶有idiv指令的Bug?

DOSBox上的8086匯編:帶有idiv指令的Bug?我?guī)椭业囊粋€朋友調(diào)試他的程序,我們把它縮小到一個甚至在這里發(fā)生的問題:.MODEL small.STACK 16.CODEstart:     mov ax, 044c0h     mov bl, 85     idiv blexit:     mov ax, 4c00h     int 21hend start用tasm 4.1組裝它,然后在DOSBox 0.74上運行它,它進入一個無限循環(huán)。當渦輪調(diào)試器檢查它人們可以看到它之后發(fā)生idiv的指令,這對于一些原因,修改cs和ip登記,并經(jīng)過兩次看似隨意指令恢復(fù)它們指向idiv線,再次執(zhí)行它循環(huán)往復(fù)。有沒有人對此有任何解釋?
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經(jīng)驗 獲得超11個贊

這個問題是其他部門相關(guān)失敗的變種。該x86標簽的wiki有一些額外的鏈接:

  • idivdiv問題: 首先為零edx,或者對其進行符號擴展eax。。div如果64b / 32b => 32b商實際上不適合32b,則為32位故障。


您的調(diào)試器似乎跳轉(zhuǎn)到的明顯隨機代碼是Arithmetic Exception處理程序(也與Divide by Zero相同)。發(fā)生的事情是你的代碼正在經(jīng)歷一個Division Overflow。你正在做一個16位/ 8位IDIV。從文檔:

符號除以AX / r8,結(jié)果存儲在:AL←商,AH←余數(shù)。


https://img1.sycdn.imooc.com//5d53bf550001c68707050094.jpg

您會注意到,對于具有8位除數(shù)的除法(在您的情況下為BL),商的范圍是-128到+127。044c0h IDIV85是207(十進制)。207不適合帶符號的8位寄存器,因此會出現(xiàn)除法溢出和導(dǎo)致意外問題的原因。

要解決此問題,您可以升級到16位除數(shù)。因此,您可以將除數(shù)放在BX(16位寄存器)中。那就是mov bx, 85。不幸的是,它并非如此簡單。當使用16位除數(shù)時,處理器假設(shè)被除數(shù)為32位,DX中為高16 位,AX中為低16位。

有符號劃分DX:AX乘以r / m16,結(jié)果存儲在AX←商,DX←剩余。

要解決此問題,您必須簽署擴展AX中的16位值。這很簡單,因為您只需在將值放入AX后使用CWD指令。從指令集引用

DX:AX←AX的符號擴展。

實際上,如果AX的最高有效位(MSB)為0,則DX將變?yōu)?.如果MSB為1,則DX將變?yōu)?ffffh(所有位設(shè)置為1)。數(shù)字的符號位是MSB。

考慮到所有這些,您的分區(qū)代碼可以調(diào)整為采用16位除數(shù):

mov ax, 044c0h

cwd                ; Sign extend AX into DX (DX:AX = 32-bit dividend)

mov bx, 85         ; Divisor is 85

idiv bx            ; Signed divide of DX:AX by BX


查看完整回答
反對 回復(fù) 2019-08-14
  • 1 回答
  • 0 關(guān)注
  • 653 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號