DOSBOX 내부에서 처리 하는 문자 비교 코드.
안녕하세요.
예전부터 하고 싶었던것 중 하나가, dosbox에서 시리얼 번호를 어떻게 계산 해 내는가 였습니다.
내부적으로 구현되는 시리얼 입력 후 비교 루틴은 각각 문자열 비교로 알고 있습니다.
현재 그와 관련되서 TURBO-C 로 구현해서 이것저것 보고 있는데요.
오늘은 그와 관련된 항목을 정리 할까 합니다.
이 항목은 터보씨에서 hello.c로 저장하여 hello world를 테스트 하던 파일인데요.
로직을 조금 바꿨습니다.
보게 되면, 위의 로직은 입력된 문자열을 a , b, c , 그외의 경우 로 해서 총 3개 비교 구문을 처리하고 위의 구문이 아닐 경우
바로 else 로 빠지게 됩니다.
내부적으로 구현된 방식은
입력된 문자열 비교 A
입력된 문자열 비교 B
입력된 문자열 비교 C
이러한 로직을 총 3번 탈꺼란 추정을 하게 하는데요.
위의 항목을 볼려고 하면 비교 하는 구문을 봐야 하는데 해당 로직은 아래와 같습니다.
prefix_none.h 파일에 있습니다.
이 CMP OPCODE 가 비교 처리 하는 로직이고 위의 로직을 참조 하는 부분은 core_nomal.cpp 입니다.
저는 예전에 헤더 파일에는 소스 코드 대신 사용되는 함수 시그니쳐만 넣어 두라고 배웠는데,
여기는 그냥 말그대로 코드를 통채로 넣어서 인클루드 시키는걸로 활용 하였네요.
여기서 쭈욱 보면, 아랫부분에 0x7 이 호출되었고, : J i n p u t 이란게 표시되었는데요.
이부분은 제가 cmpb안에 직접 콘솔로 찍게 만들었기에 저렇게 나오는겁니다.
input 에 z를 입력해보니 ah reg : 0x7 다음 줄에 z z z 가 3번 찍히는걸 볼수 있습니다.
이거는 z를 3번 비교하는 로직을 탔다는 겁니다.
다시 b를 입력 했을때는 2번 비교 로직을 2번 처리 하고 결과값을 출력헀는데요.
이유는 소스 코드에서 a,b 이후 출력 후 종료가 되기 때문입니다.
요부분은 a를 눌렀을때 0x7 이후 a 가 한번 출력 후 종료된걸 뜻합니다.
cmpb opcode를 좀더 활용해서 재미 있는 문자열 비교 로직을 테스트 해볼까 합니다.
참고로 위의 0x3c는 x86 구조에서는 2개의 값을 비교 하는 코드 입니다.
http://ref.x86asm.net/coder32.html#x3C
위의 imm8 은 주소 값 형태입니다.
감사 합니다.
'컴파일러 & 운영체제' 카테고리의 다른 글
DOSBOX Heavy Debugger 관련 간략한 포스팅을 합니다. (0) | 2018.03.29 |
---|---|
DOSBOX debugger 사용법. (0) | 2018.03.26 |
도스파일 ASM 읽어서 출력 하기. (0) | 2018.03.16 |
DOSBOX SVN 빌드 관련 파일들입니다. (0) | 2016.11.07 |
C# 3.0 Grammar 입니다. (0) | 2014.02.12 |