2016-09-11 6 views
0

DosBox를 사용하고 있는데 인터럽트를 사용하여 버퍼에서 문자열을 읽었습니다. 첫 번째 문자가 메모리에 저장된 위치를 알고, 다음 문자로 어떻게 증가합니까?MS-DOS 디버거, 다음 메모리 위치로 이동

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"대신 "I"문자 만 입력됩니다.

+2

MOV (113), 및 해결을위한 _BX_를 사용합니다. 그런 다음 BX를 증가시켜 다음 메모리 위치로 이동할 수 있습니다. –

+0

컴퓨터 메모리가 어떻게 작동하는지, 그리고 그 의미는 무엇입니까 [113]? 레지스터가 뭔지 아십니까? '[113]'을'113'로 변경하면 어떻게 될까요? 왜'mov dx, 111'라고 입력하면됩니까? (내가 무엇을 생각해야하는지 묻고있다). – Ped7g

답변

0

현재 문자를 가리 키기 위해 레지스터를 선택해야합니다. 일단 포인터가 가리키는 바이트를 읽는 지침뿐만 아니라 포인터를 앞으로 나아갈 지침이 있습니다.

사용자 입력 함수에서 읽는 문자의 수를 알 수 없으므로이 함수가 입력 값과 함께 작동하게하려면 몇 가지 루프가 필요하므로 비록 당신이 그것을 단순하게하고 싶다면, 입력 된 것과 관계없이 첫 3 글자 만 인쇄하도록 할 수있다. 나는 사용자가 타이핑 한 것과 정확히 일치하는 것을 인쇄하고 싶다고 가정 할 것이다.

이 문제를 해결하는 좋은 방법은 루프 본문을 CX 레지스터에 넣은 카운트만큼 반복 (점프)하는 LOOP 명령어를 사용하는 것입니다. 사용자 입력 함수는 문자 수를 제공하기 때문에 루프 초기화를 위해 CX 레지스터 (CL)의 하위 부분으로 읽어 들여야합니다. 또한 현재 문자를 가리키는 포인터가 필요합니다. 일단 루프 몸체에 들어가면 "현재 문자"포인터에있는 문자를 읽은 다음 DOS 문자 인쇄 기능을 호출하여 콘솔에 출력합니다. 그런 다음 모든 문자가 완료 될 때까지 포인터와 루프를 진행할 수 있습니다. LOOP 명령이 발생할 때마다 CX는 0에 도달 할 때까지 감소합니다. 일단 그것이 0이면, LOOP는 더 이상 몸으로 점프하지 않고 단순히 LOOP 다음의 명령으로 진행합니다.

참고 : 사용자 입력을 읽은 후 CRLF를 출력하지 않으면 줄 바꿈이 없으며 새 출력은 콘솔에서 입력을 읽은 위치를 덮어 씁니다. 사실 아무 일도 없었던 것처럼 보일 것입니다.

다음은 수정 된 샘플입니다 : _BX_에

0100 MOV  AH,0A 
0102 MOV  DX,
0105 INT  21   ;input string using buffer at
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 
DB  20   ;buffer start; max characters = 32 
0124 DB  00   ; chars read goes here 
0125 DB  00   ; input chars are read here