어셈블리어 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 으로 출력 되는 것을 ㅎㅎ 정말 다행이군 휴~~ 암튼 버그는 잡아 졌으니 원하는 결과를 얻었다.
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
errno (1) | 2012.09.19 |
---|---|
수업일지 리눅스 시스템 프로그래밍 (1) | 2012.09.19 |
요청글 (1) | 2012.09.17 |
cl과 link 옵션입니다. 참고하세요 (2) | 2012.09.13 |
IT 엑스포 사진... (2) | 2012.09.12 |
LDST 자세한 정리 (1) | 2012.09.12 |
지하철 안에서의 컵라면 아침 식사 =_= (4) | 2012.09.12 |
9월 11일 업무일지 by. 정철 (4) | 2012.09.11 |