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 스택 레이아웃>

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