목차
1. 메모리 구조
- 프로그램이 실행될 때 운영체제가 메모리 공간을 할당해준다. 메모리 공간은 데이터, 코드, 스택, 힙으로 구성되어 있다.
- 낮은 주소 코드 < 데이터 < 힙 < 스택 높은 주소
- 코드와 데이터 영역은 컴파일을 할 때 크기가 결정되고, 스택과 힙은 런타임시 크기가 결정된다. (런타임 : 프로그램이 동작하는 시기)
1) 데이터
- 전역 변수, static 변수, 배열, 구조체 등이 저장되는 영역
- 프로그램이 시작할 때부터 종료될 때까지 메모리에 남아있다.
2) 코드
- 소스 코드가 들어가는 부분
- 프로그램이 시작할 때부터 종료될 때까지 메모리에 남아있다.
3) 스택
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역으로 함수 호출이 끝나면 저장된 변수가 사라짐
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- 메모리의 주소가 높은 주소부터 낮은 주소 방향으로 할당된다.
4) 힙
- 사용자가 직접 할당하고 해제하는 공간
- 동적할당을 하는 것이 힙 공간에 메모리를 할당하는 것(malloc함수나 new 연산자를 통해 동적할당 가능)
- 메모리 해제는 free함수나 delete 연산자를 사용해서 해제할 수 있다.
*힙 오버플로우 / 스택 오버플로우
- 힙과 스택은 사실 같은 공간을 공유한다. 힙은 메모리 위쪽 부터 할당된다면, 스택은 메모리 아래부터 할당된다. 힙과 스택이 할당되다가 서로의 공간을 침범하게 되면 이것을 힙 오버플로우, 스택 오버플로우라고 한다.
- 힙 오버플로우 : 힙이 스택공간을 침범하는 것
- 스택 오버플로우 : 스택이 힙 공간을 침범하는 것
2. 레지스터 종류
- 레지스터는 CPU에 존재하는 저장공간으로 CPU가 일을 처리할 때 필요한 데이터를 일시적으로 저장하는 기억장치다. 레지스터의 크기는 작지만 속도는 주기억장치보다 빠르다.
1) 범용 레지스터
- 작은 데이터 저장 공간으로 연산처리,연산결과, 복귀주소등 작은 데이터를 기억하는 레지스터
- 종류 : EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI
① EAX(Extended Accumulator Register)
- 산술, 논리 연산을 수행 하고 함수의 반환값이 저장된다.
② EBX(Extended Base Register)
- 메모리 주소를 저장하는 레지스터
③ ECX(Extended Counter Register)
- 반복 명령어(for, while)를 사용할 때 반복 카운터로 사용되는 레지스터
④ EDX(Extended Data Register)
- EAX 레지스터와 함께 사용되며, 부호 확장 명령 등에 사용되는 레지스터
(부호 확장 : 숫자의 값은 유지하면서 더 많은 비트를 사용해서 표현하는 방법)
위 4개 레지스터는 산술 연산 명령어에서 사용될 상수/변수 값을 저장하는 용도로 사용된다.
⑤ ESP(Extended Stack Pointer)
- 스택의 끝 부분의 주소 값이 저장되는 레지스터
⑥ EBP(Extended Base Pointer)
- 스택의 시작 부분의 주소 값이 저장되는 레지스터
⑦ ESI(Extended Source Index)
- 데이터를 조작하거나 복사할 때 데이터의 주소가 저장되는 레지스터
⑧ EDI(Extended Destination Index)
- 데이터를 복사할 때 목적지의 주소가 저장되는 레지스터
2) 세그먼트 레지스터
- 세그먼트 : 세그먼트는 프로그램에 정의된 메모리 상의 특정 영역으로 코드, 데이터, 스택 등을 포함하고 메모리의 대부분에 위치할 수 있다. 기본적으로 사용되는 레지스터는 CS, DS, SS이다.
① CS(Code Segment)
- 코드 영역의 시작 주소를 저장한다.
② SS(Stack Segment)
- 스택 영역의 시작 주소를 저장한다.
③ DS(Data Segment)
- 데이터 영역의 시작 주소를 저장한다.
④ ES(Extra Segment)
- 데이터 관련 확장 레지스터로 스트링 명령에 보조적으로 사용되기도 한다.
⑤ FS
- 여분의 세그먼트 레지스터
⑥ GS
- 여분의 세그먼트 레지스터
3) 플래그 레지스터
- 산술 연산 결과의 상태를 알려주는 플래그 비트들이 저장되는 레지스터
- 목적에 따라 상태 플래그, 제어 플래그, 시스템 플래그가 있다.
(1) 상태 플래그
① CF (Carry Flag)
- 연산할 때 자리 올림이나 빌림이 발생한 경우에 1로 설정되고 그 이외의 경우는 0으로 리셋된다.
- 캐리 플래그는 프로그램에 의해서도 설정 혹은 리셋할 수 있음
② PF (Parity Flag)
- 연산 결과에서 1로 된 비트의 수가 짝수일 때 1로 설정되고 홀수 일때는 0으로 리셋됨
③ AF (Auxiliary Carry Flag)
- 산술 연산이 8비트 연산에서 하위 4비트에서 상위 4비트로 자리올림 혹은 빌림이 발생하면 1, 그 이외에는 0이다.
④ OF (Overflow Flag)
- 부호가 있는 숫자를 이용한 연산을 했을 때 연산 결과가 너무 크거나 작을 때(오버플로나 언더플로가 발생한 경우) 1, 그 이외에는 0으로 리셋된다.
⑤ SF (Sign Flag)
- 산술 및 논리 연산의 결과가 음수이면 1, 그 이외에는 0으로 리셋된다.
⑥ ZF (Zero Flag)
- 연산의 결과가 0일 때 1, 아니면 0으로 리셋된다.
(2) 제어 플래그
① DF (Direction Flag)
- 문자열 관련 명령을 제어하는 플래그. 값이 1이면 높은 주소에서 낮은 주소로 처리하고 0이면 낮은 주소에서 높은 주소로 처리한다.
(3) 시스템 플래그
① TF (Trap Flag)
- 플래그가 0이면 평소대로 명령을 실행하는데, 1이면 CPU는 한 명령을 실행할 때마다 자동으로 내부 인터럽트를 발생한다.
② IF (Interrupt Flag)
- 플래그가 0이면 인터럽트를 무시하고, 1이면 인터럽트를 처리한다.
4) 포인터 레지스터
①SP(Stack Pointer) 레지스터
- 스택의 가장 윗부분을 가리킨다.
② BP(Base Pointer) 레지스터
- 스택의 제일 바닥 부분을 가리킨다.
③ IP(Instruction Pointer) 레지스터
- 명령어 포인터 레지스터로 다음에 실행할 명령어의 주소를 가리킨다.
5) 인덱스 레지스터
- 인덱스 주소 지정과 덧셈, 뺄셈에서 사용할 수 있는 레지스터
① SI(Source Index)
- 데이터를 조작하거나 복사할 때 데이터의 주소가 저장된다.
② DI(Destination Index)
- 데이터를 복사할 때 목적지의 주소가 저장된다.
문제
1. 스택에는 전역 변수와 static 변수가 저장된다. (O/X)
2. 다음 빈칸에 들어갈 말로 알맞은 것은?
스택은 메모리 주소가 ( ) 주소에서 ( ) 주소 쪽으로 할당된다.
3. 아래에서 설명하는 용어가 무엇인가?
=> 힙 공간이 스택 공간을 침범한 상태
4. 산술, 논리 연산을 수행하는 레지스터의 이름은?
5. 플래그 레지스터 중 IF의 값이 0일 때 인터럽트를 처리한다. (O/X)
정답
1. X
- 스택에는 지역 변수와 매개 변수가 저장된다. 전역 변수와 static 변수는 데이터 영역에 저장된다.
2. 높은, 낮은
- 스택은 메모리의 주소가 높은 주소부터 낮은 주소 방향으로 할당된다.
3. 힙 오버플로우
- 힙 오버플로우는 힙이 할당되다가 스택의 공간을 침범한 것을 말한다.
4. EAX
- EAX는 산술, 논리연산을 수행하는 레지스터이다.
5. X
- IF 플래그의 값이 1일 때 인터럽트를 처리하고, 0일 때는 인터럽트를 무시한다.
'Study > 컴퓨터구조' 카테고리의 다른 글
[5] 캐시 기억장치 (0) | 2020.06.04 |
---|---|
[4] 분기 명령어와 오퍼랜드 개수에 따른 명령어 형식 (3) | 2020.05.30 |
[3-1] 컴퓨터 명령어 실행 기법 (0) | 2020.05.22 |
[2-2] 컴퓨터의 명령어 (0) | 2020.04.17 |
[2-1] 컴퓨터 정보의 표현 (0) | 2020.04.17 |