본문 바로가기
악성코드 분석/ASSEMBLY

레지스터

by ITPro 2010. 11. 27.

레지스터는 CPU 바로 안에 있는 고속 저장 장소이며 일반 메모리보다 훨씬 빠른 속도를 접근되도록 설계되었다. 레지스터는 8개의 범용 레지스터와 6개의 세그먼트 레지스터, 프로세서 상태 플래그 레지스터와 명령어 포인터가 있다.


1.범용 레지스터

범용 레지스터는 계산과 데이터 전송에 주로 사용된다. 각 레지스터는 하나의 32비트 값이나 두 개의 16비트 값으로 다룰 수 있다. 어떤 레지스터의 일부분은 8비트 값으로 다룰 수 있다. 예를 들어 32비트 EAX레지스터의 16비트 하위 반은 AX라는 이름을 갖고 AX 레지스터의 8비트 상위 반은 AH, 하위 반은 AL이라는 이름을 갖는다.

32비트

16비트

8비트(상)

8비트(하)

EAX

AX

AH

AL

EBX

BX

BH

BL

ECX

CX

CH

CL

EDX

DX

DH

DL

32비트

16비트

ESI

SI

EDI

DI

EBP

BP

ESP

SP

16비트 레지스터는 실제 주소 모드 프로그램을 작성할 때에 보통 사용된다.

각 레지스터는 혼용해도 되지만 각 레지스터의 독특한 특성이 있으므로 필요한 기능에 맞는 레지스터를 사용하면 효율적으로 프로그래밍을 할 수 있다.


레지스터 종류

기능

EAX

(accumulator : 누산기)

EAX레지스터는 산술 연산시 누산 과정이 필요할 때 매우 효율적으로 사용될 수 있는 레지스터로 누산 과정에 대한 효율성이 다른 레지스터보다 좋다.

EAX는 곱셈과 나눗셈 명령어에서 자동적으로 사용된다.

EBX

(base : 베이스)

EBX레지스터는 프로세서나 변수의 주소를 저장하는 데 효율적이다. 물론 인덱스 레지스터인 BP, SI, DI레지스터도 이와 같은 기능을 수행할 수 있다. BX레지스터는 데이터 이동 명령어의 피연산자로 사용될 수도 있다.

ECX

(counter : 카운터)

ECX레지스터는 명령어들이 단순 반복되거나 LOOP 명령어에 의해 반복될 때 카운터 역할을 한다. 명령어들이 자동 반복될 때마다 ECX 레지스터의 값이 1씩 감소한다.

EDX

(data : 데이터)

EDX레지스터는 곱하기와 나누기 연산시 중요한 역할을 한다.  곱하기에서는 곱셈 결과의 상위 16비트들이 DX에 보관한다.



2.세그먼트 레지스터

실제 모드에서 세그먼트 레지스터는 세그먼트라고 하는 미리 할당된 메모리 영역의 시작 주소를 가리킨다. 보호 모드에서 세그먼트 레지스터는 세그먼트 서술자 테이블에 대한 포인터를 갖는다.

CPU는 4개의 메모리 영역들의 시작 위치를 보관하기 위해 4개의 세그먼트 레지스터를 가지는데 이 영역들의 프로그램 명령어들과 데이터, 그리고 스택에 사용된다. 메모리의 모든 위치는 세그먼트 레지스터가 가리키는 메모리 위치를 기준으로 계산되며 다음 4가지 세그먼트 레지스터가 있다.

레지스터 종류

기능

CS(code segment)

프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작위치를 보관한다.

DS(data segment)

데이터가 내장되는 메모리 영역의 시작 위치를 보관한다.

SS(stack segment)

스택으로 사용되는 메모리 영역의 시작 위치를 보관한다.

ES(extra segment)

변수들을 위한 추가 메모리 영역의 시작 위치를 보관한다.


3.인덱스 레지스터

데이터와 명령어들의 오프셋 주소를 갖는다. 오프셋 주소란 세그먼트 주소에서 떨어진 거리를 말하며 인덱스 레지스터는 문자열, 배열, 그리고 다수의 데이터를 포함하는 데이터 구조체(data structure)의 처리를 빠르게 한다.

레지스터 종류

기능

EBP(base pointer)

고급언어에서 스택에 있는 함수 매개 변소와 지역 변수를 참조하기 위해서 사용된다. EBP는 고급 수준의 프로그래밍이 아니라면 일반적인 계산과 데이터 전송에 사용되지 않아야 한다.

세그먼트 레지스터인 SP와 같이 SS레지스터로부터의 오프셋 주소를 갖는다. 서브루틴을 호출할 때 서브루틴에 변수들을 넘겨주는데, 서브루틴은 흔히 BP레지스터를 사용하여 변수들을 찾아낸다.

ESP(stack pointer)

스택 최상부의 오프셋 주소를 갖는다. SP와 SS레지스터와 결합하여 스택 최상부의 위치 주소가 만들어진다.

ESP는 보통의 계산과 데이터 전송에는 거의 사용되지 않는다.

ESI(source index)

고속 메모리 전송 명령어에서 사용한다. 이 레지스터의 이름은 문자열 이동 명령어들에서 따온 것인데 이 명령어들에서 소스 문자열이 사용되며 SI레지스터가 이 문자열을 가리킨다.

EDI(destination index)

고속 메모리 전송 명령어에서 사용한다. 문자열 이동 명령어에서 목적지를 가리킨다.


4.상태 및 제어 레지스터

레지스터 종류

기능

IP(instruction pointer)

IP레지스터는 현제 코드 세그먼트 내의 다음 실행될 명령어의 오프셋 주소를 갖는다. IP와 CS레지스터가 결합하여 다음 실행될 명령어의 메모리 주소를 결정한다.

어떤 명령어는 EIP를 조작하여 프로그램을 새 위치로 분기하게 한다.


5.시스템 레지스터

IA-32 프로세서는 많은 중요한 시스템 레지스터를 갖는다. MS-Windows는 가장 높은 특권 레벨(레벨0)에서 수행되는 프로그램에 대해서만 접근을 허용한다.

레지스터 종류

기능

인터럽트 서술자 테이블 레지스터

(Interrupt Descriptor Table Register:IDTR)

인터럽트 서술자 테이블의 주소를 포함한다. 이 테이블은 인터럽트를 처리하는 방법을 제공한다.

전역 서술자 테이블 레지스터

(Global Descriptor Table Register:GDTR)

전역 서술자 테이블의 주소를 포함한다. 이 테이블은 TSS(task state segment)와 프로그램 지역 서술자 테이블에 대한 포인터를 포함한다.

지역 서술자 테이블 레지스터

(Local Descriptor Table

Register:LDTR)

현재 실행 중인 프로그램의 코드, 데이터, 스택에 대한 포인터를 포함한다.

태스크 레지스터

(Task Register)

현재 실행 중인 작업에 대한 TSS(task state segment)의 주소를 포함한다.

디버그 레지스터

(Debug Register)

프로그램을 디버깅할 때에 프로그램이 정지점을 설정하게 한다.

제어 레지스터

(Control Register)

CR0, CR2, CR3, CR4

작업 전환, 페이징, 캐시 메모리 활성화와 같은 시스템 수준의 동작을 제어하는 상태 플래그와 데이터 필드를 포함한다. (CR1은 사용되지 않는다.)

모델 특정 레지스터

(Model-Specific Register)

성능 모니터링과 기계 구조의 확인과 같은 운영체제의 시스템 작업에 사용된다. 이 레지스터의 용도는 IA-32 프로세서의 종류에 따라서 변한다.



반응형

'악성코드 분석 > ASSEMBLY' 카테고리의 다른 글

연산자  (0) 2010.11.27
기본 명령어  (0) 2010.11.27
자료형  (0) 2010.11.27
어셈블리어  (0) 2010.11.27
플래그  (0) 2010.11.27

바로가기