매번 질문에 좋은답변달아주셔서 감사합니다 (*__)
요즘 전공과목으로 컴프를 듣기 시작하면서
궁금한게 생겨버렸습니다.
처음으로 듣는 강의라 그런지 아직 변수의 선언과 메모리 할당에관한
간단한 내용만을 배우고 있지만, cpu 까지 전달되어 처리되는 과정을 생각하려니
혼자서는 상상하기 조차 어렵네요 ;;
아주 간단한 프로그램을 예로 들어
#include <stdio.h>
int main() {
int i = 0;
int j = 1;
printf("i = %d, j=%d", i, j);
return 0;
}
이와같은 프로그램을 실행한다면 과연 메모리상에는 어떤 정보들이 load 되는것일까?
하는게 저의 question입니다.
여러(*?) 문서를 보아하니
어떤 부분은 stack 에 들어가고
프로그램 코드는 어디에 들어가고 ..
여기서 여기로 jump 하고 ..
뭐 그렇다니 그렇게 알고 사용하고 있기는하지만..
머릿속에서 궁금증이 가시지 않습니다.
이 코드가 그대로 메모리 속으로 가는건 아닐테고
더 잘게 나뉘어서 더 많은 순서를 지니는 코드가 되고
컴파일을 거친 기계어 코드가 load될 테지만
실행코드와 기억공간이 메모리상에 어떻게 자리잡고 어떻게 유기적으로 연결되어 사용되는지
소스코드의 각 부분들과 어떻게 대응되는지 알고싶습니다... 저의궁금증을해결해주세요!!
ps. 혹시 이런부분들을 다룬 괜찮은 책이 있다면 추천해주세요!
컴파일된 코드들은 여러 섹션별로 저장될거구요, text section 에 "i = %d, j=%d" 이부분이 들어가고 코드 섹션에 esp 를 당겨서 변수공간을 할당시키고 push j , j , text섹션의 주소 를 한 후 call printf , 그다음 ret 을 하는 기계어가 들어가게 될거구요. call printf 를 하기위해선 라이브러리를 로드하기위한 섹션도 필요하구요.. 음..
만약 전역변수도 선언했다면 그건 또다른 섹션으로 들어가게 될겁니다. 좀더 자세한 정보를 알고싶으시면 "WINDOWS 시스템 실행파일의 구조와 원리" 라는 책을 추천드려요~