大家可能深有體會,在使用div/idiv指令時,運行程序常常會莫明其妙的彈出"該程序執行非法操作"的錯誤,通常是"除法溢出",但是,你的代碼可能如下:
mov eax,1000
cwd
div cx
一般在使用了cwd指令後,就可以正常,但是很不穩定,我就覺得奇怪,為什麼會這樣?
huitiansou的解答:
對:“關於div/idiv/mul/imul指令的用法 by AoGo”產生Bug的原因
那是因為被除數達到了雙精度值,
所以不能用符號擴展,
而只能將高16位送0
我們只要保證edx為0就可以了,在運行32位數的除法時,建議使用這個方法,絕對不會操作非法操作(當然除0/溢出除外)
例子:
xor edx,edx
mov eax,6527363
mov ecx,28732
div ecx
你只要把上面的xor edx,edx指令一去掉,保證100%非法操作。
另外,乘法指令也可以這樣做。可以保證更安全。