彙編除法!非常疑惑

時間 2021-08-14 22:59:25

1樓:匿名使用者

「除法指令的被除數是隱含運算元,除數在指令中顯式地寫出來。cpu會根據除數是8位、16位,還是32位,來自動選用被除數ax、dx-ax,還是edx-eax。」

「組合語言中除法指令有兩種溢位的情況:一是被0除,產生0號中斷;二是當除得的商超出範圍時,即你所的除以位元組時商超出了位元組或者除以字時商超出了字,都會產生溢位。」

你用了 mov bl,10 也就是說你選擇了8位除數,那你的商也不能超過8位,所以你會產生除法溢位

所以你把除數換成bx就行了。商自動選擇為16位的。

2樓:

商在al裡存放不下,是不是就儲存到ax裡了?餘數就儲存到dx裡了啊?

想當然了,事實並非如此,

你要麼做更高位的除法,要麼自己做無溢位除法,就是把它拆成多個除法和加法

div16: ;名稱:div16

;功能:實現16位無溢位除法

;引數:dx-ax:被除數,bx:除數

;返回:dx-ax:商,bx:餘

;code folowing

push cx ;現場保護

;start

mov cx,ax

mov ax,dx

mov dx,0

div bx

push ax

mov ax,cx

div bx

mov bx,dx

pop dx

;end

pop cx ;恢復現場ret

3樓:文刀舍予

tnt你好

這個cpu沒你想的那麼聰明,那個結果溢位就是溢位了,它不會作出其他的像你說的那麼複雜的操作的

xor dx,dx

mov ax,12666

mov bx,10

div bx

4樓:匿名使用者

問題已經被你自己分析的很透徹了。

但你想想,既然已經要用到dx,而你實現時還只用ax在做被除數,所以要進行符號擴充套件cwd.

使ax->dx.ax

此時接受被除數時就應該用r16,你這裡當然是 bx了。**如下。我初學,不滿意地方還請見諒- -

.model small

.stack

.data

.code

.startup

mov ax,12666

cwdmov bx,10

div bx

mov cx,dx ;ah是餘數,al是商,ax商,dx餘數,將餘數儲存到cx儲存器中

jcxz ok ;判斷餘數是否為0

add cx,30h ;進行餘數+30h,轉化ascii碼

push cx ;進棧

pop [si] ;逆序出棧

add si,2 ;指標加2

ok: ret

.exit 0end

5樓:低智力生物

你這裡用的是

mov bl,10

應該改為

mov bx,10

6樓:這id能註冊不

應該是放在dl裡了,不要用dx吧.