블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아

카테고리

분류 전체보기 (176)
잡담 (1)
IT 기기-리뷰&뉴스 (7)
리뷰 - 도서 (1)
리뷰 - 영상 (0)
리뷰 - 그림/음악 (1)
내장형 하드웨어 (163)
Total630,110
Today189
Yesterday195

- 메모리 영역 (윈도우 기준, 리눅스는 조금 다르다.)
  

함수, 제어문, 상수 등등

/ 함수에 대한 기계어 코드가 들어감

Code

compile time에 크기가 결정되고 이후로 변동되지 않는다.

전역변수

/ 초기값 있는 전역변수, 배열, static으로 선언된 변수가 들어감

Data

전역변수

/ 초기값 없는 전역변수, 배열, static으로 선언된 변수가 들어감

BSS

동적할당 

/ 동적할당(malloc)으로 할당된 변수가 들어감

HEAP

run time에 BSS와 HEAP사이를 기준으로 해서 heap은 아래로 순차적으로 메모리를 사용하고 stack은 위쪽으로 순차적으로 메모리를 사용한다.

지역변수

/ 블록내에서 할당된 변수가 들어감

STACK


⇒ 프로그램을 작성하면 code 영역이 늘어난다.

⇒ stack(지역변수)을 프로그램 하면서 얼마나 사용할 지 미리 계산할 수 없다. 그래서 stack 함수의 뒷부분에서부터 변수의 주소가 매겨진다.(code는 0에서 stack FFFFFFFF까지 메모리 값을 가진다. - 반드시 STACK이 FFFFFFFF부터의 주소를 가지는게 아니라 그 근처에서 메모리 값을 가진다.) 즉, 변수 선언 순서에 따라 높은 주소에서 낮은 주소로 내려간다.

⇒ compile time에 code, data, bss는 크기가 결정되며 고정된다.

⇒ run time 때 Heap과 stack의 메모리 사용이 결정되는데 heap는 bss와의 경계에서 아래로 stack은 끝에서부터 위로 주소값을 메긴다.


⇒ code를 작성하면,

  if(……) → ASM → 기계어 → 기계어가 code에 채워진다.

  int A; → stack에 4byte 공간을 만들어라는 뜻.

⇒ 실행파일에는 A가 없고, A를 만들라는 지시가 있다. A는 실행시킬 때 생성된다.


⇒ hard disk에 code, data, bss가 들어있다.(실행파일 안에-.exe)

⇒ 실행파일을 실행하면 bss가 메모리에 들어가 stack 시작점을 생성하고 코드를 읽어들인다.

⇒ 로더 : 적제기, 로딩(메모리에 올린다.)


#include<stdio.h>

int main()

{

        int A=0x12345678;

        int B=0x9ABCDEF0;

        int C;


        printf("&A: %08X\t &B: %08X\t &C: %08X\n",&A,&B,&C);

        printf("main: %08X\n", main);

        printf("printf: %08X\n", printf);

        printf("scanf: %08X\n", scanf);


        return 0;

}

⇒ 출력 결과         

 

⇒ A, B, C의 주소값을 확인해 보면 little Endian 으로 저장되고 있음을 확인할 수 있다.

symbol table

type

name

address

int

A

BFFFF868

int

B

BFFFF864

int

C

BFFFF860


little Endian

78

56

34

12

 

 

68

69

6A

6B

little Endian

F0

DE

BC

9A

 

 

64

65

66

67

⇒ int A, int B, int C의 순서대로 선언되었으나 메모리 값은 반대의 순서로 되어있다?


⇒ 상수 → 변화하지 않는 수, 변수 → 변하는 수(Data, BSS, STACK - 지금까지 써온 변수들)

⇒ main도 주소를 가진다. (&를 붙이지 않아도 주소값이 나온다.→printf,scanf...들도 마찬가지)

⇒ 출력결과

 

symbol table

type

name

address

 

main

08048400

 

printf

08048300

 

scanf

08048304




#include<stdio.h>

int main()

{

        int A=0x12345678;

        int B=0x9ABCDEF0;

        char G;

        short F;

        char C;

        short E;

        int D;

        

        printf("&A:%08X\n &B:%08X\n &C:%08X\n &D:%08X\n &E:%08X\n &F:%08X\n &G:%08X\n", &A, &B, &C, &D, &E, &F, &G);      


        return 0;

}

⇒ 실행결과

        

 


⇒ 각 변수의 주소값의 메모리 위치 확인을 통한 stack 함수의 이해

54

55

56

57

58(D)

59

5A

5B

5C

5D

5E(E)

5F

60(F)

61

62(G)

63(C)

64(B)

65

66

67

68(A)

69

6A

6B

⇒ stack 의 특징(intel cpu)

 1) 4byte 단위로 쪼갠다.

  → 즉, BUS에 최적화

 2) 4byte가 안되면 2byte 단위

 3) 그 다음으로 1byte 단위

 ⇒ 프로그램을 잘 짜려면 stack 을 잘 맞추어 주어야 한다. 물론 16bit 에서는 소용없다.

 ⇒ 우리의 컴은 대부분 32bit 이므로 컴파일러도 32bit 기준으로 stack 작성

 ⇒ 컴파일러가 16bit 용이라면 cpu가 32bit라도 16bit에 맞추어 stack 주소 작성


Posted by 동화다아아

댓글을 달아 주세요

  1. 2011.10.04 22:38 초보  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 좋은 포스팅 감사합니다.
    읽으면서 궁금한 점이 있어서 문의 드립니다.

    =>A,B,C 주소값을 확인해 보면 little-endian~

    부분에서 주소값만 보고 어떻게 little-endian 으로 파악할 수 있는지 궁금합니다.
    주소값이 작아지는 것은 stack 이라서 변수가 선언될 수록 주소값이 작이 지는 것 같은데,
    endian 은 지정된 byte size 에서 수를 >> 으로 써갈 것 이냐, <<으로 써갈 것 이냐만 구분해 주는 것 아닌가요?

    감사합니다.

최근에 달린 댓글

최근에 받은 트랙백

글 보관함