| Prox |
실제 컴파일과정을 예를들어 설명해볼께요
int add(int,int); // 네 이게없으면 에러가나죠.. prototype을 알려주기위해 함수선언!
//int인자 두개를 받고, int결과를 내놓네요
main() {
int i=add(3,5); //호출하는 부분
}
int add(int a, int b) { //정의부분
return a+b;
}
이걸 위에서부터 아래로 1차적으로 컴파일하면.. (어셈블리어지만 매우 간단하게 표현해볼께요)
//(main 시작주소)
push 5
push 3 //push로 인자를 넘겨줍니다
call (add) //함수 호출! 근데아직 이부분을 컴파일하는 순간엔 add의 주소를 모릅니다.
mov [i],eax //결과값을 i에 저장
exit program
//(add 시작주소)
mov eax,인자1 //eax에다가 인자1의 값을 저장하고
add eax,인자2 //eax에다가 인자2를 더하고
return //돌아감 (즉 eax=(인자1)+(인자2)가 됨)
여기까지 컴파일한 다음에는 add의 주소를 알고 있죠?
그래서 아까
call (add) <- 주소를 몰라서 빈칸으로 남겨뒀던 부분을 실제 주소로 채워주고
컴파일을 마무리하면 됩니다. ^^ |
2011/05/03 |
|