3.2) 레지스터(register)
사전에서 레지스터의 정의를 찾으면 굉장히 복잡하게 이를 설명하는데, 그렇게 복잡하게 생각할 필요가 전혀 없다. 컴파일러를 구현하는 우리에게 레지스터란 그저 CPU만 쓸 수 있는 변수일 뿐이다. CIL에서는 사용자가 임의로 변수를 생성할 수 없도록 했는데, 이는 어셈블리와의 사양을 맞추기 위함이었다. 실제 어셈블리 프로그래밍에선, 아까 기본 변수라고 불렀던 변수들은 다음의 레지스터와 대응한다.
- 산술 레지스터: eax, ebx, ecx, edx
- 스택 포인터: ebp, esp
- 명령 포인터: eip
- 플래그: eflags
여기서 각각의 레지스터에 e가 붙은 건 extended를 의미하는데, 레지스터의 크기가 32bit라는 의미로 받아들이면 된다. 레지스터의 종류는 CIL이 제공하던 기본 변수보다 그 종류가 많은데, 실제 32bit 시스템의 레지스터의 목록을 용도에 따라 모두 나열해보면 아래와 같다.
- 범용 레지스터: 특별한 용도 없이 임의로 사용 가능한 레지스터.
> eax, ebx, ecx, edx의 네 가지 레지스터가 있다.
> 일반적으로 eax는 누산기, ecx는 카운터, edx는 데이터의 용도로 사용한다.
> ecx의 경우 loop와 같은 명령이 실제로 카운터로 사용하기 때문에 주의해야 한다.
> 범용 레지스터는 다음과 같이 분리될 수 있으며 각각에 접근할 수 있다.
- 포인터 레지스터: ebp, esp, eip
> CIL에서 사용되는 것과 같으므로 설명은 생략한다.
- 세그먼트 레지스터: 프로세스의 세그먼트를 표현하는 16bit 크기의 레지스터다.
> cs: code segment. 코드 세그먼트의 시작 주소를 가지고 있는 레지스터다.
> ds: data segment. 데이터 세그먼트의 시작 주소를 가지고 있는 레지스터다.
> ss: stack segment. 스택 세그먼트의 시작 주소를 가지고 있는 레지스터다.
> es: extra segment. 여분의 레지스터로 필요하면 사용한다. es, fs, gs의 세 가지가 있다.
- 인덱스 레지스터: esi, edi
> esi: extended source index.
> edi: extended destination index.
- 플래그 레지스터: eflags
> 연산의 결과에 대한 플래그를 저장한다.
> CMP, TEST와 같은 명령어로 값을 설정하고, JZ와 같은 점프 구문에서 자주 활용된다.
이와 같이 레지스터의 종류를 간단하게 알아볼 수 있었다. 이것이 실제로 어떻게 쓰이는지는 코드를 통해 확인할 것이다.