2015-08-08 127 views
1

IDIV文件(找到here)有這種怪異的行說:IDIV:檢查邊界

if(Temporary > 0x7FFFFFFF || Temporary < 0x80000000) Exception(DE); //f a positive result is greater than 7FFFFFFFH or a negative result is less than 80000000H 

到底是什麼這個錯誤檢查的意義?如果我們做了像0x80000000/-1這樣的事情,它就會失敗,但是爲什麼這樣做會使用任何東西,似乎並不直觀。

特別要注意的是,這並非全都是這樣,IMUL找到here

回答

1

idiv的分紅輸入(連接rdx:rax)是輸出和除數操作數的兩倍寬。所以如果除數不夠大,結果很容易失效。

雖然這很少發生在實踐中。使用cltq(AT & T助記符),又稱cdq/cqo(英特爾/ NASM助記符)將rax簡單地簽名擴展爲rdx是很常見的,所以這通常不會出現。 128b股息投入只會出現在高精度的情況下。 (編譯器當然更喜歡使用64位64位操作數的128乘64位,以便輕鬆支持除數不適合32位的情況,32位和16位操作數也是如此,這可能會出現在32位處理器中的int64_t/int32_t,模式,編譯器會知道升級後的32位變量在32位上面是全零的,可以直接做一個idiv,除非結果不符合32b ......)

Intel insn ref manual(請參閱x86標記wiki中的鏈接)註釋:「溢出用#DE(除錯)異常而不是用CF標誌指示。」 IDK爲什麼做出這樣的選擇,而不是僅僅通過零或其他東西來劃分錯誤。