프로그래밍

 3198, 1/160 회원가입  로그인  
   park53kr
   c언어에서 질문이요~~!!

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3450 [복사]


C언어에서 변수를 선언하잖아요

만약에

int a = 10;
이라고 하면

기계는 변수명 a라는 단어를 모르는데 어떤 형태로 저장을 하나요??

예를 들어 0x0000007b 이라는 주소에 10을 저장했다고 합시다.

그러면

printf("%d", a); 라고 할때 기계는 a라는 단어를 보고 어떻게 0x0000007b 주소를 찾아가서
10을 출력하나요??

  Hit : 6346     Date : 2012/07/04 10:25



    
hayate114 이 사이트에 있는 만화를 보시면 아시겠지만

컴파일러가 사람이 짠 소스를 기계어로 바꿔주는 역활을 합니다.
2012/07/05  
hayate114 컴파일러는 변수가 실제 어떤 번지를 가리키는지를 기억하고 있다가 변수를 사용하면 실제 번지에 값을 읽거나 쓰는 코드를 대신 작성해 줍니다.

http://winapi.co.kr/clec/cpp1/3-1-1.htm

winapi 사이트에 자세하게 설명이 나와 있습니다 ㅎㅎ
2012/07/05  
wolverine Compiler는 text level의 c code를 machine instruction으로 변환을 해주는 도구 입니다.

C source --> compiler ---> machine instruction

따라서, compiler를 이해하기 위해서는 우선 CPU Architecture에 대한 study가 선행이 되어야 합니다.
Processor가 어떻게 돌아가는지, machine instruction(기계어)이 어떻게 구성되고 수행되는지에
대한 이해를 바탕으로, 적어도 assembly language로 프로그램 개발이 가능할 정도가 되었다면,
질문하신 부분에 대해서 스스로 답을 찾으실 수 있을 겁니다.

int a=10;

이라고 선언을 하면, compiler/linker는 a의 실질적인 memory address를 결정하고,
예를 들어서 다음과 같은 instruction을 만듭니다.
(processor & compiler마다 다름, 하나의 예제임...)

mov r1, 결정된 a의 주소; // 결정된 a의 주소를 register r1에 load
mov r2, 10; // 절대값 10을 register r2에 load
mov *(r1), r2; // r1의 값이 지정하는 memory에 r2에 저장된 값(10)을 저장

printf함수에 인자로 a가 전달이 되기 위해서는,
mov r1, 결정된 a의 주소; // 결정된 a의 주소를 register r1에 load
mov r2, *(r1) // r1의 값이 지정하는 memory에 있는 값(10)을 r2를 저장
r2를 printf 함수 call시 두번째 인자로 넘겨줌

Core processing unit은 내부에 정해진 register file이라는 여러개의 register를
가지고 있으며, 이는 processor 구조마다 천차 만별 입니다.
load/store, add, multiply, branch, compare 등의 대부분의 명령은 이러한 register들을
매개로 해서 수행이 됩니다.
즉, add r1,r2,r3 명령어는 r1 regiter에 있는 값과, r2 regsiter에 있는 값을 더해서
r3에 저장하겠다는 의미입니다.
이를 위해서는 load 명령어를 이용해서 memory에 있는 값을 미리 r1, r2에 옮겨놓아야 합니다.
또한 명령어 수행 후에는 r3의 값을 memory에 다시 옮겨놓아야 합니다.
register의 수는 16개 32개등으로 제한이 되어있기 때문에,
다음 명령어 수행시에도 동일하게 r1,r2,r3 가 사용될 수도 있습니다.

위의 예제는 이해를 돕기 위한 하나의 pseudo code 입니다.

CPU Architecture에 관한 공부을 하시다 보면, 위의 질문에 대해서,
assembly coding에 대해서 자연스럽게 이해하실 수 있습니다.































2012/07/05