2016-08-16 2 views
0

EMU8086を使用しています。 1桁の変数を使用して4桁の数値を追加し、合計をアセンブリに表示するにはどうすればよいですか?4桁の数値を追加し、1つの変数を使用してアセンブリに合計を表示する方法は?

DATA SEGMENT 
    MSG1 DB "ENTER NUMBER WITH FOUR DIGITS : $" 
    MSG2 DB 10,13,"RESULT : $" 
    D1 DB ? 
    D2 DB ? 
    D3 DB ? 
    D4 DB ? 
    SUM DB ? 
    RES DB 10 DUP ('$') 
DATA ENDS 
CODE SEGMENT 
    ASSUME DS:DATA CS:CODE 
START: 
     MOV AX,DATA 
     MOV DS,AX 

     LEA DX,MSG1   
     MOV AH,9 
     INT 21H  

     MOV AH,1 
     INT 21H 
     SUB AL,30H 
     MOV AH,0 
     MUL AL 
     MOV D1,AL 

     MOV AH,1 
     INT 21H 
     SUB AL,30H 
     MOV AH,0 
     MUL AL 
     MOV D2,AL 

     MOV AH,1 
     INT 21H 
     SUB AL,30H 
     MOV AH,0 
     MUL AL 
     MOV D3,AL 

     MOV AH,1 
     INT 21H 
     SUB AL,30H 
     MOV AH,0 
     MUL AL 
     MOV D4,AL 

     ADD AL,D3 
     ADD AL,D2 
     ADD AL,D1  
     MOV SUM,AL 

     LEA SI,RES 
     CALL HEX2DEC 

     LEA DX,MSG2 
     MOV AH,9 
     INT 21H 

     LEA DX,RES 
     MOV AH,9 
     INT 21H 

     MOV AH,4CH 
     INT 21H  
CODE ENDS 
HEX2DEC PROC NEAR 
    MOV CX,0 
    MOV BX,10 

LOOP1: MOV DX,0 
     DIV BX 
     ADD DL,30H 
     PUSH DX 
     INC CX 
     CMP AX,9 
     JG LOOP1 

     ADD AL,30H 
     MOV [SI],AL 

LOOP2: POP AX 
     INC SI 
     MOV [SI],AL 
     LOOP LOOP2 
     RET 
HEX2DEC ENDP 
END START 
+0

「次の出力を表示する」この混乱で何を表示していますか? –

+0

元の質問はあなたのように変更しないでください。そのような変化はその意味を完全に破壊する。同じ問題に関する追加の質問がある場合は、コメントを使用してください。 – Fifoernik

答えて

0

質問は、あなたが書いたコードに完全に対応していません。 4桁の数字を2桁追加する場合は、そのような数字を複数入力する必要があります。 EXTRAセクションを参照してください。
したがって、私はあなたが多分ちょうど悪い言葉で表現することを疑問を締結し、私はあなたが示されたコードにコメントます:あなたのプログラムは、単一の4桁の数字の4桁の数字を追加します


。つまり、最大結果は9 + 9 + 9 + 9となり、36になります。このことは、命令の選択に影響を与えるため、プログラムの残りの部分で重要です。

個々の数字を実際に入力したときには、mul al命令を使用してそれらを二乗することによってすぐに破棄してください!

MOV AH,1 
INT 21H 
SUB AL,30H ; From "0".."9" to 0..9 
MOV AH,0  <-- Don't do this 
MUL AL  <-- Don't do this 
MOV D1,AL 

それがその後のように使用されることはありませんので、合計変数に合計を移動するには本当のポイントはありません。しかし、あなたは変換ルーチンは、入力としてAXを期待するので、ALは、AXのサイズに登録拡張する必要があります:

ADD AL,D3 
ADD AL,D2 
ADD AL,D1  
MOV SUM,AL <-- Maybe not needed? 
CBW   <-- This clears AH (the high byte of AX) because AL is a very small number (less than 128) 

LEA SI,RES 
CALL HEX2DEC 

私はあなたが常に2進を表示するための変換ルーチンHEX2DECを持つように選択した参照します数字。これは問題ありません。 EXTRA


4桁の数字のカップルを追加するための方法であなたを設定するには、私はこれらの番号の最初を取得するためのコードを追加します。 DATAセグメントには、ワードサイズの変数を必ず定義してください。

計算は、この式に基づいています:Number= D1*1000+D2*100+D3*10+D4

は、両方の数値を合計し、それらが風でなければなりません表示します!

NUM1 DW ? 
NUM2 DW ? 
SUM DW ? 

... 

MOV AH,1 
INT 21H 
SUB AL,30H 
CBW 
MOV DX,1000 
MUL DX 
MOV NUM1,AX 

MOV AH,1 
INT 21H 
SUB AL,30H 
CBW 
MOV DX,100 
MUL DX 
ADD NUM1,AX 

MOV AH,1 
INT 21H 
SUB AL,30H 
MOV AH,10 
MUL AH 
ADD NUM1,AX 

MOV AH,1 
INT 21H 
SUB AL,30H 
CBW 
ADD NUM1,AX 
+0

最初に申し訳ありません質問 のご迷惑をおかけして申し訳ありません。emu(8086) 私はアセンブリ言語で新しいです。 –

関連する問題