ASM 관련 내용 정리
Reverse Engineering 에서 따로 정리해서 틈틈히 보기 위해서 책의 내용을 정리한 내용이다
CPU 레지스터?
CPU 라는놈이 하는 일...
CPU(Central Processing Unit)는 메모리로부터 명령어를 가져와서(fetch) 어떤 명령어인지 해석하고(decode) 실행하는 (execute)동작을 한다.
레지스터?
CPU내부에 존재하는 작은 고속의 메모리라고 할 수 있다.
범용 , 세그먼트 , 상태플래그 , 명령포인터 레지스터등이 있다.
1. 범용 레지스터
EAX (Extended Accumulator Registrer)
곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로도 사용된다.
EBX (Extended Base Register)
ESI 나 EDI 와 결합ㅁ하여 인덱스에 사용된다.
ECX (Extended Counter Register)
반복 명령어 사용시 반복 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복작업을 수행하게 된다.
EDX (Extended Data Register)
EAX와 같이 쓰이며 부호 확장 명령등에 쓰인다.
ESI (Extended Source Index)
데이터 복사나 조작시 Source Data 의 주소가 저장된다 ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.
EDI (Extended Destination Index)
복사 작업시 Destination 의 주소가 저장된다 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다
ESP (Extended Stack Pointer)
하나의 스택 프레임의 끝 지점 주소가 저장된다. PUSH , POP 명령어에 따라서 ESP 의 값이 4byte 씩 변한다.
EBP (Extended Base Pointer)
하나의 스택 프레임의 시작지점 주소가 저장된다. 현재 사용되는 스택프레임이 소멸되지않는 동안 EBP 의 값은 변하지 않는다. 현재의 스택프레임이 소멸되면 이전에 사용되던 스택프레임을 가리키게 된다.
2. 명령 포인터 레지스터
EIP (Extended Instruction Pointer)
다음에 실행해야 할 명령어가 존재하는 메모리 주소가 저장된다. 현재 명령어를 실행완료한 후에 EIP 레지스터에 저장되어 있는 주소에 위치한 명령어를 실행하게 된다. 실행전 EIP레지스터에는 다음 실행해야 할 명령어가 존재하는 주소의 값이 저장된다.
3. 세그먼트 레지스터
CS (Code Segment)
실행 가능한 명령어가 존재하는 세그먼트의 오프셋이 저장된다.
DS (Data Segment)
프로그램에서 사용되는 데이터가 존재하는 세그먼트의 오프셋이 저장된다.
SS (Stack Segment)
스택이 존재하는 세그먼트의 오프셋이 저장된다.
3. 플래그 레지스터
CF (Carry Flag)
부호없는 연산 결과가 용량보다 클 때 세트(1) 된다.
ZF (Zero Flag)
연산 결과가 0 일때 세트(1) 된다. 연산결과가 0 이 아닐때 해제(0)된다.
OF(Overflow Flag)
부호 있는 연산결과가 용량보다 클 때 세트(1) 된다.