FLAGS 레지스터
FLAGS registerFLAGS 레지스터는 CPU의 현재 상태를 포함하는 상태 레지스터입니다.플래그 비트의 크기와 의미는 아키텍처에 따라 달라집니다.통상, 현재의 CPU 동작에 가해진 제한에 관한 정보와 산술 연산의 결과가 반영됩니다.이러한 제한사항에는 일부 인터럽트의 트리거 방지, "특권" 명령 클래스의 실행 금지 등이 포함될 수 있습니다.추가 상태 플래그는 메모리 매핑을 바이패스하여 CPU가 산술 오버플로에 대해 수행할 액션을 정의할 수 있습니다.
반송, 패리티, 조정, 제로 및 부호 플래그는 많은 아키텍처에 포함되어 있습니다.8080에서는 조정 플래그를 보조 캐리 비트라고 불렀고 Zilog Z80 아키텍처에서는 하프 캐리 비트라고 불렀습니다.
i286 아키텍처에서는 레지스터의 폭은 16비트입니다.후속 제품인 EFLAGS 레지스터와 RFLAGS 레지스터는 각각 32비트, 64비트 너비입니다.더 넓은 레지스터는 더 작은 이전 레지스터와의 호환성을 유지합니다.
플래그
인텔 x86 FLAGS[1] 레지스터 | ||||||
---|---|---|---|---|---|---|
비트 번호 | 마스크 | 줄임말 | 묘사 | 카테고리 | =1 | =0 |
플래그 | ||||||
0 | 0x0001 | CF | 반송 플래그 | 상황 | CY(캐리) | NC(캐리 없음) |
1 | 0x0002 | 예약 완료, EFLAGS에서 항상 1개 | ||||
2 | 0x0004 | PF | 패리티 플래그 | 상황 | PE(패리티 이븐) | PO(패리티 홀수) |
3 | 0x0008 | 예약필[3] | ||||
4 | 0x0010 | AF | 조정 플래그 | 상황 | AC(보조 캐리어) | NA(보조 캐리어 없음) |
5 | 0x0020 | 예약필[3] | ||||
6 | 0x0040 | ZF | 제로 플래그 | 상황 | ZR(제로) | NZ(제로 아님) |
7 | 0x0080 | SF | 서명 플래그 | 상황 | NG(음) | PL(양) |
8 | 0x0100 | TF | 트랩 플래그(싱글스텝) | 통제 | ||
9 | 0x0200 | 한다면 | 인터럽트 활성화 플래그 | 통제 | EI(인터럽트 활성화) | DI(인터럽트 비활성화) |
10 | 0x0400 | DF | 방향 플래그 | 통제 | DN(다운) | UP(업) |
11 | 0x0800 | 의 | 오버플로 플래그 | 상황 | OV(오버플로우) | NV(오버플로우 없음) |
12-13 | 0x3000 | IOPL | I/O 권한 수준(286 이상만 해당), 8086 및 186에서는 항상[clarification needed] 1 | 시스템. | ||
14 | 0x4000 | NT | 중첩된 작업 플래그(286+만 해당), 8086 및 186에서는 항상 1 | 시스템. | ||
15 | 0x8000 | 예약 완료, 8086과 186에서는 항상 1입니다. 이후 모델에서는 항상 0 | ||||
이플래그 | ||||||
16 | 0x0001 0000 | RF | 재개 플래그(386+ 한정) | 시스템. | ||
17 | 0x0002 0000 | VM | 가상 8086 모드플래그(386+만) | 시스템. | ||
18 | 0x0004 0000 | AC | 얼라인먼트 체크(486SX+만) | 시스템. | ||
19 | 0x0008 0000 | VIF | 가상 인터럽트 플래그(Pentium+) | 시스템. | ||
20 | 0x0010 0000 | VIP | 가상 인터럽트 보류 중(Pentium+) | 시스템. | ||
21 | 0x0020 0000 | 아이디 | CPUID 명령 사용 가능(Pentium+) | 시스템. | ||
22‑31 | 0xFFC0 0000 | 예약필 | 시스템. | |||
래그 | ||||||
32‑63 | 0xFFFFFFFF... …0000 0000 | 예약필 |
주의: 표의 마스크 열은 FLAGS 레지스터 값 내의 플래그를 쿼리하기 위한 AND 비트마스크(16진수치)입니다.
사용.
모든 FLAGS 레지스터에는 조건 코드, 즉 한 기계어 명령의 결과가 다른 명령에 영향을 줄 수 있는 플래그 비트가 포함되어 있습니다.산술 및 논리 명령은 플래그의 일부 또는 전부를 설정하고 조건부 점프 명령은 특정 플래그의 값에 따라 가변 액션을 수행합니다.예를들면,jz
(제로일 경우 점프),jc
(캐리일 경우 점프),jo
(오버플로우일 경우 점프)는 특정 플래그에 따라 달라집니다.다른 조건부 점프는 여러 깃발 조합을 테스트한다.
FLAGS 레지스터는 스택에서 또는 스택으로 이동할 수 있습니다.이것은, 인터럽트 서비스 루틴등의 루틴에 대해서, CPU 콘텍스트의 보존과 restore의 작업의 일부입니다.이 루틴에서는 레지스터의 변경이 호출 코드로 인식되지 않습니다.다음은 관련 절차입니다.
- PUSHF 및 POPF 명령은 16비트 FLAGS 레지스터를 전송합니다.
- PUSHFD/POPFD(i386 아키텍처에서 도입)는 32비트 더블 레지스터 EFLAGS를 전송합니다.
- PUSHFQ/POPFQ(x64 아키텍처에서 도입)는 64비트 쿼드워드 레지스터 RFLAGS를 전송합니다.
64비트 모드에서는 PUSHF/POPF와 PUSHFQ/POPFQ를 사용할 수 있지만 PUSHFD/POPFD는 사용할 수 없습니다.[4]: 4–349, 4–432
FLAGS 레지스터의 하위 8비트는 SAHF 및 LAHF(플래그에 AH를 로드/저장)에 의한 직접 로드/저장 조작에도 사용할 수 있습니다.
예
FLAGS 레지스터를 푸시 및 팝하는 기능을 통해 프로그램은 FLAGS 내의 정보를 기계어 명령이 존재하지 않는 방식으로 조작할 수 있습니다.예를 들어,cld
그리고.std
지시사항은 각각 방향 플래그(DF)를 지우고 설정하지만, DF를 보완하는 지침은 없습니다.이 작업은 다음 어셈블리 코드를 사용하여 수행할 수 있습니다.
푸시 ; 스택을 사용하여 FLAGS를 전송합니다. 팝 도끼 ;...AX 레지스터에 입력 밀다 도끼 스토리지용으로 스택에 카피합니다. xor 도끼, 400시간 ; 전환(컴플리트먼트) DF만. 다른 비트는 변경되지 않음 밀다 도끼 ; 스택을 다시 사용하여 변경된 값을 이동합니다. 팝 ;...FLAGS 레지스터에 입력 ; 여기에 DF 플래그를 보완해야 했던 코드를 삽입하십시오. 팝 ; FLAGS의 원래 값을 복원합니다.
FLAGS 레지스터를 조작하는 것으로, 프로그램은 인스톨 되고 있는 프로세서의 모델을 판별할 수 있습니다.예를 들어, 얼라인먼트플래그는 486 이상에서만 변경할 수 있습니다.프로그램이 이 플래그를 변경하려고 하고 변경이 지속되지 않은 것을 감지하면 프로세서는 486보다 이전 버전입니다.
인텔 Pentium 이후 CPUID 명령어는 프로세서 모델을 보고합니다.그러나 위의 방법은 이전 모델을 구별하는 데 여전히 유용합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Intel 64 and IA-32 Architectures Software Developer's Manual (PDF). Vol. 1. May 2012. pp. 3–21.
- ^ Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 1. Dec 2016. p. 78.
- ^ a b c "Silicon reverse engineering: The 8085's undocumented flags". www.righto.com. Retrieved 2018-10-21.
- ^ Intel 64 and IA-32 Architectures Software Developer’s Manual (PDF). Vol. 2B. May 2012.