iohyeon 2020. 9. 19. 13:45

: CPU 내부에 존재하여 고속으로 데이터를 처리할 수 있는 다목적 저장 공간

: Basic program execution register, Control registers, Memory management registers, Debug registers 등

I. Basic program execution registers

       : 일반 시스템 및 응용 프로그램 프로그래밍에 사용할 수 있는 기본 레지스터

        * 개념 정리의 편의성을 위해 본 게시물 및 이후의 게시물을 64-bit 레지스터를 기준으로 기술하였다.

Basic program execution registers from IA-32 manual

       i. General-Purpose Registers

             : 범용 레지스터, 상수 및 주소 등을 저장, 특정 어셈블리 명령어(MUL, DIV, LODS 등)에서는 특정 레지스터를 조작, 64bit(8byte), 8개

General-Purpose Registers

             > RAX(Accumulator for operands and results data) : Win32 API 함수 리턴 값

             > RBX(Pointer to data in the DS segment) : 메모리 주소

             > RCX(Counter for string and loop operations) : 반복문에서의 count(하나씩 감소)

             > RDX(I/O pointer) : 큰 수의 복잡한 연산, 부호 확장 명령

                  → 산술 연산(ADD, SUB, XOR, OR 등) 명령어에서의 상수·변수 저장

 

             > RBP(Pointer to data on the stack (in the SS segment)) : base pointer, 스택의 시작 주소, 함수가 호출되었을 때의 ESP

                   Stack Frame 기법 : 함수 리턴 직전에 ESP에 반환하여 스택이 깨지지 않도록 함

 

             > RSI(source pointer for string operations) : source index, 데이터 조작 및 복사 시 저장할 데이터 주소

             > RDI(destination pointer for string operations) : destination index, 데이터 복사 시 목적지 주소

                  → 특정 명령어들(LODS, STOS, REP MOVS 등)과 함께 메모리 복사에 사용

 

             > RSP(Stack pointer (in the SS segment)) : stack pointer, 스택의 가장 위쪽 주소, 특정 명령어들(PUSH, POP, CALL, RET)이 조작

                                                                       ! 다른 용도로 사용하지 x

                  → 메모리 주소 저장

 

             > R8, R9 : RCX, RDX 다음으로 Windows 64bit에서 함수 호출 시 필요한 인자를 순차적으로 저장 이후 받는 인자는 스택에 저장

             > R10~R15 : 범용적 사용

              16bit → 32bit : E-, 32bit → 64bit : R-

 

       ii. Segment Register

             : SDT(Segment Descriptor Table)의 index, 16bits(2bytes)

             > CS : Code Segment

             > SS : Stack Segment

             > DS : Data Segment

             > ES, GS : Extra (Data) Segment

             > FS : Extra (Data) Segment, SEH·TEB·PEB 등의 주소 계산 시 사용

 

             : (보호 모드) 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 Paging 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용              Paging 기법 : 프로세스를 일정한 크기인 Page로 잘라 메모리에 적재하는 방식                                자세한 내용은 jhnyang.tistory.com/290 참고 (이후 해당 분야 따로 공부하여 정리 및 포스팅할 예정)

Segment Memory Model from IA-32 Memory Management Model

                    : 각 Segment Register가 가리키는 Segment Descriptor와 가상 메모리가 조합되어 Linear Address 생성 후 (Paging 기법을 거쳐) Physical Address로 변환

 

        iii. Program Status and Control Register

            > RFLAGS : Flag Register, 상태 레지스터, 64bits(8bytes)

                           : 1(On/True), 0(Off/False) 둘 중 하나의 값 → 상태 및 조건, 시스템이나 프로그램에서 사용된 명령의 수행 결과에 따라 세팅

RFLAGS Register

             > Zero Flag(ZF) : 연산 명령 후 결과 값이 0일 때 1(True)

             > Overflow Flag(OF) : signed integer(부호 있는 수)의 overflow(표시할 수 있는 범위 초과)가 일어나거나 MSB(Most Significant Bit)가 변경되었을 때 1(True)

             > Carry Flag(CF) : unsigned integer(부호 없는 수)의 overflow(자리 올림) 발생 시 1(True)

             > Sign Flag(SF) : MSB(최상위 비트)가 0(False)(양수)일 때 1(True), 1(True)(음수)일 때 0(False), signed/unsigned 구분

 

        iv. Instruction Pointer

             > RIP : instruction pointer, CPU가 처리할 명령어의 주소, 64bits(8bytes), 저장된 명령어 하나 처리 후 해당 명령어 길이만큼 길이 연장하여 계속하여 처리

                      : 직접 값 변경 불가 특정 명령어(JMP,Jcc,CALL,RET) 사용하거나 interrupt, exception 발생으로 변경