Register에 대해서 자세히 이야기 해보려고 한다.
우선 Register는 다른 글에서 설명했다시피 CPU가 데이터를 저장하고 주소를 참조하는 용도로 사용이 된다.
이번엔 Register의 종류와 각 Register가 하는 일들에 대해서 이야기 해보도록 하겠다.
주용도가 있으나 다양한 용도로 사용 가능한 레지스터이다.
32bit 때에는 r이 e로 바뀐다.
세그먼트 레지스터는 메모리 관리와 보호 기능을 제공하기 위해 사용되는 레지스터이다.
여기서 말하는 보호 기능은 메모리 접근 제어을 말한다.
CS (Code Segment): 현재 실행 중인 코드 세그먼트의 기본 주소를 가리킨다. CS 레지스터와 명령 포인터 (IP 또는 EIP)를 결합하여 실행 중인 명령의 실제 메모리 주소를 파악할 수 있다.
DS (Data Segment): 일반 데이터 세그먼트의 기본 주소를 가리킵니다. 대부분의 데이터 참조 및 연산은 이 세그먼트에서 발생한다.
SS (Stack Segment): 스택의 기본 주소를 가리킨다. 스택 포인터 (SP 또는 ESP)와 함께 사용되어 스택 내에서의 실제 메모리 위치를 결정한다.
ES (Extra Segment): 추가 데이터 세그먼트를 가리키는 데 사용한다. 일부 명령어, 특히 문자열 관련 명령어에서 대상 세그먼트로 사용한다.
현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다.
여기서 말하는 코드 영역, 데이터, 스텍 메모리 영역은 다음 시간에 더 자세히 다뤄보려고 한다.
현재 실행되고 있는 명령어의 주소를 담고 있는 레지스터를 명령어 포인터 레지스터라고 한다. 이 레지스터의 주요 역할은 프로그램의 실행 흐름을 관리하는 것이다.
IP(Instruction pointer)로 32bit에서는 EIP 64bit에서는 RIP라고 쓰인다.
명령어 포인터는 현재 실행 중인 명령어의 다음 명령어로 자동으로 넘어갈 수 있다. 그런데 제어 전송 명령어(예: 점프, 호출, 반환 등)를 사용하면 명령어 포인터의 값이 변경될 수 있다.
Flag register는 cpu의 특정 연산의 결과나 상태를 나타내는 데 사용되는 비트들로 구성된 레지스터이다. 여기서 flag가 무엇인지 궁금해 할 수 있다.
flag는 특정 조건 또는 상태를 나타내는 데 사용되는 변수나 데이터 구조의 일부를 나타내는 것으로 알면 편하다.
드림핵에서는 좀더 쉽게 표현하였기에 여기서 인용하려고 한다.
"깃발을 올리고, 내리는 행위로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현합니다."
이렇게 오늘은 레지스터에 대해서 이야기를 해보았다. 다음 시간에는 스텍 프레임, 코드 영역, 데이터 영역 등에 대해서 이야기 해보도록 하겠다