x86 Flags Register

Nov. 2010 written by 이주형 (Lee Ju Hyung)

EFLAGS 레지스터는 32 비트 상태 레지스터로서, 여러가지 상태 정보를 싱글 비트(true/false) 값으로 쪼개 사용한다.
대부분의 값들은 OS 의 커널모드에서 사용하고. 나머지 몇가지 값들을 프로그램에서 사용하는데, 연산 결과를 알아보는데 쓰이는 CF(carry), ZF(zero), SF(sign), OF(overflow), PF(parity) 비트들은 애플리케이션 프로그래머라면 알아두는게 좋다

각 비트의 의미

비트 약어 이름 설명
0 CF Carry Flag 연산시 자리올림이나 자리빌림이 있을 경우 set 된다
1 1
2 PF Parity Flag 연산결과 1인 비트수가 짝수라면 set 된다
2 0
4 AF Auxiliary Flag CF 가 Nibble 에 대하여 적용된다
5 0
6 ZF Zero Flag 연산결과가 0 이 되었을때 set 된다
7 SF Sign Flag 연산결과 MSB 가 1일때 set 된다
8 TF Trap Flag 하나의 명령어 처리후에 single-step interrupt 를 발생시킨다
9 IF Interrupt Flag Enables the external interrupt
10 DF Direction Flag Increment or decrement mode for
11 OF Overflow Flag 연산결과 사인비트가 반전된다면 set 된다
12-13 IO-PL I/O Privilege Level Used in protected mode operation to select the privilege level for I/O device(00~11).
If current privilege level > IOPL, I/O (IN, INS, OUT, OUTS, CLI, STI) can be executed. Otherwise, an exception occurs (286+ only)
14 NF Nested Task Instruction caused nested task switch (286+)
15 0
16 RF Resume Flag Debug faults disabled during instruction execution (386+)
17 VM Virtual 8086 Currently executing 8086 code on virtual processor (386+)
18 AC Alignment Check Data aligned to four-byte boundary (486+)
19 VIF Virutal interrupt flag A copy of the interrupt flag bit available to the Pentium II processors
20 VIP Virtual interrupt pending flag Provides information about a virtual mode interrupt for the Pentium-Pentium II processors. Used in multitasking environment
21 ID ID Flag CPUID 명령이 지원되는지 나타내는 플래그

CF 예시

연산시 자리올림이나 자리빌림이 있을 경우 set 된다.

연산과정에서 MSB 의 상위비트가 추가로 하나 더 있다고 가정하면, 연산결과로 그 비트가 CarryFlag 가 된다.

이런 경우에는 아래와 같이 나타낼 수 있다.

두 경우 모두 결과값은 -1 이지만 CF 는 다르다

OF 예시

연산결과 사인비트가 반전된다면 set 된다

이런 경우에는 아래와 같이 나타낼 수 있다.

Jump Instruction

Explicit Mappings

명령어 설명 not 명령어 설명
JC Jump if carry (CF = 1) JNC Jump if not carry (CF = 0)
JO Jump if overflow (OF = 1) JNO Jump if not overflow (OF = 0)
JP Jump if parity (PF = 1) JNP Jump if not parity (PF = 0)
JS Jump if sign (SF = 1) JNS Jump if not sign (SF = 0)
JZ Jump if zero (ZF = 1) JNZ Jump if not zero (ZF = 0)

Logical Implicit Mappings

명령어 설명 not 명령어 설명
JE Jump if equal (ZF = 1) JNE Jump if not equal (ZF = 0)
JA Jump if above (CF = 0 and ZF = 0) JNA Jump if not above (CF = 1 or ZF = 1)
JAE Jump if above or equal (CF = 0) JNAE Jump if not above or equal (CF = 1)
JB Jump if below (CF = 1) JNB Jump if not below (CF = 0)
JBE Jump if below or equal (CF = 1 or ZF = 1) JNBE Jump if not below or equal (CF = 0 and ZF = 0)
JG Jump if greater (ZF = 0 and SF = OF) JNG Jump if not greater (ZF = 1 or SF != OF)
JGE Jump if greater or equal (SF = OF) JNGE Jump if not greater or equal (SF != OF)
JL Jump if less (SF != OF) JNL Jump if not less (SF = OF)
JLE Jump if less or equal (ZF = 1 or SF != OF) JNLE Jump if not less or equal (ZF = 0 and SF = OF)

참고

  1. http://www.autonomy.net.au/display/compro/Jumps+CMP+and+TEST

Leave a Reply

Your email address will not be published. Required fields are marked *