본문 바로가기
Ghost의 어셈블리어 Note/Ghost의 어셈블리어 C소스에서의 주소버그

어셈블리어 C소스에서의 주소 버그... 햅버그.. 썰렁~~

by dark ghost 2012. 9. 13.
728x90
반응형

어셈블리어 C소스에서의 주소 버그

 

   그림 1) CODE(코드) 영역의 주소와 DATA(데이타) 영역의 주소가 0으로 되있음.

1. 그림 1)을 보면 빨간 네모들 안에 0으로만 되어 있는 것을 확인 할 수 있는데 원래는 CODE(코드) 영역의 주소와 DATA(데이타) 영역의 주소가 나와야 하는데 나오지 않고 있다. 잘못된 버그이기 때문에 나오지 않는다.

 

   그림 2) 전체 코드 중 처음 부분.

2. 그림 2)는 전체 코드 중에 가장 처음 부분으로 구조체와 함수 선언등이 있는 부분이며, 빨간 네모들이 있는 부분이 버그의 핵심 부분이다. 나중에 그 부분만 따로 볼 것이다.

 

    그림 3) 전체 코드 중 중간 부분.

3. 그림 3)은 전체 코드 중에서 중감 부분에 해당 하며, 이 부분은 Main 함수 부분이 있다. 이렇게 전체 코드를 올리는 이유는 전체 코드에서 어떤 부분이 잘못 되었는지를 알기 위해서 이렇게 전체 코드를 올린당... ㅎㅎ 그리고 마지막 코드 만 남았다.

 

   그림 4) 전체 코드 중 마지막 부분.

4. 그림 4)에서는 코드 중 마지막 부분에 해당 하며, Main 함수를 제외 한 각각의 함수들이 모여 있는 부분이다. 그리고 이번 버그와는 거리가 멀기 때문에 이부분은 거의 보지 않도록 할 것이당~~~ 그럼 이제 슬슬 문제가 있었던 코드들만 따로 보도록 하자.

 

  그림 5) 주소 버그의 첫 번째 원인.

5. 그림 5)는 앞전에 전체 코드 중 앞 부분에 해당 하는 코드를 봤었다. 거기에 빨간 네모들이 있었던 부분이 있었는데 그 부분만 따로 빼내었다. 왜 빨간 네모의 부분들이 잘못 되었는가? 라는 질문을 던져야 한다. 왜~~? 이유는 그냥 변수 선언을 하게 되면 변수에는값을 가지는 데이터를 넣을 수는 있지만 주소값을 넣을 수가 없다.그래서  CODE 영역의 주소를 알려면 포인터가 필요 한 것이다. 포인터는 메모리의 주소값을 넣을 수 있는데 CODE 영역의 주소를 가리키도록 하면 원하는 주소값을 알 수있기 때문에 포인터를 쓰는 것이당.  

 

   그림 6) 주소 버그의 첫 번째 원인 수정.

6. 그림 6)이 그림 5)의 코드를 제대로 수정 한 코드이다. 이렇게 포인터를 쓰면 CODE 영역의 메모리 주소를 가져 올 수 있기 때문에 CODE 영역의 메모리 주소를 화면에 출력을 할 수 있게 준비를 한 것이다.

 

   그림 7) 주소 버그의 두 번째 원인.

7.  그림 7)은 전체 코드 중 가운데 부분에 있었던 원인인 코드를 따로 빼내었다. 그럼 왜 이부분이 잘 못 되었는가? ㅎㅎ 크게 잘못 되지는 않았지만 그래도 경고를 피해 가야 한다. 되도록이면 경고도 안나오게 해야 하니 아마 이 부분을 컴파일 하면 왼쪽의 값과 타입이 다르다거나 값이 틀리다거나 하는 경고 메시지가 뜰 것이다. 왜냐 하면 형동등성에 의해 타입이 다르기 때문인데 그림 6)에 수정된 부분을 보면 static unsigned char *Code; 라고 선언된 것을 볼 수 있다. 그런데 오른 쪽을 보면 뭔가 이상 하지 않은가? ㅎㅎ 그렇다 아무리 봐도 타입이 (unsigned int) 밖에 보이지 않는다. 어라~~ 아까 분명히 형동등성에 의해 타입이 같아야 한다고 했는데 타입이 다르다~~? 그렇다 타입을 맞춰 줘야 한다. 어떻게? 캐스팅을 통해서.. 

 

    그림 8)

8. 그림 8)이  그림 7)의 잘 못된 부분을 수정 한 코드이다. 이로서 아까의 주소를 찾지 못하고 0으로 채우는 주소 버그를 해결 하였다. 그럼 맞게 되었는지를 확인 해봐야 하겠지?

 

   그림 9) CODE(코드) 영역과 DATA(데이터) 영역의 주소가 출력된다.

9. 그림 9)에서 드뎌 확인 할 수 있었다. 무었을? 맨 처음에 주소 버그로 인해 0으로 채워져 있었던 CODE(코드) 영역과 DATA(데이터) 영역의 주소가 0x00430000과 0x00432000 으로 출력 되는 것을 ㅎㅎ 정말 다행이군 휴~~ 암튼 버그는 잡아 졌으니 원하는 결과를 얻었다. 

728x90
반응형

댓글