본문 바로가기
Study/컴퓨터구조

[3-2] 메모리 구조와 레지스터 종류

by 투말치 2020. 5. 23.

목차

    반응형

    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일 때는 인터럽트를 무시한다.

     

    반응형