레지스터메인 메모리나 시스템 메모리 외에 CPU의 내부에 있는 특별한 메모리 이다.

레지스터는 CPU가 접근할 수 있는 메모리 중에서 

가장 빠르게 동작하는 메모리로 CPU가 여러가지 연산등을 처리하는 동안 

필요한 임시적인 데이터를 보관하는데 사용된다.


메인 메모리는 바이트 단위로 매겨진 번지 혹은 주소를 이용해서 접근할 위치를 구분하는데, 

레지스터의 경우 번지의 개념이 없고 모두 고유한 이름이 부여되어 있다.


여러 레지스터 중에서 운영체제가 특별한 용도로 사용하는 레지스터를 제외하면 일반적인 응용프로그램이 

직접 이용할 수 있는 레지스터는 불과 10개 정도에 지나지 않는다.


⚠ 어셈블리 언어로 프로그래밍을 하려면 C/C++과 같은 고급언어와 달리 CPU 내부에 있는 

    특별한 메모리에 대해서 잘 알고 있어야 한다.



Ⅰ. 범용 레지스터


EAX      EBX      ECX      EDX 

 

이 레지스터는 말그대로 범용적인 목적으로 사용되는 레지스터로 크기는 각각 32 비트이고 다른 레지스터에 

비해서 비교적 다양한 역할을 한다. 이름은 단순히 A B C D 라는 이름을 가진 레지스터이며 A B C D 는 

Accumulator, Base, Counter, Data 라는 단어의 첫 글자이기도 하다.       

 

16비트 시절에는 AX, BX, CX, DX 라는 이름을 가지고 있다가, 

386 CPU부터 레지스터의 크기가 32비트로 확장되면서 모두 이름앞에 E(Extended) 가 붙여진 것이다. 

 

16비트 시절의 AX, BX, CX, DX 는 모두 16비트 크기였지만 8비트 크기로 나누어서 접근이 가능했다. 

그래서 AX의 경우는 상위 8비트가 AH, 하위 8비트가 AL 이라는 이름을 가진다(H는 high, L은 Low라는 뜻). 

BX, CX, DX 의 경우도 마찬가지로 BH, BL, CH, CL, DH, DL 이라는 이름으로 8비트 단위의 접근도 가능하다. 


범용 레지스터는 32비트의 공간을 이름에 따라 다양한 크기로 접근할 수 있는데 

이는 범용 레지스터의 독특한 특징이기도 하다.




Ⅱ. 포인터 레지스터


이 레지스터는 메인메모리의 번지값을 저장해서 포인터의 역할을 하는 레지스터로 

16비트 시절에는 SI, DI, SP, BP, IP 라고 불리던 레지스트이다. 

범용 레지스터 마찬가지로 32비트로 확장 되면서 앞에 E가 붙게 된 것이다. 

각각의 이름은 Source Index, Destination Index, Stack Pointer, Base Pointer, Instruction Pointer 에서 유래한다. 

 

⚀ EIP :  현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소를 가리키는 레지스터


프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로그램의 실행 순서가 변경되는 

제어문이 실행될 때 자동으로 변경된다. 그래서 직접 접근해서 값을 저장하거나 읽거나 하는 일이 

없기 때문에 응용 프로그램에서는 손 댈 일이 없는 레지스터이다. 

 

⚁ ESI, EDI : 주로 메모리의 한 영역(Source)에서 다른 영역 (Destination)으로 데이터를 연속적으로 

   복사해서 옮길 때 사용하는 레지스터. 


이렇게 메모리의 번지를 저장하는 포인터의 역할 외에도 단순히 32비트 데이터를 저장하는 데도 사용할 수 있다. 

 

⚂ ESP, EBP : STACK 으로 동작하는 특별한 메모리 영역을 가리키는 데 사용되는 포인터 레지스터 


ESP 의 경우는 절대적으로 위에서 말한 용도로만 사용해야 한다. 


🁇 ESP 는 스택공간의 꼭대기를 가리키는 포인터 레지스터이다. 


ESP의 값은 직접 변경할 수도 있지만 보통은 스택에 데이터를 넣고 빼는 PUSH, POP 명령어의 

실행시 자동으로 변경된다.


 

🁈 EBP 는 ESP 에 보조적으로 사용되는 포인터 레지스터이다. 


스택 을 가리키는 데는 ESP 하나로도 충분하지만 ESP 대신 EBP를 보조적으로 사용하는 이유는 

프로그램의 오류로 중요한 스택 공간이 망가지는 일을 어느정도 방지할 수 있기 때문이다.

EBP를 이런 용도로 사용하지 않을 경우에는 단순히 데이터를 저장하는 용도로도 사용할 수 있다.



Ⅲ. 플래그 레지스터


EFLAGS 

 

이 레지스터는 16비트 시절 FLAGS 였고, 32비트로 확장 되면서 앞에 E가 붙은 것이다. 

이 레지스터는 이름이 암시하듯이 비트 단위의 플래그들을 저장하는 레지스터로 아주 특별한 용도로 사용된다. 

이 레지스터는 비트 단위로 의미를 가지는데 32 비트 모두가 사용되는 것은 아니고, 일부만 의미를 가진다. 

각각의 플래그 마다 SF (Sign Flag), ZF(Zero Flag), CF(Carry Flag), DF(Direction Flag) 등의 이름이 붙어 있다. 

 

보통 이 레지스터의 값을 직접 읽거나 쓰는 일은 거의 필요하지 않다. 각종 연산을 수행한 결과가 

어떠한 지를 기록해 놓는 용도나 특정 명령어의 동작을 조절하는 용도로 활용된다. 

연산 결과가 0인지 음수 인지 자리올림이 발생했는지 따라 각각 ZF, SF, CF등이 설정된다.

이렇게 설정된 플래그들은 조건 제어문들이 자동으로 참조해서

자신의 동작을 선택하기 때문에 우리가 직접 그 값을 챙길 필요는 없다. 

 

DF의 경우는 연속적으로 메모리 복사를 하는 명령어가 동작할 때 번지가 증가하면서 동작할지 감소하면서 

동작할 지를 지정해주는 용도로 사용된다. 이 때에도 이 플래그의 값을 켜고 끄는 명령어가 별도로 있기 

때문에 직접 EFLAGS 의 값을 손 댈 일은 없다. 

 

일반적인 응용 프로그램에서 DF의 경우를 제외하면 나머지 언급하지 않은 플래그들은 

물론 이거니와 ZF, SF, CF등도 관련되는 명령어들이 자동적으로 참조하기 때문에 

이들 플래그의 값을 직접 신경쓰지 않아도 무방하고 그냥 없는 듯이 여기면 된다. 



Ⅳ. 세그먼트 레지스터


CS    SS    DS    ES    (FS    GS) 

 

이들 레지스터는 모두 16비트 크기로 메모리의 특정 영역을 가리키는 용도로 사용되는 레지스터이다. 


인텔의 CPU는 메모리의 영역을 용도에 따라 세그먼트로 나누어서 사용한다. 

과거 16비트 프로그래밍 시절에는 한 세그먼트가 가리키는 메모리 영역이 64KB에 불과 했기
때문에 중요한 의미를 가졌지만 
요즘의 32비트 프로그래밍 시절에는 32비트 주소만 해도 4GB라는 

방대한 메모리 영역을 나타낼 수 있다. 그래서 운영체제가 한번 설정을 해주고 나면 응용 프로그램에서는 

신경 쓸일이 거의 없는 레지스터들이다. 일반적인 프로그램에서는 없듯이 생각해도 무방하다는 것이다. 

 

각각의 레지스터의 이름은 Code Segment, Stack Segment, Data Segment, Extra Segment이고  

코드 영역, 스택 영역, 데이터 영역 을 가리키는 용도로 사용된다.


굳이 세그먼트 레지스터에 대해서는 알 필요가 없다.




 꼭 알아야 하는 레지스터


범용 레지스터 : EAX, EBX, ECX, EDX 


포인터 레지스터 : ESI, EDI, ESP, EBP 




자료 참고 : http://blog.naver.com/kaswan/150938003

부산게임아카데미 김성완 교수님 블로그