본문 바로가기

네이버 블로그 글 이전

IA-32 Register 기본

Basic Program Execution registers

1)범용 레지스터

범용 레지스터들의 크기는 32비트이며 보통은 상수/주소등을 저장할 때 주로 사용된다.

특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 한다.

EAX : 주소 산술연산(ADD,SUB,XOR,OR 등) 명령어에서 상수/변수 값의 저장 용도로 많이 사용된다. 함수의 반환값을 저장한다.

EBX : ESI나 EDI와 결합해 인덱스에 사용된다.

ECX: 반복 명령어를 사용할 때 반복 카운터를 저장한다.

EDX: EAX와 같이 사용되며 부호 확장 명령 등에 활용된다.

밑의 4개는 주로 메모리 주소를 저장하는 포인터로 사용된다.

EBP: 하나의 스택 프레임의 시작 주소가 저장된다. 현대 사용되는 스택 프레임이 살아있는 동안 EBP의 값은 변하지 않는다. 현재 사용한 스택 프레임이 사라지면 이전에 사용되던 스택 프레임을 가리키게 된다.

=>함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다. (stack frame 기법)

ESI : 데이터를 복사하거나 조작할 때 소스 데이터 주소가 된다. ESI 레지스터가 가리키는 주소에 있는 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.

EDI: 복사 작업을 할 때 목적지 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.

ESP: 하나의 스택 프레임의 끝 지점 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP의 값이 4바이트씩 변한다.

2)세그먼트 레지스터

CS: Code Segment

SS: Stack Segment

DS: Data Segment

ES: Extra(Data) Segment

FS: Data Segment

GS:Data Segment

3)프로그램 상태와 컨트롤 레지스터

EFLAGS: Flag Register (4바이트)

각 비트는 1 또는 0의 값을 가지는데 이는 On/Off 혹은 True/False 를 의미한다.

일부 비트는 시스템에서 직접 세팅하고, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅됩니다.

Zero Flag(ZF): 연산 명령 후에 결과값이 0이되면 ZF가 1(True)로 세팅된다.

Overflow Flag(OF) : 오버플로가 발생했을 때 1로 세팅된다. 그리고 MSB(Most Significant Bit)가 변경되었을 때 1로 세팅된다.

Carry Flag(CF): 부호 없는 수(unsigned integer)의 오버플로가 발생했을 때 1로 세팅된다.

4)Instruction Pointer

EIP : Instruction Pointer

CPU가 처리할 명령어의 주소를 나타내는 레지스터로 크기는 32비트이다. CPU는 EIP에 저장된 메모리 주소의 명령어(instruction)를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다. 범용레지스터들과 다르게 EIP는 그 값을 직접 변경할 수 없도록 되어있어서 다른 명령어를 통하여 간접적으로 변경해야한다. EIP를 변경하고 싶을 때 JMP, jcc, CALL, RET를 사용하거나 인터럽트 , 예외를 발생시켜야한다.

'네이버 블로그 글 이전' 카테고리의 다른 글

OllyDbg 디버거 명령어  (0) 2022.02.06
바이트 오더링  (0) 2022.02.06
스택  (0) 2022.02.06