1. 메모리 구조

프로그램이 실행되기 위해서 운영체제로부터 메모리 공간(RAM)을 할당받는다. 메모리 구조는 아래와 같이 데이터, 코드, 스택, 힙 영역을 가진다.

 

코드영역이 가장 낮은 주소이며 스택영역이 가장 높은 주소이다.

 

여기서 중요한 개념이 있는데 힙 영역과 스택 영역은 사실 같은 공간을 공유하는 것이다. 그래서 힙은 낮은 주소 즉 위쪽 주소부터 할당되고 스택은 높은 주소 즉 아래 쪽 주소부터 할당되는 것이다. 하지만 이 둘이 같은 공간을 공유하기 때문에 서로의 영역에 침범하는 일이 발생할 수 있는데 힙이 침범하면 힙 오버플로우, 스택이 침범하면 스택 오버플로우라고 한다.

스택 영역이 크면 힙 영역이 작아지며, 힙 영역이 커지면 스택 영역이 작아진다.

 

 

 

 

 

1-1. 코드 영역(=텍스트 영역)

-프로그램의 코드가 저장되는 영역으로 소스코드가 들어가는 부분이다. 실행파일을 구성하는 명령어 즉 함수, 제어문, 상수 등이 저장된다. 또한 프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있다.

 

1-2. 데이터 영역

프로그램의 전역 변수, 정적(static) 변수, 문자열 상수가 저장되는 영역으로 프로그램의 시작과 동시에 할당되며 프로그램이 종료되기 전까지 메모리에 있다.

 

1-3. 스택 영역 

프로그램이 자동으로 사용하는 임시 메모리 영역으로 함수 호출 시 생성되는 지역변수와 매개 변수가 저장되는 영역으로 이 변수들의 특징과 같이 함수가 끝나면 사라진다. 컴파일할 때 크기가 결정되며 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 된다. 위 사진에서 처럼 화살표 방향으로 할당된다.

 

1-4. 힙 영역

프로그래머가 할당 및 해제하는 공간이다. 이 공간에 할당하는 것을 동적 할당이라고 하며 malloc함수 또는 new 연산자를 통해 할당되며 free또는 delete에 의해 해제 된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되는 것도 특징이라고 할 수 있으며 런타임 할 때 크기가 결정된다.

 

 

2. 레지스터 종류

2-1. 범용 레지스터

EAX(Extended Accumulator Register) 덧셈, 곱셈, 나눗셈 등 산술 연산과 논리 연산을 수행하며 함수의 반환값이 이 레지스터에 저장되며 함수의 성공, 실패 여부를 파악할 수 있으며 반환값을 가져올 수 있다. 예를 들어 return 10을하면 EAX에 10이 입력된다고 생각하면 된다.
EBX(Extended Base Register) ESI나 EDI와 결합될 수 있으며, 메모리 주소를 저장하기 위한 용도로 쓰인다.
ECX(Extended Counter Register) 반복 명령어를 사용할 때 반복 카운터로 사용되는 레지스터이다.  for, while문과 같은 반복문 수행할 때 카운팅하는 역할이다.
EDX(Extended Data Register) EAX와 함께 쓰이며 큰 수의 곱셈 또는 나눗셈 등의 연산이 이루어질 때 몫은 EAX에 나머지는 EDX에 저장된다.
ESI(Extended Soource Index) 데이터 복사, 조작할 때 사용되며 복사의 원본 주소를 저장한다.
EDI(Extended Destination Index) 데이터 복사, 조작할 때 사용되며 복사의 목적지 주소가 저장된다.
ESP(Extended Stack Pointer) 스택의 끝 주소(가장 최근에 저장된 것)가 저장되며 push, pop 명령에 따라 값이 4바이트씩 변한다.
EBP(Extended Base Pointer) 스택의 시작 주소(가장 처음으로 저장된 것)가 저장되며 값은 고정이다.

2-2. 명령 포인터

EIP(Extended Instruction Pointer) 다음 실행할 명령어가 존재하는 메모리 주소가 저장된다.

2-3. 세그먼트 레지스터

세그먼트는 프로그램에 정의된 메모리 상의 특정 영역이다. 자신에게 지정된 주소를 가리키는 것이 특징이다.

CS(Code Segment) 코드 세그먼트의 시작주소를 가리킨다.
DS(Data Segment) 데이터 세그먼트의 시작주소를 가리킨다. 명령어는 이 데이터 세그먼트를 사용해서 데이터의 위치를 알아낸다.
SS(Stack Segment) 스택 세그먼트의 시작주소를 가리킨다. 메모리 상에 스택 구현을 가능하게 한다. 

2-4. 플래그 레지스터

CF(Carry Flag) 부호 없는 연산 결과가 용량보다 클 때 1이 된다.
ZF(Zero Flag) 산술 및 논리 연산의 결과가 0일 때 1이 된다.
OF(Overflow Flag) 정수형 결과 값이 너무 큰 양수거나 너무 작은 음수여서 오버 플로우가 발생할 때 1이 된다.
SF(Sign Flag) 연산 결과가 음수면 1이 된다.
PF(Parity Flag) 논리적으로 1인 비트의 수가 홀수인지 짝수인지를 신호하는 지시자로, 1인 비트 수가 짝수개면 1이 되고 그 이외의 경우 0이 된다. 
SF(Sign Flag) 음수(부호비트 1)면 1이되고 양수(부호비트 0)면 0이 된다.

 

 


문제

더보기

1. 프로그램이 실행되기 위해서 운영체제로부터 (          )을 할당 받는다. (           )는 데이터, 코드, 스택, 힙 영역을 가진다. 빈칸에 알맞은 용어를 쓰시오.

 

2. 메모리 구조 중 가장 낮은 주소를 가지는 영역을 고르시오.

1) 코드 영역

2) 데이터 영역

3) 힙 영역

4) 스택 영역

 

3. 힙 영역과 스택 영역을 실제도 같은 공간을 공유하는데, 만약 힙 영역이 스택 영역에 침범한 경우에 (             )라고 한다.

 

4. 메모리 구조에 대한 설명으로 알맞지 않은 것을 고르시오.

1) 코드 영역에는 함수, 제어문, 상수 등이 저장된다.

2) 데이터 영역에는 지역 변수, 전역 변수, 문자열 상수가 저장된다.

3) 스택 영역에 저장된 매개 변수는 함수가 끝나면 사라진다.

4) 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

 

5. 데이터를 복사, 조작할 때 필요한 레지스터를 모두 고르시오.

1)EAX

2)ECX

3)ESI

4)ESP

5)EDI

 

답안

더보기

1. 메모리 공간

 

2. 1

주소는 코드, 데이터, , 스택 영역 순으로 커진다.

 

3. 힙 오버플로우

힙 영역이 스택 영역을 침범한 경우 힙 오버플로우, 반대의 경우는 스택 오버플로우라고 한다.

 

4. 2

데이터 영역에는 지역 변수가 아닌 전역 변수, 문자열 상수가 저장되며 프로그램이 시작될 때부터 종료될 때까지 메모리에 있다.

 

5. 3, 5

EAX Extended Accumulator Register로 산술 연산과 논리 연산을 수행한 후, 반환값을 저장한다.

ECX Extended Counter Register로 반복 명령어를 사용할 때 반복 카운터로 사용된다.

ESP Extended Stack Pointer로 스택의 가장 아랫부분이 저장되며 push, pop할 때마다 4바이트씩 값이 변한다.

+ Recent posts