게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
VC 디스어셈블리를 이용해서 함수 포인터를 쉽게 이해하기
게시물ID : computer_130740짧은주소 복사하기
작성자 : 황금비
추천 : 1
조회수 : 1736회
댓글수 : 4개
등록시간 : 2013/11/27 15:53:54
c 프로그래밍 공부 어렵죠.
어려운 이유가 저 개인적으로는 기계가 처리하는 방식에 맞추어 사람의 사고를 재 구성 하는 과정 때문이라 생각됩니다.
컴퓨터 프로그램은 단어 그대로 컴퓨터가 처리해야할 일을 순서대로 나열한 것입니다.

c 프로그램을 빨리 배우는 방법중의 하나가 코딩을 하고 디버깅을 해보는 것입니다. vc는 디버깅 모드에서 어셈블리 코드를 볼 수 있는데 이것이 프로그램을 이해하는 데 많은 도움이 됩니다.

c언어에서 포인터는 아주 중요하죠.  포인터 변수는 장치, 코드, 메모리 등의 주소를 지정할 수 있는데 함수 포인터는 함수의 실행 코드를 저장하고 있는 변수로 c언어를 배운 분들이라면 다들 알고 있을것입니다..

포인터 중에서 함수 포인터도 정말 이렇게 되는지 이것을 디스어셈블리로 확인해 보죠.

다음과 같이 함수를 작성하고 

#include <stdio.h>

void MyFunc() {
int c=10;
printf("%d\n", c);
}

void main() {
void (*pf)() = MyFunc;
pf();
}

메인함수에서 함수 포인터 pf를 디스 어셈블리로 확인해 봅시다.

보통 디버거 모드로 실행하면 다음 그림의 main함수에서부터 실행될 것입니다.

이러한 이유는 실행런처가 보조기억장치에서 주기억장치로 코드 세그먼트, 스택 세그먼트를 확보한후에 main 함수를 호출하기 때문입니다.


func.jpg


암튼 붉은 색 부분 00E3143E 에서 함수 포인터에 0E311D6h 주소를 지정하고 있는데 0E311D6h 주소를 따라가면 녹색 화살표에  jmp 00E313b0로 값이 저장되어 있는 것을 볼 수 있고 00E313b0은 MyFunc 코드의 시작주소입니다.

이렇게 디버드 모드와 디스어셈블리를 활용하면 활자로 배우는 C언어의 내용이 기계(머신)에서 어떻게 동작하는지 눈으로 확인 할 수 있어서 언어를 이해하는데 많은 도움이 됩니다.





전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호