레지스터(Register)란 CPU 내부에 존재하는 다목적 저장 공간이다. 우리가
일반적으로 메모리라고 생각하는 RAM과는 조금 다르다. CPU가 RAM에 있는
데이터를 엑세스하기 위해서는 물리적으로 먼 길을 돌아가야 하지만
레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.
□ 범용 레지스터 : 범용 레지스터(General Purpose Registers)는 이름처럼 범용적으로 사용되는 레지스터들이다.
보통은 상수/주소 등을 저장할 때 주로 사용되며, 특정 어셈블리 명령어에서는 특정 레지스터를
조작 하기도 한다.
산술 연산 레지스터
▷ EAX (Accumulation)
- 산술연산에 사용되는 레지스터이다.
- 함수의 리턴값에 사용된다.
▷ EBX (Base Register)
- 간접 번지지정에 사용된다.
- 산수 / 변수를 지정한다.
▷ ECX (Counter Register)
- 반복문 명령어(LOOP)에서 반복 카운트(loop count)로 사용된다.
- 루프를 돌 때마다 ECX를 1씩 감소시킨다.
▷ EDX (Date Register)
- EAX의 보조 역할을 수행한다.
- 나눗셈의 경우 몫은 EAX에 나머지는 EDX에 저장된다.
인덱스 레지스터
▷ ESI (Source Index)
- 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장된다.
▷ EDI (Destination Index)
- 복사시에 소스 목적지의 주소가 저장된다.
포인터 레지스터
▷ ESP (Stack Pointer)
- 스택내에서 가장 최근에 저장된 데이터의 주소를 가르킨다.
▷ EBP (Base Pointer)
- 새로운 함수가 시작될때 EBP레지스터 값이 지금까지 사용했던 스택의 맨 위에 위치하며 스택이 시작된다.
□ 세그먼트 레지스터 : 세그먼트 레지스터(Segment Registar)는 현재 세그먼트라고 하는 메모리의 한 영역에
대한 주소를 지정해준다.
▷ CS Register
- 실행될 기계 명령어를 포함한다.
- CS Register는 코드 세그먼트의 주소를 의미한다.
▷ DS Register
- 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함한다.
- DS Register는 데이터 세그먼트의 주소를 포함한다.
▷ SS Register
- 프로그램이 임시로 저장할 필요가 있거나, 사용자의 '피호출' 서브루틴이 사용할 데이터와 주소를 포함한다.
□ 프로그램 상태와 컨트롤 레지스터 : Flag Register의 각 비트는 1 또는 0의 값을 가지는데, 이는 On/Off 혹은
True/False를 의미한다. 일부 비트는 시스템에서 직접 세팅하고, 일부
비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.
▷ Zero Flag
- 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅된다.
▷ Overflow Flag
- 부호 있는 수의 오버플로가 발생했을 때 1로 세팅된다.
- MSB(Most Significant Bit)가 변경되었을 때 1로 세팅된다.
▷ Carry Flag
- 부호 없는 수의 오버플로가 발생했을 때 1로 세팅된다.
아직 여기 있는 레지스터들을 모두 완벽하게 알고있지는 못하지만 앞으로 공부하다가
더 알게된 내용이나 모르는 내용이 생기면 공부를하고 내용을 추가할 예정이다.
부족한 부분이 있겠지만 앞으로 공부하며 보안할 것이다.
'Reversing' 카테고리의 다른 글
[정리] 어셈블리어 (0) | 2020.05.25 |
---|