레지스터란? CPU의 내부의 기억 장소로, 자료를 바이트 단위 또는 워드 단위로 저장.


범용 레지스터

- 데이터들의 연산 및 전송, 번지 지정을 위한 포인터 및 인덱스 용도로 사용된다.


- 범용 레지스터 테이블

32

Bit

16

Bit

상위

8bit

하위

8bit

기능

EAX

AX

AH

AL

누산기( Accumulator, 중간 결과를 저장해 놓음 )레지스터라 불리며, 곱셈이나 나눗셈 연산에 중요하게 사용.

정수형 함수의 리턴 값이 저장.

EBX

BX

BH

BL

베이스 레지스터라 불리며 메모리 주소 지정시에 사용.

ECX

CX

CH

CL

계수기( counter )레지스터라 불리며, Loop 등의 반복 명령에 사용.

EDX

DX

DH

DL

데이터( Data )레지스터라 불리며, 곱셈, 나눗셈에서 EAX와 함께 쓰이며 부호 확장 명령 등에 사용.

ESI

SI



다량의 메모리를 옮기거나 비교할 때 명령에서 소스( Source )의 주소가 저장.

EDI

DI



다량의 메모리를 옮기거나 비교할 때 목적지( Target )의 주소를 저장.

ESP

SP



스택 포인터로 함수를 호출할 때, 함수로부터 반환될 때, 로컬 변수를 위한 공간을 스택에 만들 때 그리고 스택을 정리할 때 암시적으로 변경.

EBP

BP



베이스/프레임 포인터로 프로시져에 대한 스택 프레임을 보관.

그리고 ESP를 대신해 스택에 저장된 함수의 파라미터나 지역 변수의 주소를 가리키는 용도로 사용.


- 범용 레지스터 레이아웃

비트

EAX

0 ~ 31

AX

0 ~ 15

AL

0 ~ 7

AH

8 ~ 15

1.AX( Accumulator ) : 데이터 전송 및 연산 후의 결과 값을 잠시 저장하는 곳AX레지스터를 사용하면 다른 레지스터를 사용한 경우보다 명령의 바이트 수가 짧게 되거나 실행 시간이 짧게 되는 정미 있다. 또한 곱셈이나 나눗셈 등과 같은 연산에서는 반드시 AX나 AL레지스터를 사용해야 하는 경우도 있다.


2.BX( Base Register ) : 메모리에 저장되어 있는 데이터의 주소를 저장한다든지, 전송 및 연산에 사용된다.


3.CX( Count Register ) : 반복문이나 문자 스트링 등과 같은 명령어를 수행할 때 반복 횟수 등을 저장하는 카운터로 사용되기도 하고, 또한 전송 및 연산에 사용된다.


4.DX( Data Register ) AX레지스터와 함께 곱셈이나 나눗셈 등 일부 명령에서는 필수적으로 사용되기도 하고,또한 기타 연산 및 전송에 사용된다.


포인터와 인덱스 레지스터

-포인터SP, BP )와 인덱스SI, DI )레지스터들은 비록 범용 레지스터 범주에 속하지만 이들은 아래와 같이 주로 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터로 사용된다.


1.SP( Stack Point ) : 스택 내에서 가장 최근에 저장된 데이터의 주소( TOP )를 가리킨다.


2.BP( Base Point ) SP대신 스택 내에서 데이터를 액세스 할 때 사용한다. 뿐만 아니라 다른 영역의 데이터를 간접적으로 지정하거나 전송 및 연산에도 사용 가능하다. 그리고 스택 상에서 프로시져를 처리할 때 SP대신 BP를 이용하여 프로시져 인수들을 액세스하여 처리하면 보다 효과적으로 프로시져를 관리할 수 있다.


3.SI( Source Index ) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 메모리로부터 데이터를 전송하기 위한 출발지 주소 지정에 사용된다. 이때 DS세그먼트를 참조하여 20비트의 물리 주소를 생성한다DI : SI ). 그리고 일반적인 전송이나 연산에도 사용된다.


4.DI( Destination Index ) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 레지스터나 메모리로부터 메모리로 데이터를 전송하거나 비교할 때 목적지 주소를 지정할 때 사용한다. 이때 세그먼트 레지스터 ES를 참조하여 20비트의 물리 주소를 생성한다ES : DI ). 그리고 이 레지스터는 일반적인 연산에도 사용된다.



상태 레지스터

32

Bit

16

Bit

기능

EIP

( 명령 포인터 )

IP

EIP는 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로그램의 실행 순서가 변경되는 제어 문이 실행될 때 자동으로 변경된다. 그래서 직접 접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손 댈 일이 없는 레지스터이다.

EFLAGS( EFL )

FLAGS

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


명령어 레지스터 : IP( Instruction Pointer )

-IP레지스터는 다음에 실행할 명령어가 저장되어 있는 주소를 가지고 있는 레지스터로 명령어를 실행할 때마다 프로세서는 IP값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 가지고 있다.

-IP는 사용자가 값을 변경할 수 없다.


플래그 레지스터( Flag Register )

-CF( Carry Flag 비트 : 0 ) : 만약 산술 연산이 결과의 most significant비트로부터 캐리 또는 빌림이 필요한 경우 1로 설정한다. 또한 부호 없는 정수형 산술 연산에서 Overflow가 발생한 경우에도 1로 설정한다. 그리고 다배정도 연산에 있어서도 사용된다.


-PF( Parity Flag 비트 : 2 ) : 만약 결과의 least significant 바이트에서 1의 개수가 짝수 개인 경우 1로 설정하고 홀수 개인 경우 0으로 한다.

 

-AF( Auxilary Carry 비트 : 4 ) : 만약 Binary-Coded Decimal( BCD )연산이 캐리( Carray ) 또는 빌림( Borrow )을 필요로 하는 경우 1로 설정한다.


-ZF( Zero Flag 비트 : 6 ) : 만약 명령 결과가 0이면 1로 설정한다. 이 플래그는 비교 명령에서 매우 중요하다.


-SF( Sign Flag 비트 : 7 ) : 명령 결과의 most significant 비트를 반영한다. 양수 값은 0으로 설정하고 음수 값은 1로 설정한다.

 

-OF( Overflow Flag 비트 11 ) : 만약 명령을 실행하고 난 후 정수 Overflow 혹은 Underflow가 발생한 경우에 1로 설정된다.


제어 플레그 레지스터

-DF( Direction Flag 비트 10 ) : 이 비트는 문자열 처리 방향을 정하는 방향 플래그이다. 문자열을 증가하는 레지스터는 DF가 0이면 선 증가( 하위 주소 -> 상위 주소 ), DF가 1이면 선 감소( 상위 주소 -> 하위 주소 )로 지정된다. 이 플래그는 STD( D = 1 ), CLD( D = 0 )명령으로 제어할 수 있다. 그리고 C/C++코드가 사용하는 방법.


-IF( Interrupt enable Flag ) : 외부 인터럽트 발생의 허용을 제어하는 인터럽트 허용 플래그다IF가 1이면 외부 인터럽트가 허용되고, 0이면 금지된다. 이 플래그는 프로세서 내부에서 발생하는 인터럽트에 대해서는 영향이 전혀 없다. 디버그 모드에선 항상 1로 설정.


-TF( Trap enable Flag ) : 이 플래그가 1로 셋팅되면 프로세서는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생하고 인터럽트 처리 루틴으로 들어간다.



- VS2005 레지스터 창 플래그 값

레지스터

플래그

의미

Intel

설명서

니모닉

( mnemonics )

설명

OV

Overflow

Flag

OF

만약 명령을 실행하고 난 후 정수 오버플로우나 언더플로우가 발생했다면 1로 설정한다.

UP

Direction

Flag

DF

만약 문자열 명령이 상위 주소에서 하위 주소로 처리된다면 1로 설정. 0은 문자열 명령이 하위 주소에서부터 상위 주소로 처리된다는 것을 나타내며C/C++ 코드가 사용하는 방법.

EI

인터럽트

활성화

Flag

IF

만약 인터럽트가 활성화된다면 1로 설정한다. 이 플래그는 만약 인터럽트가 비활성화되어 있는 경우 키보드를 입력하거나 화면이 갱신되는 것을 확인할 수 없기 때문에 사용자 모드 디버거에서는 항상 1로 설정될 것이다.

PL

부호

Flag

SF

명령 결과의 most significant 비트를 반영한다.양수 값은 0으로 하고, 음수 값은 1로 한다.

ZR

Zero

Flag

ZF

만약 명령 결과가 0이면 1로 설정한다. 이 플래그는 비교 명령에서 매우 중요하다.

AC

보조

캐리

Flag

PF

만약 결과의 Least significant 바이트에서 1의 개수가 짝수 개인 경우 1로 설정한다.

PE

패러티

Flag

PF

만약 결과의 Least significant 바이트에서 1의 개수가 짝수 개인 경우 1로 설정한다.

CY

캐리

Flag

CF

만약 산술 연산이 결과의 most significant 비트로부터 캐리 또는 빌림이 필요한 경우 1로 설정한다. 또한 부호 없는 정수형 산술 연산에서 오버플로우가 발생한 경우에도 1로 설정한다.




세그먼트 레지스터


16 Bit

기능

ES

보조 세그먼트 레지스터다. 두 곳 이상의 데이터 저장영역을 가리켜야 할 때 DS와 함께 사용된다. 하지만 32비트 프로그램에서는 DS와 ES가 같은 영역을 가리키고 있기 때문에 굳이 신경 쓰지 않아도 된다.

CS

코드 세그먼트를 가리키는 레지스터

SS

스택 세그먼트를 가리키는 레지스터

DS

데이터 세그먼트를 가리키는 레지스터

FS, GS

보조 세그먼트 레지스터FSGS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면 없듯이 여겨도 된다.


1.CS( Code Segment ) : 실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터로 다음에 수행될 명령어의 물리 주소는 CSx10H와 오프셋 레지스터인 IP와 합해서 결정된다.


2.DS( Data Segment ) : 명령어가 수행하는데 필요한 데이터들이 들어있는 데이터 세그먼트의 시작 주소를 가지고 있는 레지스터로 메모리 직접 주소 지정 및 BP레지스터 이외의 다른 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다. 또한 문자열 처리 명령에서 SI레지스터와 결합해서 출발지의 물리주소를 생성하기도 한다.


3.SS( Stack Segment ) : 스택 영역을 나타내는 스택 세그먼트의 시작 주소를 가지고 있는 레지스터로서 유효 주소는 SP와 SSx10H의 합으로 물리 주소를 결정한다. 또한 BP레지스터를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해져서 물리 주소를 생성한다.


4.ES( Extra Segment ) : 일반적으로 문자열 처리 명령어에 대해 사용할 때 추가로 사용하는 여분의 세그먼트인 익스트라 세그먼트의 시작 주소를 가지고 있는 세그먼트로 문자열 처리 명령어가 수행되면 목적지의 위치는DI와 Exx10H로 결정되고 출발지의 위치는 SI와 DXx10H로 물리 주소가 결정된다.




호출 규칙

호출 규칙

인자 파싱

스택 관리

이름 데코레이션

알아두기

__cdecl

오른쪽에서 왼쪽으로 전달된다

호출하는 쪽에서 스택에 있는 매개변수를 제거한다.

이 호출 규칙만 가변 매개 변수를 허용한다.

Foo처럼 함수 이름 앞에 밑줄(_)이 추가된다.

C와 C++함수의 기본 호출 규칙이다.

__stdcall

오른쪽에서 왼쪽으로 전달된다.

호출되는 쪽에서 스택에 있는 매개 변수를 제거한다.

함수 이름 앞에 밑줄이 추가되고 함수 이름 끝에 @이 추가되고 @뒤에 다시 매개변수의 전체 바이트가 10진수로 추가된다. 예를 들면,_Foo@12와 같다.

거의 모든 시스템 함수에서 사용되는 호출 규칙이다. Visual Basic 내부 함수에 대해서도 기본 호출 규칙이다.

_fastcall

처음 두DWORD 매개 변수들은 ECX와 EDX에 전달된다. 나머지는 오른쪽에서 왼쪽으로 전달된다.

호출되는 쪽에서 스택에 있는 매개 변수를 제거한다.

이름 앞에 @가 추가되고, 함수 이름 끝에 @이 추가되고 @뒤에 다시 매개변수의 전체 바이트가 10진수로 추가된다. 예를 들면,

@Foo@12와 같다.

Intel CPU에만 적용된다. 이 호출 규칙은 Borland Delphi 컴파일러의 기본 호출 규칙이다.

this

오른쪽에서 왼쪽으로 된다. this 매개 변수가 ECX레지스터에 전달된다.

호출하는 쪽에서 스택에 있는 매개 변수를 제거한다.

없음

만약 표준 호출을 지정하지 않는다면, C++ 클래스 매서드에서 자동으로 사용된다. COM 매서드는 표준 호출로 선언된다

naked

오른쪽에서 왼쪽으로 전달된다.

호출하는 쪽에서 스택에 있는 매개 변수를 제거한다.

없음

사용자 지정 프롤로그와 에필로그가 필요할 때 사용된다.