Post

Computer Science - Registers

System Hacking을 공부하기 앞서서 Register에 대해 공부하는 내용

x86-64 Architecture : Register

레지스터는 CPU가 데이터를 빠르게 읽고 쓸 때 이용하는 저장소다. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장 및 참조하는 등 다양한 용도로 사용된다.

x86-64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register) 가 있다.

범용 레지스터

범용 레지스터는 주용도는 있지만, 그 외의 다양한 용도로 사용될 수 있다. x86-64에서는 각각의 범용 레지스터가 8바이트를 저장할 수 있다. 표는 자주 사용되는 레지스터들에 대한 설명이다.

NameUsage
rax (accumulator register)함수의 반환 값
rbx (base register)x64에서는 주된 용도 없음
rcx (counter register)반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx (data register)x64에서는 주된 용도 없음
rsi (source index)데이터를 옮길 때 원본을 가리키는 포인터
rdi (destination index)데이터를 옮길 때 목적지를 가리키는 포인터
rsp (stack pointer)사용중인 스택의 위치를 가리키는 포인터
rbp (stack base pointer)스택의 바닥을 가리키는 포인터

Commonly Used Registers and their Usage

이 외에도 r8, r9, …, r15까지의 범용 레지스터가 더 존재한다.

세그먼트 레지스터

x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재한다. 각 레지스터의 크기는 2바이트이다.

이중 cs, ss, ds 레지스터는 코드 영역, 데이터, 스택 메모리 영역을 가리킬 때 사용된다.

명령어 포인터 레지스터

x64 아키텍처에는 rip 명령어 포인터 레지스터가 존재한다. 이 레지스터는 CPU가 어느 코드를 실행할지 가리키며, 크기는 8바이트이다.

플레그 레지스터

프로세스의 현재 상태를 저장하는 레지스터. x64 아키텍처에는 RFLAGS라 불리는 64비트 레지스터가 존재한다. 플레그 레지스터를 구성하는 비트들로 CPU의 현재 상태를 표현한다.

최대 64개의 플래그를 사용할 수 있지만, 실제로는 20여개의 비트만 사용한다.

NameUsage
CF(Carry Flag)부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정됨
ZF(Zero Flag)연산의 결과가 0일 경우 설정됨
SF(Sign Flag)연산의 결과가 음수일 경우 설정됨
OF(Overflow Flag)부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정됨

레지스터 호환

img Register extension

This post is licensed under CC BY 4.0 by the author.