組合語言 除法出錯,彙編除法的問題

時間 2023-07-17 06:07:33

1樓:做而論道

cpu 執行除法指令(如:div cx、div bl)時,是有可能溢位的。

如果被除數較大,或除數較小,都可能使「商」超出預定位數,此時,就會溢位。

特別是當除數為零時,必然會出現:divide overflow。

直接使用 div 指令,有一定的風險,一不小心就溢位了。

特別是數字不明確的時候。

因此,在執行 div 指令之前,應該加以判斷,以免發生溢位。

一般來說,當被除數的高位,小於除數時,就不會發生「溢位」。

如果高位為零,比如 dx = 0、ah = 0,這就肯定不會溢位。

較好的方法是:編寫一個「不會溢位」的除法程式。

方法思路如下:

左圖是 cpu 執行 16 位數除以 8 位數時的操作。

在右圖中,被除數:1a 2b 3c 4dh,有 32 位數。

除數是:bl,僅有 8 位數。

商,是:32 位數。

按照圖中的步驟,需要執行四次 div bl。

只要 bl 不為零,就絕對不會發生溢位。

按此思路,被除數的位元組數,可以繼續增加,僅受制於記憶體的大小。

這就是說:被除數,可以認為是無限的。

2樓:歐慶稱嘉惠

用你程式中這樣的資料運算,除法必然會出錯。

在你的程式中,div

bl這條指令,是用ax中的1200除以bl中的28086的除法指令,要求被除數的高一半,小於除數,以確保除法運算的商不會溢位。

由於你的除數是2,所以,被除數的高一半(即ah中的內容)必須小於2,只能是0或1。這樣,被除數(ax中的內容)的大小只能在0~511這個範圍內。大於511(比如,你用的1200),就會除法溢位。

彙編除法的問題

3樓:網友

x86的16bit模式的無符號除法div有bit被除數 除以 8bit除數。

bit dx加16bit ax 除以 16bit除數兩種格式。

大於65535的資料」即大於16bit的資料,就要先化成第2種方式處理。

但現代的cpu另有32bit和64bit模式。

在非真實模式的彙編下,可以用。

bit edx加32bit eax 除以 32bit除數bit rdx加64bit rax 除以 64bit除數即可以直接處理32bitbit、128bit的資料的除法。

回到8086 16bit下,通常還是把32bit的資料看成2個16bit,mov分別移到ax,dx

而不是直接32bit,因為16bit晶片設計就是為了最佳處理16bi的資料t,沒有32bit資料的處理,必須先拆吧。

組合語言除法,彙編除法的問題

組合語言中求餘數可以使用div和idiv指令,兩者分別用於無符號整數除法和有符號整數除法,計算商和餘數並存入指定位置。div unsigned divide 無符號數除法。格式 div src 執行的操作 位元組操作 16位被除數在ax,8位除數為源運算元,結果的8位商在al中,8位餘數在ah中。表...

組合語言問題,組合語言問題

蜜蜂小玉米 assume cs code assume ds data data segment db i love you.data ends code segment start mov ax,data mov ds,ax mov bx,0 s0 check mov al,ds bx cmp a...

組合語言程式設計,組合語言程式設計

org 0000h ljmp main org 000bh ljmp t0int org 0030h main mov tmod,01h mov th0,high 65536 5000 mov tl0,low 65536 5000 setb tr0 setb et0 setb ea clr a sj...