* EFLAGS (Extended FLAGS) 레지스터의 구조
; 목적에따라 상태 플래그, 제어 플래그, 시스템 플래그로 나눌 수 있다. 플래그의 경우 1을 지정하는 것을 세트(set)라고하고 0을 지정하는 것을 클리어(clear) 혹은 리셋(reset)이라고 한다. 보통 1일 경우 Enable, 0일 경우 disalble을 가지지만 간혹 0이 enable, 1이 disable값을 가지는 경우가 있다.
*상태 플래그 (Status Flag)
- Carry Flag (CF : bit 0)
; 산술연산 수행 결과가 자리 올림이나 자리 내림이 발생 할때 set(1)된다. 상태 플래그 중 유일하게 어셈블리어 STC, CLC, CMC instruction을 이용하여 플래스 값을 직접 수정 가능한 플래그이다.
- Parity Flag (PF : bit 2)
; 산술연산 수행결과 하위 1Byte중 1bit가 짝수면 set(1), 그렇지 않으면 clear(0)된다.
- Adjust Flag (AF : bit 4)
; 산술연산 수행결과 bit3자리에 자리 올림이나 자리 내림이 발생할 때 set(1)된다. 10진(BCD) 연산에 사용되는 플래그이다.
- Zero Flag (ZF : bit 6)
; 산술 연산 결과가 0이면 세트되고 그렇지 않으면 리셋된다. 값을 비교할 때 내부적으로 두 값을 서로 빼서 같은 값이면 0이 되므로 같은 값을 구하는 수식, 루프에서 카운트값을 점차적으로 빼서 0이되면 루프를 빠져 나오게하는등 여러 방식으로 응용되는 플래그이다.
- Sign Flag (SF : bit 7)
; 최상위 bit(MSB)의 결과와 같은 결과로 세트된다. Signed Interger로 사용되는 경우 이 플래그가 0이면 양수, 1이면 음수를 나타낸다.
<ex> 간단하게 8비트로 가정하면 부호있는 정수가 0000 0001이면 MSB가 0이므로 SF도 0(양수)이 되기때문에 1이지만, 1000 0001일 경우 MSB가 1이므로 SF는 1(음수)가 되어 2의 보수 값을 취해보면 0111 1111이 되므로 -255 임을 알수 있다.
- Overflow Flag (OF : bit 11)
; 연산의 결과 값이 Sign-bit(MSB)를 제외한 최대 허용 정수값보다 크거나 최소 정수보다 작으면 세트(1)된다.
* 제어 플래그 (Control Flag)
- Direction Flag (DF : bit 10)
; 문자열을 처리하는 스트링 명령(MOVS, CMPS, SCAS, LODS, STOS)을 제어하는 플래그로 set(1)되어 있으면 높은 주소에서 낮은 주소로 처리하고, clear(0)되어 있으면 낮은 주소에서 높은 주소로 처리한다. 어셈블리어 STD로 set, CLD로 clear로 설정 가능하다.
* 시스템 플래그 (System Flag)
- Trap Flag (TF : bit 8)
; 디버깅 시 Single step mode를 활성화하였을 경우 set(1)된다. 명령 실행시 TF를 세트하여 한 명령씩 프로그램을 수행할 수 있는 것이다.
- Interrupt Flag (IF : bit 9)
; 프로세스로 부터 인터럽트가 발생하면 인터럽트 처리를 할 것인지 제어한다. set(1)되어 있으면 인터럽트 신호가 들어왔을 때 인터럽트를 처리하고, clear(0)되어 있으면 인터럽트 신호가 들어오더라도 반응하지 않는다. 외부 입력 장치인 키보드, 마우스 등도 인터럽트 신호를 건네 주기 때문에 운영체제가 인터럽트 신호를 받아 처리하는 것이다.
- Input/Output Priviliege Level (IOPL : bit 12, 13)
; 현재 실행되고 있는 프로그램이나 태스크의 I/O특권 레벨을 지시한다. 현재 실행 중인 프로그램이나 태스크가 I/O 어드레스에 접근하기 위해서는 CPL(Current Priviliege Level)이 I/O 특권 레벨보다 적거나 같아야 입출력 처리가 가능하다. 이 플래그는 CPL 0. 즉, 커널 권한을 가진 상태에서 어셈블리어 POPF/IRET 으로 수정 가능하다.
- Nested Task Flag (NT : bit 14)
; 인터럽트되거나 호출된 태스크의 연결을 관리한다. 이 플래그가 set(1)되어 있으면 현재 태스크가 다른 태스크에 호출되었음(중첩)을 나타낸다.
- Resume Flag (RF : bit 16)
; 프로세서의 디버그 예외에 대한 반응을 제어한다. DF가 set(1)되어 있으면 디버그 Fault를 무시하고 다음 명령어를 수행하게 된다.
- Virtual 8086 Flag (VF : bit 17)
; 가상 8086 모드로 전환시키는데 사용되는 보호모드 플래그로 이 플래그가 set(1)되면 가상 8086 모드가 활성화되어 있다는 것을 나타낸다.
- Alignment Check Flag (AC : bit 18)
; 메모리 참조시 정렬 기능을 활성화 한다.
- Virtual Interrupt Flag (VIF : bit 19)
; IF 플래그의 가상 이미지로 VIP 플래그와 같이 사용된다. 이 플래그와 VIP 플래그를 같이 사용하여 CR4 제어 레지스터 VME 플래그(8086모드에서 인터럽트 및 예외처리 가능)가 set(1)되어 가상 모드 확장이 가능해 진다.
- Virtual Interrupt Pending Flag (VIP : bit 20)
; 인터럽트가 펜딩되어 있으면 set(1)되고, 펜딩된 인터럽트가 없다면 clear(0)이 된다. 소프트웨어는 이 플래그를 set/clear하고, 프로세서(CPU)는 이 상태를 읽는다. VIF와 함께 사용된다.
- Identification Flag (ID : bit 21)
; CPUID 명령의 지원 유무를 결정하는 플래그
* Reserved
; Reserved는 예약되어 있다는 뜻으로 현재 특별한 목적이 있어 예약된 공간이라는 것은 아니다. 앞으로 사용될 수 있기에 사용하지 말라는 뜻으로 시스템에서 예약한 것 뿐이다. bit 1만 1로 설정되어 있으며 나머지 Reserved는 0으로 설정되어 있다.
예제 |
=> Debug 모드에서 실행, mov 와 같이 값이 '이동' 만 하는 니모닉은 EFLAGS 가 변화하지 않는다. sub 와 같이 값이 변하는 부분에서 EFLAGS 가 변한다. 상태가 변했을 때 EFLAGS 는 a96 이다. 2진수로 바꾸면 1010 1001 0110 이고 SF(bit 7), OF(bit 11) 가 1로 Set 되어 있다. 그러므로 상태플래스가 변한다.
※ 참고 => Operand(s) 자리에 상수를 적을 때, 영어를 먼저 적으면 변수로 인식을 한다. 숫자를 앞에 적어줘야함 ( ex: ff20h => 0ff20h ) => 반대도 마찬가지, 변수를 적을때 숫자를 먼저 적으면 역시 인식을 못한다. |
'Assembly' 카테고리의 다른 글
2013.08.29_Division Instructions (0) | 2013.08.29 |
---|---|
2013.08.28_ASM_Basic Instruction (0) | 2013.08.28 |
2013.08.27_ASM_APPENDIX 활용하기 and 4장 Basic Instruction (0) | 2013.08.27 |
2013.08.26_ASM_Constant, Instruction Operand(s) 해석 (0) | 2013.08.27 |
2013.08.23_ASM_Debug 모드 및 이론설명 (0) | 2013.08.23 |