emu8086 汇编输入输出三个字符
emu8086 Assembly Input output with three characters
大家好,我是这门语言的新手,这是我修改过的代码,它应该接受输入 ABC 和 return ABC,但它 return 是 ABB。我用 AH、BH 和 Ax、Bx 试过它变得更糟。我该如何修改它(目前我们的老师希望我们坚持使用 MOV、INT、LEA 以及此处代码中的内容)。感谢提示和答案
.MODEL SMALL
.STACK 100H
.CODE
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV BL, AL ; Save in BL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV CL, AL ; Save in CL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV DL, AL ; Save in DL
MOV AH, 02H ; Display character function
MOV DL, 0DH ; carriage return
INT 21H
MOV DL, 0AH ; line feed
INT 21H
MOV DL, BL ; Get character stored in BL and display
INT 21H
MOV DL, CL ; Get character stored in CL and display
INT 21H
MOV DL, DL ; Get character stored in DL and display
INT 21H
MOV AH, 4CH
INT 21H
END
在第 14 行,您将第三个字符保存在 DL 中,但稍后,您通过将 ODH 和 OAH 分配给 DL 来丢失该值。解决办法很简单:将第三个字符存入另一个寄存器而不是DL,例如CH,在底部显示CH而不是DL(箭头<==============指向变化):
.MODEL SMALL
.STACK 100H
.CODE
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV BL, AL ; Save in BL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV CL, AL ; Save in CL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
; MOV DL, AL ; Save in DL
MOV CH, AL ; <============================
MOV AH, 02H ; Display character function
MOV DL, 0DH ; carriage return
INT 21H
MOV DL, 0AH ; line feed
INT 21H
MOV DL, BL ; Get character stored in BL and display
INT 21H
MOV DL, CL ; Get character stored in BL and display
INT 21H
; MOV DL, DL ; Get character stored in BL and display
MOV DL, CH ; <============================
INT 21H
MOV AH, 4CH
INT 21H
END
我选择了CH,因为它是一个代码中没有用到的寄存器。
有更高效的方法
主要过程
MOV BH,0
MOV BL,10D
INPUT:
MOV AH,1
INT 21H
CMP AL,13D
JNE NUMBER
JMP EXIT
NUMBER:
SUB AL,30H
MOV CL,AL
MOV AL,BH
MUL BL
ADD AL,CL
MOV BH,AL
JMP INPUT
EXIT:
AND AX,0
MOV AL,BH
MOV CL,10D
MOV BX,0000H
STORE:
DIV CL
MOV [0000H+BX],AH
ADD BX,2H
MOV AH,0
CMP AL,0
JNE STORE
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
PRINT:
SUB BX,2H
MOV DL,[0000H+BX]
ADD DL,30H
INT 21H
CMP BX,0
JNE PRINT
MAIN ENDP
结束主线
大家好,我是这门语言的新手,这是我修改过的代码,它应该接受输入 ABC 和 return ABC,但它 return 是 ABB。我用 AH、BH 和 Ax、Bx 试过它变得更糟。我该如何修改它(目前我们的老师希望我们坚持使用 MOV、INT、LEA 以及此处代码中的内容)。感谢提示和答案
.MODEL SMALL
.STACK 100H
.CODE
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV BL, AL ; Save in BL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV CL, AL ; Save in CL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV DL, AL ; Save in DL
MOV AH, 02H ; Display character function
MOV DL, 0DH ; carriage return
INT 21H
MOV DL, 0AH ; line feed
INT 21H
MOV DL, BL ; Get character stored in BL and display
INT 21H
MOV DL, CL ; Get character stored in CL and display
INT 21H
MOV DL, DL ; Get character stored in DL and display
INT 21H
MOV AH, 4CH
INT 21H
END
在第 14 行,您将第三个字符保存在 DL 中,但稍后,您通过将 ODH 和 OAH 分配给 DL 来丢失该值。解决办法很简单:将第三个字符存入另一个寄存器而不是DL,例如CH,在底部显示CH而不是DL(箭头<==============指向变化):
.MODEL SMALL
.STACK 100H
.CODE
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV BL, AL ; Save in BL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
MOV CL, AL ; Save in CL
MOV AH, 01H ; Character input with echo
INT 21H ; Character in AL
; MOV DL, AL ; Save in DL
MOV CH, AL ; <============================
MOV AH, 02H ; Display character function
MOV DL, 0DH ; carriage return
INT 21H
MOV DL, 0AH ; line feed
INT 21H
MOV DL, BL ; Get character stored in BL and display
INT 21H
MOV DL, CL ; Get character stored in BL and display
INT 21H
; MOV DL, DL ; Get character stored in BL and display
MOV DL, CH ; <============================
INT 21H
MOV AH, 4CH
INT 21H
END
我选择了CH,因为它是一个代码中没有用到的寄存器。
有更高效的方法
主要过程
MOV BH,0
MOV BL,10D
INPUT:
MOV AH,1
INT 21H
CMP AL,13D
JNE NUMBER
JMP EXIT
NUMBER:
SUB AL,30H
MOV CL,AL
MOV AL,BH
MUL BL
ADD AL,CL
MOV BH,AL
JMP INPUT
EXIT:
AND AX,0
MOV AL,BH
MOV CL,10D
MOV BX,0000H
STORE:
DIV CL
MOV [0000H+BX],AH
ADD BX,2H
MOV AH,0
CMP AL,0
JNE STORE
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
PRINT:
SUB BX,2H
MOV DL,[0000H+BX]
ADD DL,30H
INT 21H
CMP BX,0
JNE PRINT
MAIN ENDP
结束主线