2017-04-02 11 views
-1

アセンブリ言語(intel 8086)で2桁の4桁を追加するコードを実行しています。コードのある時点で、AX = 2AB3(10進数では10931)、BX = 2710(10進数では10000)など、AXをBXレジスタ(div BXを使用)で除算したいと考えています。アセンブリ言語で分割するとオーバーフローが発生する

通常、結果としてAX = 1(商)とDX = 3A3(余り)が必要ですが、問題はエミュレータがオーバーフローメッセージを表示することです。

DATA SEGMENT 
 

 
MSG1 DB 0DH,0AH, "first number : $" ,0DH 
 
MSG2 DB 0DH,0AH, "second number : $" ,0DH 
 
RST DB 0DH,0AH, "result : $" ,0DH 
 

 
DATA ENDS 
 
PILE SEGMENT PARA STACK 
 
    DB 128 DUP (?) 
 
PILE ENDS 
 

 
CODE SEGMENT 
 
    ASSUME CS:CODE,DS:DATA,SS:PILE 
 

 
DEBUT: 
 
mov ax,data 
 
mov ds,ax 
 

 
mov dx,offset MSG1  ; first msg 
 
mov ah,9 
 
int 21h 
 

 
mov ah,1  ; multipling first number by 1000 and store it 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,1000 
 
mul bx 
 
push ax 
 

 
mov ah,1   ; multipling second number by 100 and store it 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,100 
 
mul bx 
 
push ax 
 

 
mov ah,1  ; multipling third number by 10 and store it 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,10 
 
mul bx 
 
push ax 
 
      
 
mov ah,1   ; last number 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
push ax 
 

 

 
mov dx,offset MSG2 ;same thing for the second 4 digits number 
 
mov ah,9 
 
int 21h 
 

 
mov ah,1 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,1000 
 
mul bx 
 
push ax 
 

 
mov ah,1 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,100 
 
mul bx 
 
push ax 
 

 
mov ah,1 
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
mov bx,10 
 
mul bx 
 
push ax 
 
      
 
mov ah,1   
 
int 21h 
 
sub al,30h 
 
mov ah,0 
 
push ax 
 
     ;------------------------------- 
 
     ;here I'm doing the addition to all the stored numbers to have the result number 
 
     ;in the DX register 
 
pop dx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
pop bx 
 
add dx,bx 
 
push dx ; I've stored the result number because I'm going to use the DX register to show the 
 
      ; third message 
 

 
mov dx,offset RST 
 
mov ah,9 
 
int 21h 
 

 
pop dx ;restore the result number 
 
mov ax,dx 
 
mov bx,10000 
 
div bx  ;I'm dividing the result number by 10000 to have the first number of the result number 
 
      ;in AX register (quotient) , the error message show up here 
 
push dx  
 
push ax 
 

 
pop dx 
 
add dl,30h 
 
mov ah,2 
 
int 21h 
 

 
pop ax 
 
mov bx,1000 ;deviding by 1000 to have the second number 
 
div bx  ;same error 
 
push dx 
 
push ax 
 
pop dx 
 
add dl,30h 
 
mov ah,2 
 
int 21h 
 

 
pop ax 
 
mov bx,100 
 
div bx 
 
push dx 
 
push ax 
 
pop dx 
 
add dl,30h 
 
mov ah,2 
 
int 21h 
 

 
pop ax 
 
mov bx,10 
 
div bx 
 
push dx 
 
push ax 
 
pop dx 
 
add dl,30h 
 
mov ah,2 
 
int 21h 
 

 
pop dx 
 

 
add dl,30h 
 
mov ah,2 
 
int 21h

+0

私たちは、コードあなたを見ることができる。ここ

はコードがあります再作業中、または関連する部分 – halfer

+0

命令セットリファレンスを参照しましたか?配当は「DX:AX」になっていますか? 'DX'を正しくセットアップしましたか?なぜコードを表示していないのですか?あなたはSOのgazillion重複を見ましたか? – Jester

+0

(あなたの英語は私にとってはうまくいくようですが、ここでは言語に関する謝罪は含まれません(https://stackoverflow.com/search?tab=newest&q=sorry%20for%20my%20English) - これは別のことです編集する)。 – halfer

答えて

0

この変更をお試しください:

pop dx   ;restore the result number 
mov ax,dx 
xor dx,dx   ;; added this line to clear dx 
mov bx,10000 
div bx 

またはそれができる:

pop ax   ;; restore the result into ax 
xor dx,dx   ;; added this line to clear dx 
mov bx,10000 
div bx 
+0

私は最初のことを試してみました。あなたの解決策がないとなぜ機能しないのか、私に説明してください。 –

+1

@OmarAsrih divide命令は、dx:axの32ビット値をbx(この場合)の値で除算してaxで16ビットの商を生成し、dxで16ビットの剰余を生成します。除算命令の前にdxがゼロ化されていない場合は、オーバーフローする可能性があります。この場合、正しい答えを得るにはdxをゼロにする必要があります。 – rcgldr

+0

おかげで、私はあなたの助けに感謝します –

関連する問題