我正在使用DosBox,我使用中断从缓冲区读入一个字符串。我知道第一个字符存储在内存中的位置,如何增加到下一个字符?
0100 mov ah, 0a
0102 mov dx, 111
0105 int 21
0107 mov dl, [113] ;first character here
010b mov ah, 02
010d int 21
010f int 20
0111 db 0f
问题是如何增加字符串中的下一个字符?如果我输入字符串" Hello"然后使用inc dl
它只是给我一封信"我"而不是" e"。
答案 0 :(得分:0)
您需要选择一个寄存器来指向当前字符。一旦你有了这个指令,就会有指令来推进你的指针以及读取指针所指向的字节的指令。
由于您不知道用户输入函数将读取多少个字符,并且您希望此函数可以使用任何输入值,因此您需要某种循环以便只打印为已阅读过很多字符,虽然如果你想简单一点,你可以让它只打印前3个字符而不管输入的是什么。我会假设你要打印出确切的输入内容由用户。
解决这个问题的一个好方法是使用LOOP指令,该指令通过放入CX寄存器的计数重复(跳入)循环体。由于用户输入函数为我们提供了字符数,因此我们所要做的就是将其读入CX寄存器(CL)的下半部分以进行循环初始化。我们还需要一个指向当前字符的指针。一旦进入循环体,我们就会读到我们当前角色中的任何角色"指针,然后调用DOS字符打印功能将其输出到控制台。然后我们可以推进指针和循环,直到完成所有字符。请注意,每次遇到LOOP指令时,CX都会递减,直到达到零。一旦它为零,LOOP就不再跳回到主体中,只是前进到循环之后的指令。
注意:如果在读取用户输入后没有输出CRLF,则不会换行,新输出将覆盖在控制台上读取输入的位置。实际上看起来似乎什么也没发生。
以下是您修改过的示例:
0100 MOV AH,0A
0102 MOV DX,0123
0105 INT 21 ;input string using buffer at 0123
0107 MOV DX,0120
010A MOV AH,09
010C INT 21 ;output CRLF sequence first
010E MOV SI,0124 ;point SI at byte containing chars read
0111 XOR CX,CX ;CX = 0
0113 MOV CL,[SI] ;CX = chars_read
0115 INC SI ;mov SI to next char to display
0116 MOV DL,[SI] ;DL = character SI is pointing at
0118 MOV AH,02
011A INT 21 ;display character
011C LOOP 0115 ;loop back to INC instruction until no more chars left
011E INT 20 ;exit
0120 DB 0D ;CR
0121 DB 0A ;LF
0122 DB 24 ;"$" DOS string terminator
0123 DB 20 ;buffer start; max characters = 32
0124 DB 00 ; chars read goes here
0125 DB 00 ; input chars are read here