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吧.