본문 바로가기
System Hacking

#1 x86 레지스터의 종류와 기능

by zz! 2024. 5. 7.
728x90

레지스터란 CPU 내에서 데이터를 임시 저장하기 위한 고속의 작은 메모리 영역이다.

산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다.

(전 포스팅에 작성했다.)

https://wsul.tistory.com/entry/0-80x86-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EC%9D%B4%ED%95%B4

 

#0 80x86 시스템의 이해

80x86 시스템 CPU는 인텔에 의해 개발된 마이크로프로세서의 계열을 지칭하는 용어이다.이 계열의 CPU 중 초기 모델에는 8086과 8088이 포함된다. 그래서 8086과 8088을 먼저 알아보도록 하겠다. 1. 인텔

wsul.tistory.com

 

1. x86 (32bit) 아키텍처: 레지스터

x86 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터가 있다. 

1-1 범용 레지스터 (General Register)

연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등 여러 목적으로 사용할 수 있는 레지스터이다.

EAX 누산기(Accumulator) 32 함수의 반환 값과 산술 연산에 주로 사용된다.
EBX 베이스 레지스터 (Base Register) 32 특정 주소를 저장한다.
ECX 카운트 레지스터 (Count Register) 32 반복적으로 실행되는 특정 명령에 사용한다.
EDX 데이터 레지스터 (Data Register) 32 일반 자료를 저장한다. (입출력 동작에 사용)

앞의 E는 '확장된 (Extended)' 을 의미하고, 32비트 레지스터이다. 

이 레지스터의 오른쪽 16비트를 각각 AX, BX, CX, DX라고 하고, 이 부분은 다시 둘로 나뉜다.

이미지를 너무 못 만든것 같다.

ex) EAX에서 오른쪽 16비트를 AX라고 하고, 이 AX가 다시 둘로 나뉘어져 왼쪽 8비트 상위 부분은 AH, 라고 하고, 오른쪽 8비트 하위 부분을 AL이라고 한다.

- EAX 레지스터

누산기인 EAX 레지스터는 입출력과 대부분의 산술 연산에 사용한다. ex) 곱셈, 나눗셈, 변환 명령은 EAX를 사용한다.

참고로 Win32 API 함수들은 모두 리턴 값을 EAX에 저장한 후 리턴한다. (Win32 API를 잘 몰라서 "오 지린다" 라는 느낌이 안든다. ㅇㅇ)

누산기(Accumulator) : 연산의 중간 결과 저장

- EBX 레지스터

DS 세그먼트의 포인터를 주로 저장하고, ESI나 EDI와 결합하여 인덱스에 사용한다. 

- ECX 레지스터

루프가 반복되는 횟수를 제어하는 값, 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함할 수 있다.

- EDX 레지스터

입출력 연산에 사용한다. 큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용한다.

 

1.2 세그먼트 레지스터

세그먼트 ??

메모리 관리를 위해 메모리를 논리적으로 구분한 영역을 의미한다. 프로그램에 정의한 메모리상의 특정 영역으로 코드, 데이터, 스택 등을 포함한다.

세그먼트 레지스터는 각 세그먼트의 주소를 지정한다. 특히 PC 계열에 사용하는 인텔 프로세서는 자신의 주소 지정 기능을 제공한다.

- CS 레지스터

실행될 기계 명령을 포함한다. 현재 실행 중인 코드 세그먼트의 시작 주소를 가리키며, CPU는 이 레지스터를 사용하여 프로그램의 명령어를 가져온다. 

- DS 레지스터

프로그램에 정의된 데이터, 상수, 작업 영역을 포함한다. 데이터 세그먼트의 시작 주소를 가리킨다.

- SS 레지스터

프로그램을 실행할 때, 실행 과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제하는 등의 목적으로 사용한다. 스택 세그먼트의 시작 주소를 가리킨다.

- ES, FS, GS 레지스터

ES 레지스터는 추가로 사용된 데이터 세그먼트의 주소를 가리킨다. string 연산에 사용하는데, 이때 EDI 레지스터와 함께 사용한다. FS, GS 레지스터도 목적은 비슷하나, 실제로는 거의 사용하지 않는다.

 

1.3 포인터 레지스터

프로그램의 실행 과정에서 사용하는 주요 메모리 주소 값을 저장한다.

- EBP 레지스터

스택 세그먼트에서 현재 호출해서 사용하는 함수의 시작 주소 값을 저장한다. 함수로 전달되는 지역 변수 등을 참조할 때 기준이 되며, ESP 레지스터와 함께 써서 스택 프레임을 형성하기도 한다. 실제 메모리상의 주소를 참조할 때 SS 레지스터와 함께 사용을 합니다.

- ESP 레지스터

현재 스택 영역에서 가장 하위 주소를 저장한다. 실제 메모리상의 주소를 참조할 때 SS 레지스터와 함께 사용한다.

- EIP 레지스터

EIP는 현재 실행 중인 코드 세그먼트에 속한 현재 명령을 가리키며, 실제 메모리상의 주소를 참조할 때 CS 레지스터와 함께 사용합니다.

 

1.4 인덱스 레지스터

데이터를 복사할 때 출발지와 목적지 주소를 각각 가리키는 레지스터로 사용합니다.

- ESI & EDI 레지스터

주로 메모리의 한 영역(source)에서 다른 영역(Destination)으로 데이터를 연속적으로 복사할 때 사용합니다.

ex) strcpy(Destination, source) 함수는 source의 문자열을 Destination으로 복사할 때 두 메모리 주소를 저장하는데 ESI와 EDI 레지스터를 사용합니다.

 

1.5 플래그 레지스터

크기가 32비트로, 컴퓨터의 다양한 상태를 나타내는 비트를 포함합니다. 상태 플래그(State Flag), 제어 플래그(Control Flag), 시스템 플래그(System Flag)로 구성됩니다.

많은 명령이 플래그 상태를 변화 시킵니다. 또 어떤 명령은 다음 행동을 결정하려고 플래그 상태를 점검합니다.

상태 플래그 (State Flag)

0, 2, 4, 5, 7, 11비트는 산술 명령(ADD, SUB, MUL, DIV) 결과를 반영합니다.

CF(Carry Flag) 비트 0 : 산술 연산 결과로 자리올림이나 자리내림이 발생할 때 세트됩니다.(1)

ZF(Zero Flag) 비트 6 : 산술 연산 결과가 0이면 세트되고(1), 0 이외에는 클리어됩니다.(0)

OF(Overflow Flag) 비트 11 : 부호가 있는 수의 오버플로가 발생하거나 MSB를 변경했을 때 세트된다 (1)

다음과 같은 상태 플래그도 있습니다.

PF(Parity Flag) 비트 2 : 산술 연산 결과가 짝수이면 세트된다(1)

AF(Adjust Flag) 비트 4 : 8비트 피연산자를 사용한 산술 연산에서 비트 3을 비트 4로 자리올림하면 세트된다(1)

SF(Sign Flag) 비트 7 : 산술 및 논리 연산 결과가 음수이면 세트된다(1)

(나머지 플래그는 차차 이쪽 계열 공부를 하면서 적어보도록 하겠습니다.)

728x90