안 쓰던 블로그

컴퓨터 구조-메모리 구조와 레지스터 본문

컴퓨터 구조

컴퓨터 구조-메모리 구조와 레지스터

proqk 2020. 5. 24. 22:16
반응형

메모리 구조

프로그램이 실행되면 OS가 메모리(RAM)에 공간을 할당한다

할당해주는 메모리 공간은 데이터, 코드, 스택, 힙의 4가지가 있다

1. 데이터 영역

전역변수와 static변수가 할당된다

프로그램 시작과 동시에 할당되며, 프로그램이 종료될 때 메모리가 소멸된다

 

2. 코드 영역

유저가 작성한 소스코드가 들어가는 영역, 실행할 프로그램의 코드가 저장된다

 

3. 스택 영역

프로그램이 자동으로 사용하는 임시 메모리 영역

함수 호출 시 생성되는 지역 변수와 매개변수가 저장되며, 함수 호출이 완료되면 메모리가 소멸된다

컴파일될 때 메모리 공간을 가짐

 

4. 힙 영역

프로그래머가 할당하고 해제하는 메모리 공간

이 공간을 동적 데이터 영역이라고도 하며, 여기에 메모리를 할당하는 것을 동적 할당이라고 한다

런타임 시에 크기가 결정된다

 

레지스터의 종류

1. 범용 레지스터

EAX: 누산기 레지스터, 입출력/산술/논리 연산에 사용된다

EBX: 베이스 레지스터, 주소 지정 확장이나 초기 주소 지정을 위해 사용된다

ECX: 카운터 레지스터, 반복문의 횟수를 지정하는 데 사용된다

EDX: 데이터 레지스터, EAX의 보조 누산기로 주로 사용되며 보조값을 저장한다

EBP: 베이스 포인터, 스택의 베이스 포인터로 사용된다. 베이스 포인터가 스택의 시작점이 되며, EBP를 기준으로 지역 변수 및 함수 인자가 접근이 된다

ESP: 스택 포인터, 현재까지 사용된 스택의 위치를 저장한다

ESI, EDI: 연산 및 간접 주소 연산에 주로 사용, 문자열 처리를 담당한다

 

2. 포인터 레지스터

특정 주소를 가리키는 레지스터

BP: 베이스 포인터, 주소를 간접 지정한다

SP: 스택 포인터, 스택의 맨 마지막 자료의 주소 값을 저장한다

IP: 다음에 수행할 명령어가 저장되어있는 주소를 가리킨다

 

3.  세그먼트 레지스터

길이는 16비트이며 세그먼트 영역 메모리에 주소를 지정한다

CS: 코드 세그먼트, 함수나 제어문 같은 명령어들이 저장된다

DS: 데이터 세그먼트, 전역/정적 변수 데이터가 들어있다

SS: 스택 세그먼트, 주소와 데이터를 일시적으로 저장할 목적으로 쓰이는 스택의 주소를 지정하는데 쓰인다

ES: 추가 레지스터, 문자 데이터의 주소를 지정한다

FS, GS:  ES와 같은 엑스트라 세그먼트 레지스터

 

4. EFLAGS 레지스터

1) 상태 플래그

캐리 플래그: 산술연산 결과가 자리 올림이나 자리 내림이 발생하면 set

패리티 플래그: 산술연산 결과가 하위 1바이트 중 1비트가 짝수면 set, 아니면 clear(0)

보조 캐리 플래그: 산술연산 결과가 비트3자리에 자리 올림이나 자리 내림이 발생하면 set

제로 플래그: 산술연산 결과가 0이면 set, 아니면 리셋(0)

부호 플래그: 최상위 비트의 결과와 같은 결과로 set(1). Signed Interger로 사용되는 경우 이 플래그가 0이면 양수, 1이면 음수다

오버플로우 플래그: 연산 결과가 사인 비트를 제외한 최대 허용 정수값보다 크거나 최소 정수보다 작으면 set

 

2) 제어 플래그

방향 플래그: 문자열을 처리하는 스트링 명령을 제어하는 플래그, set(1)되어 있으면 높은 주소에서 낮은 주소로 처리, clear(0) 되어 있으면 낮은 주소에서 높은 주소로 처리한다

 

3) 시스템 플래그

트랩 플래그: 디버깅 할 때 한 명령씩 프로그램을 수행하도록 설정되어 있다면 set

인터럽트 플래그: 프로세스로부터 인터럽트가 발생하면 인터럽트 처리를 할 것인지 제어. set이면 인터럽트 신호가 들어왔을 때 인터럽트를 처리하고, clear되어 있다면 인터럽트 신호가 오더라도 반응하지 않는다

 

 

[연습 문제]

1. 다음 d변수는 어떤 영역에 할당될까?

void f(){
    int d = 30;
}
더보기

스택영역

함수 안에 선언되어 있으므로 지역변수 d는 스택영역에 할당된다

2. 다음 중 범용 레지스터에 대한 설명으로 틀린 것은?

1) EAX: 입출력/산술/논리 연산에 사용된다

2) EBX: 주소 지정 확장이나 초기 주소 지정을 위해 사용된다

3) ECX: 반복문의 횟수를 지정하는 데 사용된다

4) EDX: 현재까지 사용된 스택의 위치를 저장한다

5) EBP: 스택의 베이스 포인터로 사용된다

더보기

4번

EDX는 데이터 레지스터로 EAX의 보조 누산기로 주로 사용되며 보조값을 저장한다

 

3. 다음이 설명하는 세그먼트 레지스터의 종류는? 이 레지스터에는 세그먼트, 전역 변수, 정적 변수 데이터가 들어있다

더보기

데이터 세그먼트 레지스터

 

 

4. 제어 플래그 중 방향 플래그가 1이다. 문자열은 어떤 순서로 처리될까?

1) 높은 주소->낮은 주소

2) 낮은 주소->높은 주소

더보기

답: 1번

방향 플래그가 set(1)이면 높은 주소->낮은 주소로 처리하고

clear(0)이면 낮은 주소->높은 주소로 처리한다

 

5. 시스템 플래그 중 인터럽트 플래그가 0이다. 인터럽트가 신호가 도착했을 때 어떻게 처리하는가?

더보기

clear(0)되어 있다면 인터럽트 신호를 무시한다

 

 

참고: 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/

반응형
Comments