진수 변환, CPU 레지스터
1. 진수 변환
1) 2진수 : 2진수가 영어로 binary이기 때문에 b를 뒤에 붙여서 십진수의 10은 1010b로 표시하는 경우가 있다.
2) 16진수 : 16진수는 hexadecimal이기 때문에 h를 뒤에 붙이고 구분을 더 편하게 하기 위해 앞에는 0를 붙여서 십진수의 10은 0Ah가 된다.
2. CPU 레지스터
1) 범용 레지스터
* 범용 레지스터 : 계산 결과의 임시 저장. 산술 및 논리 연산 따위와 같이 여러 목적으로 사 용.
- EAX(Extended Accumulator Register) : 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로도 사용된다.
- EBX(Extended Base Rergister) : 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 레지스터에 저장되어 있는 주소에 위치한 명령어를 실행한다.
3) 세그먼트 레지스터
*세그먼트 : 구분 되는 기억장치의 연속된 한 영역
- CS(Code Segment) : 실행 가능한 명령어가 존재하는 세그먼트의 오프셋이 저장된다.
- DS(Data Segment) : 프로그램에서 사용되는 데이터가 존재하는 세그먼트의 오프셋이 저장된다.
- SS(Stack Segment) : 스택이 존재하는 세그먼트의 오프셋이 저장된다.
4) 플래그 레지스터
O 스테이터스 플래그
- CF(Carry Flag) : 부호 없는 연산 결과가 용량보다 클 때 세트(1)된다.
- ZF(Zero Flag) : 연산 결과가 0일 때 세트(1)된다. 연산 결과가 0이 아닐 때 해제(0)된다.
- OF(Overflow Flag) : 부호 있는 연산 결과가 용량보다 클 때 세트(1)된다.
- SF(Sign Flag) : 연산 결과 음수가 되면 세트(1)이 되고 양수가 되면 해제(0)된다.
- PF : 연산 결과 1로 된 비트의 수가 짝수일 때 세트(1)되고 홀수일 때 해제(0)된다.
- AF : 8(16)비트 연산에서 하위 4(8)비트로부터 상위 4(8)비트로 자리올림 혹은 빌림이 발생한 경우에 세트(1)되고 이외에 해제(0)된다.
O 컨트롤 플래그
- DF(Direction Flag) : 스트링 조작을 할 때 이 플래그가 0이면 번지를 나타내는 레지스터값이 자동적으로 증가하고 1이면 레지스터값은 자동적으로 감소한다.
- IF(Interrupt Flag) : 이 플래그가 0일 때 INTR 단자로부터의 외부 인터럽트 요구는 무시되고, 1일 때에는 외부 인터럽트 요구를 받아들일 수 있게 된다.
- TF : 이 플래그가 0일 때 CPU는 보통대로 명령을 실행한다. 1일 때에 CPU는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트를 발생하고, 인터럽트 처리 루틴으로 들어간다.(단, 이 루틴의 실행중에는 트랩 플래그는 0으로 된다.)