2017-03-21 7 views
-2

こんにちは私は0と9の間の2つの数値を合計するために練習を書こうと思っていますが、問題はそのあと15までの結果しか得られないときは0に戻ります結果は17になります。2つの数値を合計するプログラムを書く

私は間違っていますか?

#make_COM# 

; COM file is loaded at CS:0100h 
ORG 100h 

;******************************* 
;* Programa: CONDIC4.ASM * 
;******************************* 

.MODEL small 
.STACK 512d 

.DATA 
    msg1 DB 'Decimal 1 (0 to 9): ', 024h 
    msg2 DB 0Dh, 0Ah, 'Decimal 2 (0 to 9): ', 024h 
    msg3 DB 0Dh, 0Ah, 'Sum = ', 024h 
    msg4 DB 0Dh, 0Ah, 'Invalid', 024h 

.CODE 
    LEA DX, msg1 
    CALL write 
    CALL read 
    MOV BH, AL 

    LEA DX, msg2 
    CALL write 
    CALL read 
    MOV BL, AL 

    LEA DX, msg3 
    CALL write 
    XCHG AX, BX 

    ADD AL, AH 
    SUB AH, AH 
    AAA 
    MOV DX, AX 
    MOV AH, 0Eh 
    CMP DH, 0h 
    JE not_zero 
    OR DH, 30h 
    MOV AL, DH 
    INT 010h 
    not_zero: 
    OR DL, 30h 
    MOV AL, DL 
    INT 010h 
    INT 020h 

write PROC NEAR 
    MOV AH, 09h 
    INT 021h 
    RET 
write ENDP 

read PROC NEAR 
    MOV AH, 01h 
    INT 021h 
    CMP AL, 030h 
    JL erro 
    CMP AL, 03Ah 
    JGE erro 
    SUB AL, 030h 
    RET 
    erro: 
    LEA DX, msg4 
    CALL write 
    INT 020h 
    RET 
read ENDP 
+1

あなたのコードをコメントしてください。デバッガを使用する方法を学び、プログラムをシングルステップ実行し、エラーを自分で見つけることができます。 – Jester

+0

私は単線デバッグですが、AAAコマンドを実行するとエラーが発生するのを理解できません。 – Aman

+0

「AAA」の入力と出力として表示されるエラーを説明してください。予想される動作が何であるかは、命令セットリファレンスを参照してください。 _ "AAA命令は、ADDに従うときにのみ有効です。" _に注意してください。その間に 'SUB 'を置くと、必要なフラグが破棄されます。 – Jester

答えて

1

マニュアルはMOVは任意のフラグを変更しませんと言うので、私が代わりにSUB(SUB AH、AH)のMOV(MOV AH、0H)コマンドを使用して、それを修正しました。

#make_COM# 

; COM file is loaded at CS:0100h 
ORG 100h 

;******************************* 
;* Programa: CONDIC4.ASM * 
;******************************* 

.MODEL small 
.STACK 512d 

.DATA 
    msg1 DB 'Decimal 1 (0 to 9): ', 024h 
    msg2 DB 0Dh, 0Ah, 'Decimal 2 (0 to 9): ', 024h 
    msg3 DB 0Dh, 0Ah, 'Sum = ', 024h 
    msg4 DB 0Dh, 0Ah, 'Invalid', 024h 

.CODE 
    LEA DX, msg1 
    CALL write 
    CALL read 
    MOV BH, AL 

    LEA DX, msg2 
    CALL write 
    CALL read 
    MOV BL, AL 

    LEA DX, msg3 
    CALL write 
    XCHG AX, BX 

    ADD AL, AH 
    MOV AH, 0h  ;Clears AH WITHOUT CHANGING FLAGS 
    AAA 
    MOV DX, AX 
    MOV AH, 0Eh 
    CMP DH, 0h 
    JE not_zero 
    OR DH, 30h 
    MOV AL, DH 
    INT 010h 
    not_zero: 
    OR DL, 30h 
    MOV AL, DL 
    INT 010h 
    INT 020h 

write PROC NEAR 
    MOV AH, 09h 
    INT 021h 
    RET 
write ENDP 

read PROC NEAR 
    MOV AH, 01h 
    INT 021h 
    CMP AL, 030h 
    JL erro 
    CMP AL, 03Ah 
    JGE erro 
    SUB AL, 030h 
    RET 
    erro: 
    LEA DX, msg4 
    CALL write 
    INT 020h 
    RET 
read ENDP 
関連する問題