1. 메모리 구조
- 프로그램을 실행시키기 위해 메모리 공간이 필요함
- 프로그램을 실행시킬 때 가장 먼저 프로그램이 메모리에 로드 됨
- 메모리 공간은 코드, 데이터, 스택, 힙 영역으로 나뉜다
1) 코드(텍스트) 영역
- 실행할 프로그램의 소스 코드가 저장되어 있는 영역
- 실행 파일을 구성하는 명령어(함수, 제어문, 상수 등)들이 저장된다
- 저장된 명령어를 CPU에서 하나씩 가져가 처리한다
2) 데이터 영역
- 전역변수와 static 변수, 배열, 구조체 등이 할당되는 영역
- 프로그램 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 소멸하는 영역
- 초기에 사용할 메모리를 확보
- 초기화 된 데이터는 data영역에 저장
- 초기화 되지 않은 데이터는 BSS(Block Stated Symbol)에 저장
- BSS : 런타임 후에 메모리 영역이 확보됨 -> 효율적
3) heap 영역
- 프로그래머가 할당 / 해제하는 메모리 영역
- 이 영역에 메모리 할당하는 것을 동적 할당이라고도 부름
- 해제를 제대로 하지 않으면 메모리 누수 문제가 생긴다
- stack 영역과 반대로 메모리의 낮은 주소(위쪽)에서 높은 주소(아래쪽)의 방향으로 할당됨
4) stack 영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- 함수 호출 시 생성되는 지역 변수와 매개 변수를 저장하고 함수 호출 완료 시 소멸
* 스택 프레임 : 스택 영역에 저장되는 함수의 호출 정보
- push 동작으로 데이터를 저장하고 pop 동작으로 데이터를 인출한다
- 후입선출(LIFO) 방식 -> 가장 늦게 저장된 데이터가 가장 먼저 인출
- heap 영역과 반대로 메모리의 높은 주소(아래쪽)에서 낮은 주소(위쪽)의 방향으로 할당됨
5) overflow
- Heap과 Stack은 같은 공간을 공유해 데이터를 저장한다. Heap은 위에서 아래로 Stack은 아래서 위로 할당되다 상대 공간을 침범하게 된다. 그렇게 되면 Heap overflow, Stack overflow가 일어난다.
- Heap overflow : Heap이 위에서부터 주소를 채워 내려오다 Stack 영역 침범
- Stack overflow : Stack이 아래서부터 주소를 채워 올라가다 Heap 영역 침범
<이미지 출처> https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/
2. 레지스터
- CPU 내부에서 처리할 명령어 등을 일시적으로 기억하는 임시 기억 저장소
- 메모리 계층의 최상위에 위치해 가장 빠른 속도로 접근할 수 있게 설계되어 있다
1) 범용 레지스터
- 데이터 연산 및 전송 관련 범용 레지스터
- 16bit였던 레지스터(AX, BX, DX ...)가 32bit 시스템으로 전화되며 앞에 E가 붙음(EAX, EBX, EDX)
- 32bit 크기의 레지스터 8개로 구성되어 상수/주소를 저장할 때 쓰임
- 각 레지스터들은 16bit의 하위 호환을 위해 2개의 구획이 나눠진다
- 인덱스 레지스터와 포인터 레지스터는 범용 레지스터에 포함한다
(1) EAX (Extended Accumulator Register)
- 누산기라고도 불리며 데이터 전송(입출력) 및 연산 후의 결과 값을 잠시 저장
- 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행할 때 사용되어 반환 값이 저장됨
- AX를 반으로 나눠 AH와 AL로 나뉘어 8bit씩 가진다
(2) EBX (Extended Base Register)
- 메모리 주소를 저장하기 위한 용도로 사용
- 특정 주소 지정을 위한 BX로 DI나 SI와 결합할 수 있음
- 산술에서 쓰이기도 함
(3) ECX (Extended Count Register)
- 어떤 명령을 반복적으로 수행할 때 횟수를 저장하는데 사용
- 반복문이나 shift 등에서 주로 사용
(4) EDX (Extended Data Register)
- EAX의 확장 개념으로 함께 곱셈이나 나눗셈 등 일부 명령에서는 필수적으로 사용함
- 곱하기나 나누기 같은 복잡한 연산에서 추가적으로 데이터를 저장할 때 사용
- 범용 목적의 저장소로 사용하기도 함
1 - 2) 인덱스 레지스터
(1) EDI (Extended Destination Index)
- 복사할 때 목적지 주소가 저장됨
- 목적지 인덱스를 나타내거나 연산의 결과가 저장되는 위치를 나타내는 데 사용
- 레지스터를 쓰기 위해 사용
(2) ESI (Extended Source Index)
- 데이터를 조작하거나 복사할 때 데이터의 주소가 저장됨
- 소스 인덱스를 나타내기 위해 사용
- 입력 데이터 스트림의 위치를 나타내기 위해 사용
1 - 3) 포인터 레지스터
(1) ESP (Extended Stack Pointer)
- Stack의 끝 지점 주소 포인터
- 현재까지 사용된 스택의 위치를 저장하기 위해 사용
(2) EBP (Extended Base Pointer)
- Stack의 첫 시작 주소 포인터
- 함수 내에서 로컬 변수를 확인하거나 인자를 확할 경우 사용
(3) EIP (Extended Instruction Pointe)
- 다음에 실행해야 할 명령어의 주소 포인터
- 값을 직접 변경할 수 없고 간접적으로 변경해야 됨
- 명령어를 실행할 때마다 EIP의 값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 갖음
2) 세그먼트 레지스터
- 프로세스의 특정 세그먼트를 가리키는 포인터 역할을 해, 세그먼트 안의 특정 데이터와 명령어들을 정확하게 가져올 수 있음
- 16bit 크기의 레지스터 6개로 구성
- 세그먼트 : 메모리를 조각내 각각의 조각마다 시작 주소, 범위, 접근 권한 등을 부여해 메모리를 보호하는 기법
(1) CS (Code Segment)
- 기계 명령을 포함한 코드 세그먼트의 시작 주소를 가리킴
- 레지스터의 오프셋 값을 더하면 실행하기 위해 메모리로부터 가져와야 할 명령어 주소가 됨
(2) DS (Data segment)
- 프로그램에 정의된 데이터 세그먼트의 시작 주소를 가리킴
- 저장된 주소 값에 데이터의 오프셋을 더해 데이터 세그먼트 내에 위치해 있는 데이터의 주소를 참조함
(3) SS (Stack Segment)
- 실행 과정에서 필요한 데이터, 연산 결과를 임시로 저장하거나 삭제할 때 사용하는 스택 세그먼트의 시작 주소를 가리킴
(4) ES (Extra(Data) Segment)
- 메모리 주소 지정을 다루는 문자 데이터 연산에 사용
- 추가로 사용된 데이터 세그먼트의 주소를 가리킴
(5) FS, GS (Data Segment)
- 여분의 레지스터
3) 플래그 레지스터
- 여러 가지의 상태 값을 저장하는 레지스터
- 비트가 각각 서로 다른 의미를 갖고 있어 독립적으로 사용됨
- 상태 플래그, 컨트롤 플래그, 시스템 플래그의 집합
(1) CF (Carry Flag)
- 덧셈의 결과가 높은 자리로 자리 올림수가 발생하거나 뺄셈 후 빌림 수가 발생한 경우 1로 세트 됨
- 부호 없는 정수 연산에서 오버플로 상태를 나타냄
(2) PF (Parity Flag)
- 연산 결과 1비트들의 개수
- 개수가 짝수인 것이 짝수 패리티, 홀수인 것이 홀수 패리티
(3) AF (Auxiliary Flag)
- 산술 연산에서 비트 3에 carry혹은 빌림 수가 발생하면 1, 발생하지 않으면 0
(4) ZF (Zero Flag)
- 연산의 결과 값이 0이되면 1로 세트
(5) SF (Sign Flag)
- 부호가 있는 정수의 부호 비트를 나타냄
- 0이면 양수, 1이면 음수
(6) OF (Overflow Flag)
- 오버플로 혹은 언더플로가 발생하면 1로 세트
3 - 1) 컨트롤 플래그
- 프로세서의 동작 상태를 제어
(1) DF (Direction Flag)
- 문자열 처리 방향을 정함
- 0이면 선증가 1이면 선감소로 지정
3 - 2) 시스템 플래그
(1) TF (Trap enable Flag)
- 1로 세트되면 프로세스는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생함
(2) IF (Interrupt enable Flag)
- 외부 인터럽트 발생 허용을 제어
- 1이면 외부 인터럽트 허용, 0이면 금지
- 내부 인터럽트와는 관련 없음
* 이 외에도 IOPL, NT, RF , VM, AC, VIF, ID가 있다
<이미지 출처>
https://spark.kro.kr/43
3. 퀴즈
Q1) 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역은? ( )
Q2) 초기화 된 데이터는 데이터 영역에서도 BSS에 저장된다. ( O / X )
Q3) 16bit에서 사용되는 범용 레지스터는 EAX, EBX, ECX 등이 있다. ( O / X )
Q4) 다음 중 세그먼트 레지스터에 대해 틀린 설명을 고르시오 ( )
(1) 특정 세그먼트를 가리키는 포인터 역할을 한다
(2) FS는 여분의 레지스터이다
(3) 메모리를 조각내 각각의 조각마다 시작 주소, 범위 등을 부여해 메모리를 보호하는 기법이다
(4) SS는 스택 세그먼트의 시작 주소를 가리킨다
Q5) OF 플래그 레지스터가 1이라면 언더플로가 발생한 것이다. ( O / X )
정답
A1) Stack 영역
Stack 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수를 저장한 뒤 함수 호출이 완료되면 소멸한다
A2) X
초기화된 데이터는 data영역에 초기화 되지 않은 데이터는 BSS 영역에 저장된다
A3) X
EAX< EBX, ECX 등은 16bit가 아닌 32bit에 사용되는 레지스터이다. 16비트에서는 AX, BX, CX를 사용한다.
A4) (3)
(3)에 해당하는 설명은 세그먼트 레지스터에 대한 설명이 아닌 세그먼트에 대한 설명이다.
나머지는 세그먼트 레지스터에 대한 설명이 맞다.
A5) O
OF 플래그 레지스터는 오버플로 혹은 언더플로가 발생하면 1로 설정된다
'Study > 컴퓨터 구조' 카테고리의 다른 글
컴퓨터 구조 - 캐시 기억장치 (0) | 2020.06.06 |
---|---|
컴퓨터 구조 - 분기 명령어와 서브루틴 (0) | 2020.05.29 |
컴퓨터 구조 - 명령어를 효과적으로 실행하기 위한 기법 (0) | 2020.05.23 |
컴퓨터 구조 - 어셈블리 언어 (0) | 2020.04.18 |
컴퓨터 구조 - 데이터의 표현과 컴퓨터 연산 (0) | 2020.04.18 |
댓글