JSCC: JavaScript로 개발하는 C Compiler

코스 전체목록

닫기

레지스터(register)

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와 같은 점프 구문에서 자주 활용된다.

이와 같이 레지스터의 종류를 간단하게 알아볼 수 있었다이것이 실제로 어떻게 쓰이는지는 코드를 통해 확인할 것이다.

댓글

댓글 본문
graphittie 자세히 보기