MS-DOS调试器,移动到下一个内存位置

时间:2016-09-11 14:44:07

标签: debugging assembly dos dosbox

我正在使用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"。

1 个答案:

答案 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