003 Register
: CPU 내부에 존재하여 고속으로 데이터를 처리할 수 있는 다목적 저장 공간
: Basic program execution register, Control registers, Memory management registers, Debug registers 등
I. Basic program execution registers
: 일반 시스템 및 응용 프로그램 프로그래밍에 사용할 수 있는 기본 레지스터
* 개념 정리의 편의성을 위해 본 게시물 및 이후의 게시물을 64-bit 레지스터를 기준으로 기술하였다.
i. General-Purpose Registers
: 범용 레지스터, 상수 및 주소 등을 저장, 특정 어셈블리 명령어(MUL, DIV, LODS 등)에서는 특정 레지스터를 조작, 64bit(8byte), 8개
> 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 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) 둘 중 하나의 값 → 상태 및 조건, 시스템이나 프로그램에서 사용된 명령의 수행 결과에 따라 세팅
> 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 발생으로 변경