어셈블리어관련 질문입니다. AH,3FH instruction 내용
글쓴이: gyxor / 작성시간: 목, 2003/06/12 - 2:48오후
.MODEL SMALL .STACK 64 .DATA FLEE1 DB 5 DUP(0),'$' FLEE2 DB '*','$' .CODE MAIN PROC FAR MOV AX,@DATA MOV DS,AX MOV AH,3FH MOV BX,00 MOV CX,5 LEA DX,FLEE1 INT 21H MOV AH,09H LEA DX,FLEE1 INT 21H MOV AH,09H LEA DX,FLEE2 INT 21H MOV AX,4C00H INT 21H MAIN ENDP END MAIN
예제는 이 내용 그대로 입니다.
111112222233333 을 입력했을때와
22
333
4444
55555444
이런 다섯가지 경우입니다.
22의 경우엔
<실행화면>
22(엔터누름)
22
*
이렇게 되는데요
화면에 0AH 가 한번더 에코되는것을 볼수있습니다.
22 하고서 엔터를 누르는 과정에서요..
긴문자열의 경우
111112222233333 입력시에
11111*222233333
이런식으로 캐리지리턴만을 에코하는것과 비교해 봤을때
이해하기가 어렵습니다.
답변부탁드립니다.
꾸벅~
Forums:
3Fh 함수의 기능에 대해 레퍼런스를 달아주세요. 예전이나, 지금이나,
3Fh 함수의 기능에 대해 레퍼런스를 달아주세요. 예전이나, 지금이나, 도스 함수들은 함수이름 자체도 암호라서리......
글구, 이왕이면 어셈공부하실때, 가급적 Int 21h또는 바이오스 인터럽트 사용하지 마시고, IO Port또는 주소를 직접제어하셔서 코딩해보시는게 좋으실듯합니다. 그래야 많이 남는것 같아요. 이를 테면 멀티태스킹커널이나, 디바이스 드라이버등은 도스콜이나 바이오스인터럽트 사용하지 않아야 하지요.
그리고, 혹시나하고 말씀드리면, [엔터키] => [CR][LF]이고 이 또한 입력데이터로 취급이 될텐데 2바이트지요. 이점 고려하셨는지요?
이를테면 123[CR][LF]는 가장 이상적인 입력이지요? 적어도 님의 프로그램에서는? 5바이트니까요.
12라면 12[cr][lf][dummy] 모 이렇게 되어야 겠네요.
1이라면 1[cr][lf][dummy][dummy]가 될거로 보이구요.
데이터가 1234등 5바이트가 넘치는 경우는, 다시 실행해봐야 할듯하고(왜냐면 키보드버퍼에 여분이 있을테니...)
쩝, 횡설수설 죄송합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
^^
답변감사합니다.
3FH 는 버퍼를 사용하며 DX 레지스터의 주소값에 CX 레지스터 에 할당된 양만큼을 저장합니다.
5개를 입력하도록 하고서
AAA를 입력하면 DX가 가리키는 주소값에는
AAA ODH OAH 가 들어가게 됩니다.
만약 8글자를 입력하면
AAAAAEEE
DX에 우선은 AAAAA 가 들어가게 되고
버퍼에는 EEE ODH 가 남고요
다음에 DX로 불러오면 EEE ODH OAH 5개 들어갑니다.
그래서 마지막에서 글자길이는 3+2 = 5 로 계산합니다.(중요한건 아니지만)
중요한것은
님께서 말씀하셨듯이..
저의 경우에도 엔터 = ODH + OAH 인줄 알았는데요
교수님께 질문을 드린결과 아니었습니다.
엔터 = ODH 입니다.
그러니까 요약하자면
입력 AAA ODH(엔터)
화면에 에코 AAA ODH
버퍼 AAA ODH
저장 AAA ODH OAH
라는 것이죠 ODH 를 버퍼에서 불러올때 OAH 를 붙여준다는 것입니다.
여기까지가 교수님께 들은것이구요
그이상은 모르시겠다는군요..
위의 5가지 경우를 직접 해보시면 아시겠지만 문자열이 길고 짧은
여러 경우에서 일관성이 없고..
어느경우에는 OAH 가 화면에 한번더 에코가 됩니다.
답변부탁드립니다.
댓글 달기