2013년 6월 6일 목요일

Appler 디버깅하기 ___ 1

앞선 게시물에서 언급했던 Appler라는 에뮬레이터를 디버깅해 보기로 했습니다.
http://re-coder.blogspot.kr/2013/06/dosbox-ms-dos.html

소스가 온통 어셈블러 뿐이고, 틀림없이 MS-DOS의 System Call을 사용할 것이 불을 보듯 뻔하지만, 인터넷에 널린 자료들을 이용해서 한번 도전해 보겠습니다.

일단 디버깅을 하기 위해서,
소스를 빌드해야겠지요.
(이를 위해서 터보 어셈블러 5를 구해서 설치했습니다.)

에러가 발생하네요

소스를 보았지만 뭐가 잘못된 건지 모르겠습니다.

다시 인터넷에서 터보 어셈블러의 매뉴얼을 구해서 "Illegal immediate"에 대해서 찾아 보았습니다.
도움이 안되는군요

이젠 맨땅에 헤딩하기...트라이얼 앤 에러...시행착오...

일단 의심스러운 SlotLen을 지워 봤습니다.

startup.asm은 컴파일 성공입니다. 그러니까 SlotLen이 문제라는 의미군요.

혹시나 []안에서 덧셈이 문제일지도 모르니 상수로 더했을 경우엔?

역시 덧셈은 문제 없습니다. SlotLen이 문제임이 더 확실해 집니다.

만약에 SlotLen 하나면 쓴다면?

역시 안됩니다. 결론은 SlotLen

하지만 어떻게 해야 할까요?
SlotLen을 무시할 수는 없고, 값의 의미와 변경여부를 따져서 상수로 대체하거나 다른 레지스터를 사용할 수도 있겠지만 무언가 방법이 있지 않겠냐 싶습니다.
터보 어셈블러에 종속적인 표기 방법의 문제처럼 보이니까요...

몇줄 위에 보이는 것처럼 offset을 붙여보았습니다.

소용이 없습니다.

WORD라는 type으로 지정을 해주면 될까요?

안되는군요.

혹시 앞에 ds: 세그먼트 때문일까요?

아니군요. 

좀 기괴하지만 혹시 이건....

역시 안됩니다. 되면 이상한건가요?

이것도 기괴하지만 매뉴얼에서 얼핏 본 표기방법의 변형

안되구요.

역시 매뉴얼에서 얼핏 본 표기방법의 변형 2번째

마찬가지로 안됩니다.

혹시나 해서 어디서 많이 본 듯한 식으로 고쳐 보았습니다.

헐...되네요.

그럼 원래의 소스와 의미가 맞도록 고쳐서는...

역시 됩니다.

실제로 저렇게 표기했을 때, 실행시에도 정말 같은 효과가 나타나는지는 확인해 봐야하지만 일단은 방법을 찾았습니다.
의외로 어셈블러에서 이런 부분때문에 어려움을 겪게 되는군요.
오히려 하드웨어적인 부분이나, 인스트럭션과 레지스터의 사용 조건이 어려울거라 생각했는데 말입니다.

잠깐 앞서 수정했던 부분을 조금 더 살펴 보겠습니다.
문제가 되었던 SlotLen이라는 것이 어떻게 사용되는지 살펴보았습니다.

SlotLen이 선언된 부분

SlotLen이 사용된 곳은 여기가 전부입니다. 단 2줄.
음... 잘은 모르겠지만 SlotPrg의 길이를 보관하는게 SlotLen이구요,
하나는 C700h에 SlotPrg를 복사할 때 길이를 세는 용도로 SlotLen이 사용되구,
또 하나는 C700h에 복사한 SlotPrg의 다음에 값을 넣을 때 SlotPrg의 길이를 더해주는 용도로 SLotLen을 사용합니다.
결국 SlotLen은 SlotPrg의 길이를 보관하는, 그 값이 바뀌지 않는 상수입니다.
만일 앞서 수정한 부분에서 문제가 생긴다면 상수 9로 대체해도 되지 않을까 싶습니다.

마지막으로 앞에서 수정했던 WORD PTR과 mov에 대한, 터보 어셈블러의 퀵 레퍼런스 가이드의 내용을 참고 삼아 소개하는 것으로 이번 포스팅을 마치겠습니다.

그런데 WORD와 WORD PTR이 뭐가 다른걸까요?




댓글 없음: