반응형



안녕들 하시죠 !


오늘은 어플리케이션 디버깅을 위해 기본적으로 알아야할 IA-32 ( Intel Architecture 32 비트 )의 레지스터에 대해 공부해보겠습니다.

레지스터 또한 바이트 오더링 처럼 학교다닐때 컴퓨터 구조 시간에 공부했던것 같은데... 다 까먹었습니다.


CPU 레지스터란 ?


레지스터란 CPU 내부에 존재하는 다목적 저장공간 입니다.

우리가 일반적으로 저장공간( 메모리 )라고 얘기하는 RAM( Random Access Memory )와는 조금 성격이 다른데요.

CPU가 RAM에 있는 데이터를 엑세스하기 위해서는 물리적으로 먼 길을 돌아가야 합니다.

하지만 레지스터는 CPU와 한 몸이기 떄문에 고속으로 데이터를 처리할 수 있습니다.


IA-32는 지원하는 기능도 무척 많고 그만큼 레지스터의 수도 많다고합니다.

어플리케이션 디버깅의 초급 단계에서는 앞으로 가장 많이 보게될 Basic Program execution register에 대해 알아두어야 한다고 합니다.


Basic Program execution registers


ㆍ x87 FPU registers

ㆍ MMX registers

ㆍ XMM registers

ㆍ Control registers

ㆍ Memory management registers

ㆍ Debug registers

ㆍ Memory type range registers

ㆍ Machine specific registers

ㆍ Machine check registers 

등등 더 많은 레지스터들이 존재한다고합니다.


또 Basic Program execution registers는 다시 4개의 그룹으로 나눌 수 있다고 합니다.


ㆍ General Purpose Registers ( 32비트 8개 )

ㆍ Segment Registers ( 16비트 6개 )

ㆍ Program Status and Control Register ( 32비트 1개 )

ㆍ Instruction Pointer ( 32비트 1개 )


이후 뒷부분까지 쭉 읽어봤는데요... 레지스터 4개의 그룹을 한번에 다 이해하기는 너무 어려웠습니다.

저자께서는 처음에는 일단 General Purpose Registers 8개와 각각의 쓰임새 정도만 알아두어도 되고, 디버깅을 많이 하다 보면 저절로 쓰임새를 

알게 될 것이라고 하시니 오늘은 General Purpose Registers 에 대해서만 공부해보겠습니다.  


범용 레지스터 ( General Purpose Registers )


범용 레지스터는 범용으로 막 쓰는 레지스터 입니다.

IA-32에서 각각의 범용 레지스터들은 32비트( 4바이트 )씩 8개가 있는데요.

보통은 상수( 연산 처리, 연산 결과 ), 주소 ( 번지지정, 복귀주소 ) 등 작은 데이터의 임시 저장 공간 입니다. 




위에 있는 이미지는 Intel 홈페이지에서 무료 배포중인 IA-32 메뉴얼에서 발췌 했습니다.

4670장이나 되는 방대한 양인데요. 

우리가 찾는 범용 레지스터는 p73~74에 있으니 아래 링크를 참고해보시면 좋을 것 같습니다.


https://www.intel.co.kr/content/www/kr/ko/architecture-and-technology/64-ia-32-architectures-software-developer-manual-325462.html


8개의 범용 레지스터가 있고 각 레지드터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어집니다.



가장 위에있는 EAX로 봤을때 ( 1byte = 8bit )


32비트 ( 0 ~ 31 )를 전부 다 사용하고 싶을때는 EAX를,


16비트 ( 0 ~ 15 )만 사용하고 싶을때는 AX를,


AX는 다시 상위 8비트 AH하위 8비트 AL로 나뉘어집니다. 


이해 되시죠 ?


자, 이제 8개를 4개씩 나누어 알아보려고 합니다. 

레지스터 이름 앞에 붙은 E ( Extended )는 예전 16비트 시절부터 존재하던 레지스터들의 크기를 확장시켰다는 뜻입니다.


아래 4개의 레지스터들은 주로 산술연산 ( ADD, SUB, XOR, OR 등 ) 명령어에서 상수나 변수 값의 저장 용도로 많이 사용됩니다.


EAX ( Accumulator Register ) : 산술, 논리 연산을 할때 사용되며 함수의 리턴 값을 저장.

EBX ( Base Register ) : 메모리 주소를 저장.

ECX ( Count Register  ) : 우리가 흔히 아는 반복문에서 카운트로 사용.

EDX ( Data register ) : 보통 EAX와 함께 연동해서 사용하며, 큰수의 복잡한 연산 과 부호 확장 명령에 사용.


아래 4개의 레지스터들은 주로 메모리 주소를 저장하는 용도로 많이 사용됩니다.


EBP ( Base Pointer Register ) : Stack의 시작 주소 저장.

ESP ( Stack Pointer Register ) : Stack의 끝지점 주소가 저장. push pop 에 따라 4byte씩 값이 변한다.

ESI ( Source Index Register ) : 데이터를 조작하거나 복사할 때 데이터의 주소 저장.

EDI ( Destination Index Register ) : 데이터를 복사할 때 목적지의 주소 저장.


낯설은 용어들이 많이나와 혼란스럽지만 자주 봐서 눈에 익혀야 할 것 같습니다.


오늘은 여기까지 입니다 감사합니다 !




참고서적 이승원 「리버싱 핵심원리」 인사이트(2018) p53~58

+ Recent posts