본문 바로가기

보고서/10월 업무일지

10월 20일 업무일지


 

#include <stdio.h>

int main()
{
  int A=3;
  printf("printf:[%08X]\n",printf);
  printf("main:[%08X]\n",main);
  printf("A:[%08X]\n",&A);

  return 0;
}

printf의 주소값: 0x8048300
main의 주소값: 0x8048400
A의 주소값 : 지역변수 이므로 주소저장 공간이 다르다.(Stack)

이소스에서는 지역변수 부분과 코드부분의 주소를 저장하는 곳이 서로 다른곳이고 떨어져 있다고 알 수 있다.

(확연히 차이가 난다)

code <-->stack  - 메모리의 용도별로 구획을 지어 놓았다.

*포인터 변수가 가리키는 자료형의 의미

#include <stdio.h>

int main()
{
  int inum, *ip;
  short *sp;

  inum=0x0F5A0B43;
  ip=&inum; // => ip=0012FF7C(inum의주소값)과 같다. 타입이 일치하는 순간에 ip에 주소값이 들어가게
                     된다.
  printf("&inum: %x *ip: %p \n",&inum,*ip);
  sp=(short*)ip;
  
  printf("sp: %p, *sp: %x\n",sp,*sp);
   sp++;
  printf("sp: %p, *sp: %x\n",sp,*sp);
  return 0;
}

*ip=100 명령문을 수행할때 컴퓨터가 심볼테이블을 기본으로 확인후 실행하게 된다.

우리가 쓸때에는 ip=&inum; 이지만 컴퓨터는 *0012FF78(ip의 주소값)=0012FF7C; 이런 식이된다.

sp=(short*)ip; 은 *0012FF80(sp의 주소값)=0012FF7C; 로 되는 것이다.

printf("sp: %p, *sp: %x\n",sp,*sp); // sp가 쇼트형이므로
저장된

 43  0B  5A  0F
중에서 2바이트인 43 0B를 출력하려고한다. 리틀앤디안 이기 때문에 실제 출력은
0B 43 이 나오게 된다.


Symbol Table
 type  name  address  값
 int  inum  BFFFFA08  0F5A0B43
 int*  ip  BFFFFA04  BFFFFA08
 short*  sp  BFFFFA00  BFFFFA08

   <----           4바이트             ------>  
 BFFFFA00  08 FA FF BF (저장방식 리틀앤디안)  sp
 BFFFFA04  08 FA FF BF  ip
 BFFFFA08  43 0B 5A 0F  inum
     



*sp 는 sp가 가리키는 곳을 출력 한다

sp=(short*)ip; //ip에 inum의 주소값이 들어있기때문에 sp=&inum; 이라고 할수 있다.
주소값이 0F 5A 0B 43 이므로 43 0B 5A 43 으로 저장된다. sp는 short* 이기 때문에 쇼트=2바이트
로 0B 43 으로 출력된다.

sp++;
printf("sp: %p, *sp: %x\n",sp,*sp);

sp는 short*이기 때문에 2바이트 증가한다.
sp는 BFFFFA08(inum)의 주소값이 저장되어 잇으므로 BFFFFA08에 +2 =>BFFFFA0A
가 되는것이다.
BFFFFA0A 에5A BFFFFA0B에 0F가 저장되 있으므로 *sp의 출력은 0F 5A 가 된다.



'보고서 > 10월 업무일지' 카테고리의 다른 글

10월 22일 업무일지  (0) 2010.10.22
10월 21일 업무일지  (0) 2010.10.21
10월 20일 ATMEGA  (0) 2010.10.20
10월 19일 업무일지  (0) 2010.10.19
10월 18일 업무일지  (0) 2010.10.18