2018. 3. 25. 22:59

DOSBOX 내부에서 처리 하는 문자 비교 코드.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요.

예전부터 하고 싶었던것 중 하나가, dosbox에서 시리얼 번호를 어떻게 계산 해 내는가 였습니다.

 

내부적으로 구현되는 시리얼 입력 후 비교 루틴은  각각 문자열 비교로 알고 있습니다.

현재 그와 관련되서 TURBO-C 로 구현해서 이것저것 보고 있는데요.

오늘은 그와 관련된 항목을 정리 할까 합니다.

image

이 항목은 터보씨에서 hello.c로 저장하여 hello world를 테스트 하던 파일인데요.

로직을 조금 바꿨습니다.

 

보게 되면, 위의 로직은 입력된 문자열을 a , b, c , 그외의 경우 로 해서 총 3개 비교 구문을 처리하고 위의 구문이 아닐 경우

바로 else 로 빠지게 됩니다.

 

내부적으로 구현된 방식은

 

입력된 문자열 비교 A

입력된 문자열 비교 B

입력된 문자열 비교 C

 

이러한 로직을 총 3번 탈꺼란 추정을 하게 하는데요.

위의 항목을 볼려고 하면 비교 하는 구문을 봐야 하는데 해당 로직은 아래와 같습니다.

prefix_none.h 파일에 있습니다.

image

이 CMP OPCODE 가 비교 처리 하는 로직이고 위의 로직을 참조 하는 부분은 core_nomal.cpp 입니다.

image

저는 예전에 헤더 파일에는 소스 코드 대신 사용되는 함수 시그니쳐만 넣어 두라고 배웠는데,

여기는 그냥 말그대로 코드를 통채로 넣어서 인클루드 시키는걸로 활용 하였네요.

 

image

여기서 쭈욱 보면, 아랫부분에 0x7 이 호출되었고, : J i n p u t 이란게 표시되었는데요.

이부분은 제가 cmpb안에 직접 콘솔로 찍게 만들었기에 저렇게 나오는겁니다.

 

image

input 에 z를 입력해보니 ah reg : 0x7 다음 줄에 z z z 가 3번 찍히는걸 볼수 있습니다.

이거는 z를 3번 비교하는 로직을 탔다는 겁니다.

 

image

다시 b를 입력 했을때는 2번 비교 로직을 2번 처리 하고 결과값을 출력헀는데요.

이유는 소스 코드에서 a,b 이후 출력 후 종료가 되기 때문입니다.

image

요부분은 a를 눌렀을때 0x7 이후 a 가 한번 출력 후 종료된걸 뜻합니다.

 

cmpb opcode를 좀더 활용해서 재미 있는 문자열 비교 로직을 테스트 해볼까 합니다.

 

참고로 위의 0x3c는 x86 구조에서는 2개의 값을 비교 하는 코드 입니다.

http://ref.x86asm.net/coder32.html#x3C

image

위의 imm8 은 주소 값 형태입니다.

 

 

감사 합니다.