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

结束主线