본문 바로가기
  • PunkComputing
공부방

레지스터

by Mr.DOT 2020. 11. 27.
반응형

범용 레지스터 (General Register) 란?

 - 컴퓨터의 중앙처리장치(CPU) 내에 있으며 연산처리,연산결과, 복귀주소등 작은 데이터를 기억하는 레지스터 이다.

 

범용 레지스터의 종류

 

1) EAX ( Extended Accumlator Register )

 - 산술(덧,곱,나눗셈 등), 논리연산을 수행하여 함수의 반환값이 저장된다.

2) EDX ( Extended Data Register )

 - 큰 수의 곱셈과 나눗셈 연상에서 EAX 레지스터와 함께사용이되고 부호 확장 명령등에 사용된다. 

   (EAX레지를 서포트)

3) EBX ( Extended Base Register )

 - ESI 레지스터나 EDI레지스터와 결합될수 있으며 메모리 주소를 저장한다.

4) ECX ( Extended Count Register )

 - 반복 명령어 사용시 반복 카운터로 사용되는 값을 저장 한다.  

 

 

5) ESI ( Extended Source Index Register )

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

6) EDI ( Extended Destination Index Register )

 - 복사시에 목적지의 주소가 저장된다.

 

 

7) ESP ( Extended Stack Point Register )

 - 스택프레임에서 스택의 가장 끝지점 주소가 저장 되며 

   Push Pop 명령에 따라 ESP의 값이 4바이트씩 이동한다. 

8) EBP ( Extended Base Point Register )

 - 스택프레임에서 스택의 시작 지점 주소가 저장된다.

   스택프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않는다.

 

# EAX, EBX, ECX, EDX의 주사용 용도는 데이터를 저장한다.

   ESP, EBP, ESI, EDI의 주 사용 용도는 주소를 저장한다.



 


레지스터는 cpu에서 사용하는 고속 기억장치이다. 

 

간단한 명령어는 외워두자고 생각했지만 생각보다 익숙하지 않고 용어가 거의 비슷해서 포스팅함. 

 

 

인텔 x86 cpu의 아키텍쳐(IA-32)에서는 9개의 범용 레지스터를 제공한다. 

 

 

이것을 두가지로 분류 할 수 있는데,

 

프로그램에서 사용하는 것 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP

OS에서 사용하는 것 EIP

 

물론 다른 레지스터들이 존재하지만 추후에 알아둬야 할 레지스터가 있다면 추가로 올려두겠다. 

 

위의 9가지는 기본이니 알아두는게 좋다. 

 

 

 

EAX(Extended Accumulator Register)

--> 곱셈, 나눗셈 명령에 사용, 함수의 리턴값 저장

 

EBX(Extended Base Register)

--> ESI, EDI 둘중하나의 레지스터와 결합해서 인덱싱에 사용함

 

ECX(Extended Counter Resister)

--> 반복을 사용할 때 반복 count를 저장하는 용도. 

 

EDX(Extended Data Register)

--> EAX 와 같이 사용되고 부호 확장 명령 등에 쓰임.

 

ESI(Extended Source Index)

--> 데이터 복사, 데이터 조작을 하는 경우 소스 데이터 주소가 저장. ESI 레지스터가 가리키는 주소에 있는 데이터를 

     EDI 레지스터가 가리키는 주소로 복사하는 용도로 주로 사용된다고 함

 

EDI(Extended Destination Index)

--> 복사 작업 시 목적지 주소가 저장됨. 주로 ESI 레지스터가 가리키는 주소의 데이터를 복사함

 

EBP(Extended Base Pointer)

--> 하나의 스택 프레임 시작 주소가 저장됨. (이건 아마 자주 봐서 좀 익숙하다) 현재 사용하고 있는 스택프레임이 존재하는 

     동안 불변하는 값이다. 이게 있어야 스택 프레임이 날라갔을 때 되돌아올 곳을 알 수 있으니까.

 

ESP(Extended Stack Pointer)

--> 하나의 스택 프레임의 끝 지점 주소 저장 PUSH, POP 에 따라서 ESP 값이 변한다. 

 

 

 

EIP(Extended Instruction Pointer)

--> 다음에 실행할 명령어가 저장된 메모리 주소가 저장됨. 


1. EAX(Extended Accumulator Register)

 

첫번째로, EAX 레지스터에 대해 알아보도록 하겠습니다. EAX 레지스터는 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행하며 함수의 반환값이 이 레지스터에 저장됩니다. 즉, 덧셈, 곱셈, 나눗셈 등의 명령은 모두 EAX 레지스터를 사용하며, 함수의 반환 값이 EAX 레지스터에 저장되므로 호출 함수의 성공 여부, 실패 여부를 쉽게 파악할 수 있으며, 반환값을 쉽게 얻어올 수 있습니다. 직접 EAX 레지스터의 값이 어떻게 변하는지 확인해보도록 하겠습니다.

 

두 정수를 더하는 함수가 호출되고 나서 EAX 레지스터의 값이 어떻게 변하는지 확인해보기 위해, 아래와 같은 구조의 프로그램을 디버깅하여 EAX 레지스터의 값을 살펴보았습니다.

#include <iostream> using namespace std; int add(int a, int b); int main() { int a, b; cout << "두 정수를 입력해주세요: "; cin >> a >> b; cout << "두 정수의 합은 " << add(a, b) << "입니다." << endl; return 0; } int add(int a, int b) { return a + b; }

프로그램을 실행하고 나서, 10과 20을 입력하며 a와 b를 초기화시켜 주었습니다. 그리고 add 함수가 호출되고 난 뒤에, EAX 레지스터의 값을 확인하기 위해 함수가 호출되는 부분에 브레이크 포인트를 걸어 확인해 보았습니다.

 

<EAX 레지스터: 00000001E -> 10진수로 30>

 

위의 사진에서, EAX 레지스터의 값을 확인해보니 add 함수의 반환값이 담겼음을 확인할 수 있습니다. 10과 20을 더해 EAX 레지스터에 값이 올라간겁니다. (추가로, EBX(Extended Base Register)는 ESI 레지스터나 EDI 레지스터와 결합될 수 있으며, 이 EBX 레지스터는 메모리 주소를 저장하기 위한 용도로 사용됩니다. EDX(Extended Data Register)는 EAX와 같이 쓰이고 부호 확장 명령 등에 쓰입니다. 큰 수의 곱셈 또는 나눗셈 등의 연산이 이루어질때, EDX 레지스터가 사용되어 EAX 레지스터와 함께 쓰입니다.)

 

2. ECX(Extended Counter Register)

 

두번째로는 ECX 레지스터로, 말 그대로 카운터 레지스터입니다. 주로 반복 명령어 사용시 반복 카운터로 사용되는 레지스터입니다. ECX 레지스터에 반복할 횟수를 지정하고, 반복 작업을 수행합니다. 한번 반복을 제어하는 값인 카운터 변수의 값과 ECX 레지스터를 비교해가며 확인해보도록 합시다.

 

정수형 데이터를 10개나 담을 수 있는 정수형 배열 arr와, 카운터 변수인 i가 있다고 가정합시다. 그리고 for문을 사용하여 사용자에게 arr[i]의 값을 입력받는다고 하고, 모두 입력되었으면 다시 for문을 통해 arr[i]의 값을 출력하는 프로그램을 디버깅 한다고 가정합시다.

 

<ECX 레지스터: 현재 카운터 변수 i의 값은 9>

 

ECX 레지스터를 가만히 살펴보시면, 한번 반복되면 ECX 레지스터의 값이 변함을 알 수 있습니다. 참고로, ECX 레지스터는 반복이나, 시프트 연산자(비트 이동) 등에 사용됩니다.

 

3. ESI/EDI(Extended Source/Destination Index)


ESI(Extended Source Index)는 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장됩니다. EDI(Extended Destination Index)에는 복사 시에 목적지의 주소가 저장됩니다.

4. ESP/EBP(Extended Stack/Base Pointer)

 

ESP(Extended Stack Pointer)에는 스택 프레임의 끝 지점 주소(스택의 가장 아랫부분, 스택의 마지막)가 저장되며, PUSH, POP 명령에 따라 ESP의 값이 4바이트씩 변합니다. EBP(Extended Base Pointer)에는 스택 프레임의 시작 지점 주소(스택의 가장 윗 부분, 스택의 처음)가 저장됩니다. EBP 레지스터는 현재 사용되는 스택 프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않습니다.

<X86 스택 레이아웃>

(위에서 스택의 가장 아랫부분, 가장 윗 부분이라고 한 것은 스택 메모리가 아래부터 올라오기 때문에 가장 아래가, 가장 위에 있는 데이터를 가리키고, 가장 위에가 가장 아래에 있는 데이터를 가리키는 것입니다.)



반응형

'공부방' 카테고리의 다른 글

tar 사용법  (0) 2020.12.17
2021년 리눅스에서 가상머신환경 만들기 VMware 문제해결  (0) 2020.12.17
ASCII  (0) 2020.11.27
Entry Sequenced File  (0) 2020.11.27
ssh  (0) 2020.11.23

댓글