Assembly 写一个程序来求两个数的和
嗨,我想写一个练习来求0到9之间的2个数字的和,问题是当我只能得到15个结果时,如果结果是17,它将返回到0,它将显示1 我做错了什么Assembly 写一个程序来求两个数的和,assembly,emu8086,Assembly,Emu8086,嗨,我想写一个练习来求0到9之间的2个数字的和,问题是当我只能得到15个结果时,如果结果是17,它将返回到0,它将显示1 我做错了什么 #make_COM# ; COM file is loaded at CS:0100h ORG 100h ;******************************* ;* Programa: CONDIC4.ASM * ;******************************* .MODEL small .STACK 512d .
#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
我用MOV(MOV-AH,0h)命令而不是SUB(SUB-AH,AH)修复了它,因为手册上说MOV不会更改任何标志
#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
注释您的代码,特别是如果您希望其他人提供帮助。学习使用调试器,以便您可以单步执行程序并自己查找错误。我正在进行单行调试,但我无法理解运行AAA命令时遇到的错误。请描述错误以及您所看到的
AAA
的输入和输出。请参阅指令集参考以查看预期的行为。请注意“AAA指令只有在ADD之后才有用”的部分。你在中间放了一个SUB
,这会破坏所需的标志。根据我对AAA的读取,如果我的输入为0Fh,它将存储在AH 01h AL 05h中,但如果我的输入为12h,它将存储在AH 00h和AL 02h中。为什么?哦,所以我不应该用sub啊,啊?我怎么空啊?