2017-03-21 5 views
-2

Hallo Ich bin daran, eine Übung zu schreiben, um 2 Zahlen zwischen 0 und 9 zu summieren, das Problem ist, dass, wenn ich nur Ergebnisse bis zu 15 danach haben kann, zurück zu 0 wenn Das Ergebnis ist 17 Es wird angezeigt 1.Schreibe ein Programm, um 2 Zahlen zu summieren

Was mache ich falsch?

#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

Kommentieren Sie Ihren Code, besonders wenn Sie möchten, dass andere Ihnen helfen. Lernen Sie, einen Debugger zu verwenden, damit Sie Ihr Programm einzeln ausführen und den Fehler selbst finden können. – Jester

+0

Ich bin Single-Line-Debugging, aber ich kann nicht verstehen, den Fehler, den ich bekomme, wenn ich AAA-Befehl ausführen – Aman

+0

Beschreiben Sie den Fehler und was Sie sehen als Eingabe und Ausgabe zu 'AAA'. Konsultieren Sie den Befehlssatz Referenz, um zu sehen, was das erwartete Verhalten ist. Achten Sie auf den Teil, in dem es steht _ "Der AAA-Befehl ist nur nützlich, wenn er einem ADD folgt" _. Sie setzen einen "SUB" dazwischen und das zerstört die benötigten Flags. – Jester

Antwort

1

Ich reparierte den MOV (MOV AH, 0h) Befehl statt SUB (SUB AH, AH) verwendet wird, da das Handbuch sagt MOV keine Flagge ändern.

#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 
Verwandte Themen