본문 바로가기
Study/Reversing

[Reversing] 32bit 레지스터의 종류와 특징

by Jamie Lim 2020. 9. 7.

레지스터란?

   - CPU의 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치이고 처리 결과 역시 이 곳에 저장된다.

   - 공간은 작지만 CPU와 직접 연결되어 있어 연산 속도가 메모리보다 훨씬 빠르다.

   - 종류

     > 범용 레지스터

     > 인덱스 레지스터

     > 포인터 레지스터

     > 세그먼트 레지스터

     > 플래그 레지스터

 

 1) 범용 레지스터

   - 범용적으로 막 쓰는 레지스터로 어셈블리 명령어에서 특정 레지스터를 조작하는데 사용하기도 한다.

   - 32bit 크기의 레지스터 8개로 구성되어 상수/주소를 저장할 때 쓰인다.

   - 인덱스 레지스터와 포인터 레지스터는 범용 레지스터에 포함된다.

 

 

   (1) EAX 레지스터 (Extended Accumulator Register)

     - 누산기라고 불리며 데이터 전송(입출력) 및 연산 후의 결과 값을 잠시 저장하는데 사용된다.

     - 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행할 때 사용해 반환 값을 저장한다.

     - AX를 반으로 나눠 AHAL8bit씩 갖는다.

 

 

   (2) EBX (Extended Base Register)

     - 메모리 주소를 저장하기 위한 용도로 사용된다.

     - 특정 주소 지정을 위한 BXDISI와 결합해 사용할 수 있다.

     - 산술이나 변수 저장에 사용되기도 한다.

     - BX를 반으로 나눠 BHBL8bit씩 갖는다.

 

 

   (3) ECX (Extended Count Register)

     - 어떤 명령을 반복적으로 수행할 때 횟수를 저장하는데 사용한다.

     - 반복문이나 shift 등에서 횟수를 셀 때 주로 사용된다.

     - CX를 반으로 나눠 CHCL8bit씩 갖는다.

 

   (4) EDX (Extended Data Register)

     - EAX의 확장 개념으로 함께 곱셈이나 나눗셈 등의 일부 명령에서 필수적으로 사용된다.

     - 곱하기나 나누기 같은 복잡한 연산에서 추가적으로 데이터를 저장해야 할 때 사용한다.

     - 범용 목적의 저장소로 사용하기도 한다.

     - DX를 반으로 나눠 DHDL8bit씩 갖는다.

 

 1 – 2) 인덱스 레지스터

   - 인덱스 주소 지정과 덧셈, 뺄셈에서 사용한다.

 

   (1) ESI (Extended Source Index)

     - 데이터를 조작하거나 복사할 때 데이터의 주소가 저장된다.

     - 문자열 명령어 조작을 위한 소스 인덱스를 나타내기 위해 사용한다.

     - 문자열 전송이나 비교에서 사용해 소스 문자열의 주소를 저장한다.

     - 일반적인 전송이나 연산에도 이용된다.

     - ESI의 오른쪽 16비트가 SI이다.

 

 

   (2) EDI (Extended Destination Index)

     - 복사할 데이터의 목적지 주소가 저장된다. (주로 ESI 레지스터가 가리키는 주소의 데이터)

     - 목적지 인덱스를 나타내거나 연산의 결과가 저장되는 위치를 나타내는 데 사용한다.

     - 문자열 전송이나 비교에서 사용해 목적지 주소를 저장한다.

     - EDI의 오른쪽 16비트가 DI이다.

 

 1 – 3) 포인터 레지스터

   (1) ESP (Extended Stack Pointer)

     - Stack의 끝 지점 주소가 저장된다.

     - 스택 최상부 위치의 오프셋 주소를 갖는다. (함수를 호출할 때 돌아갈 주소 저장)

     - PUSH, POP 명령어에 따라 4byte씩 변한다.

 

 

   (2) EBP (Extended Base Pointer)

     - Stack의 첫 시작 주소가 저장된다.

     - 스택의 데이터에 접근할 때 사용한다.

 

 

   (3) EIP (Extended Instruction Pointer)

     - 다음에 실행해야 할 명령어의 주소를 저장한다.

     - 값을 직접 변경하지 않고 간접적으로 변경할 때 사용한다.

     - 명령어를 실행할 때마다 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) EFLAGS 레지스터 (Extended Flags Register)

   - 여러 산술 연산 결과의 상태를 저장하는 레지스터이다.

   - 비트가 각각 서로 다른 의미를 갖고 있어 독립적으로 사용된다.

   - 플래그를 1로 설정하는 것을 set, 0으로 설정하는 것을 clear 혹은 reset이라고 한다.

 

 

 3 - 1) 상태 플래그

   (1) CF (Carry Flag)

     - 덧셈의 결과가 높은 자리로 자리 올림수가 발생하거나 뺄셈 후 빌림 수가 발생하면 1(set), 아니면 0(clear)이 된다.

     - 부호가 없는 정수 연산에서 오버플로 상태를 나타낸다.

 

 

   (2) PF (Parity Flag)

     - 연산 결과에서 1인 비트의 개수가 짝수이면 1(set), 홀수이면 0으로 0(clear)이 된다.

 

 

   (3) AF (Auxiliary Flag)

     - 산술 연산에서 3번 비트에 올림 수 혹은 빌림 수가 발생하면 1(set), 발생하지 않으면 0(clear)이 된다.

 

 

   (4) ZF (Zero Flag)

     - 연산의 결과 값이 0이면 1(set), 아니면 0(clear)이 된다.

 

 

   (5) SF (Sign Flag)

     - 부호가 있는 정수의 부호 비트를 나타낸다.

     - 양수라면 0(clear)으로, 음수라면 1(set)가 된다.

 

 

   (6) OF (Overflow Flag)

     - 오버플로 혹은 언더플로가 발생하면 1(set), 아니라면 0(clear)이 된다.

 

 3 – 2) 컨트롤 플래그

   (1) DF (Direction Flag)

     - 문자열 처리 방향을 정한다.

     - 1(set)이라면 문자열은 주소 값이 감소하면서(정방향) 처리되고, 0(clear)이라면 증가하면서(역방향) 처리된다.

 

 3 – 3) 시스템 플래그

   (1) TF (Trap enable Flag)

     - 1(set)라면 프로세스는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생한다.

 

 

   (2) IF (Interrupt enable Flag)

     - 외부 인터럽트 발생 허용을 제어하는 플래그다.

     - 1(set)라면 외부 인터럽트를 허용하고, 0(clear)이라면 금지한다.

     - 내부 인터럽트와는 관련이 없다.

 

 

  * 이 외에도 IOPL, NT, RF, VM, AC, VIF, ID가 있다.

 

 

< 이미지 출처 >
https://spark.kro.kr/43

댓글