✔ 最佳答案
上一次寫ASSEMBLY可能是十多廿年前的事!!
唔係assembly唔流行,而係應用上真的少了。
基於cpu越來越強,ram越來越多,真的要寫assembly應用上的快、小已沒有從前重要。另一個情況係應用系統比前複雜,花在寫assembly的時間太長,不實際。(註︰現時program跑得慢,沒有人說程式寫得不好,一定是你的電腦慢!!)
要真正寫assembly可能只餘下寫mcu的有限資源的程序,不過,現時大部份mcu也很強,開發也可以用c語言。由機器編成最終執行的機械語言在速度上打折扣也影響不大了。用C的另一個好處是較易轉移到另一種MCU上應用。(不可能做到真正的source protable)
assembly基本上已是機械語言。只差把部份如16BIT,8BIT相同指令歸一,令人員更易理解。
你的問題『mov ax,ffff // mov bl,1 // div bl』,即係16bit除以8bit數,正正歸入要編寫程式員自行處理的類別。會出現overflow。
沒有徹底解決辦法,因為數學上就是這樣,只能以邏輯去想方法,因為只有你才知到,在執行時會否有這個情況出現。
要避免你的overflow出現其實很易,只要用32bit除就可以了。
如下 ,把ax extend到32bit,因為你其實要做的是16bit,所以把dx設為0就可,同時bl須變成16bit,即係把bh設為0,或者索性變為mov bx,1就可,
變成 mov dx,0; mov ax,ffff; mov bx,1; div bx,答案在 ax,餘數在 dx。
問題解決!
不過,你又可能會問,那麼當dx:ax等於 FFFF:FFFF時,除以1會出現相同情況,因為答案不能存於ax中,是的,但是大前提是你要做的只是被除數是ax,所以問題並不存在,因為dx永遠要0。
若情況是你真的要用32bit相除,那麼用相同招式,採用64bit的 edx:eax可解決。
回頭說,寫assembly的麻煩地方正正在於要編程者想得通透一點、聰明一點。
舉一例,例如要除二,當然你可以用div,但叻的programmer會用shr。(相同是乘2只要用shl)
再舉一例,如要把 ax和bx對調,你可以借用cx,或者一個temp記憶,慢,同埋cx唔一定空出來可用。和相信大部份識寫programm的朋友都係咁諗。聰明一點的可以用xor。留給你自己想一想。
後記︰其實你的問題我是一路看一路才想,在寫assembly生涯要用到div真的好像沒有,頂多是要除2,會做shr,要除3,我會shr,再減一次等。想不到什麼情況要除一個未知數。