x86 명령어 목록

x86 instruction listings

x86 명령어 집합은 x86 호환 마이크로프로세서가 지원하는 명령어 집합을 나타냅니다.명령어는 대개 실행 가능한 프로그램의 일부이며, 종종 컴퓨터 파일로 저장되고 프로세서에서 실행됩니다.

x86 명령어 세트는 여러 번 확장되어 더 넓은 레지스터와 데이터 유형뿐만 아니라 새로운 기능을 도입했습니다.[1]

x86 정수 명령어

아래는 인텔의 전체 8086/8088 명령어 세트(총 81개의 명령어)입니다.대부분의 명령어는 32비트 모드에서 사용할 수는 없지만, 16비트(ax, bx 등) 레지스터와 값에서 작동합니다.업데이트된 명령어 집합은 아키텍처(i386, i486, i686)에 따라 그룹화되기도 하며, 일반적으로 (32비트) x86 및 (64비트) x86-64(AMD64라고도 함)라고도 합니다.

원본 8086/8088 지침

오리지널 8086/8088 명령어 세트
설명 의미. 메모들 옵코드
ASCII 추가 후 AL 조정 언팩된 이진 코드 10진수와 함께 사용됨 0x37
AAD ASCII 분할 전 AX 조정 8086/8088 데이터시트 문서는 AAD 지침의 10가지 버전(opcode 0xD50x0A)만 기본 문서로 작성되지만, 다른 기본 문서는 모두 작동합니다.나중에 인텔의 문서에도 일반적인 형태가 있습니다.NEC V20 및 V30(및 다른 NEC V-Series CPU일 가능성도 있음)은 항상 기본 10을 사용하고 인수를 무시하여 여러 가지 비호환성을 야기합니다. 0xD5
AAM ASCII 곱하기 후 AX 조정 기본 10 버전(Operand는 0xA)만 문서화됩니다. AAD에 대한 참고 사항을 참조하십시오. 0xD4
AAS 뺄셈 후 ASCII 조정 AL 0x3F
ADC 휴대용 추가 destination = destination + source + carry_flag 0x10...0x15, 0x80...0x81/2, 0x82...0x83/2 (80186 이후)
더하다 더하다 (1)r/m += r/imm;(2)r += m/imm; 0x00...0x05, 0x80/0...0x81/0, 0x82/0...0x83/0(80186 이후)
그리고. 논리 AND (1)r/m &= r/imm;(2)r &= m/imm; 0x20...0x25, 0x80...0x81/4, 0x82...0x83/4 (80186 이후)
불러 통화절차 push eip; eip points to the instruction directly after the call 0x9A, 0xE8, 0xFF/2, 0xFF/3
CBW 바이트를 단어로 변환 0x98
CLC 운반 플래그 지우기 CF = 0; 0xF8
CLD 방향 플래그 지우기 DF = 0; 0xFC
CLI 인터럽트 플래그 지우기 IF = 0; 0xFA
CMC 보조사반입깃발 0xF5
CMP 피연산자 비교 0x38...0x3D, 0x80...0x81/7, 0x82...0x83/7 (80186 이후)
CMPSB 메모리의 바이트를 비교합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. 0xA6
CMPSW 단어를 비교합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. 0xA7
CWD 단어를 이중 단어로 변환 0x99
DAA 덧셈 후 AL 소수 조정 (패킹된 이진 코드 10진수와 함께 사용) 0x27
다스 뺄셈 후 AL 소수 조정 0x2F
DEC 1씩 감소 0x48...0x4F, 0xFE/1, 0xFF/1
디브이 부호분할 (1)AX = DX:AX / r/m;결과로 초래된DX = remainder(2)AL = AX / r/m;결과로 초래된AH = remainder 0xF7/6, 0xF6/6
ESC 부동 소수점 단위와 함께 사용 0xD8..0xDF
HLT 정지상태로들어가세요 0xF4
IDIV 부호분할 (1)AX = DX:AX / r/m;결과로 초래된DX = remainder(2)AL = AX / r/m;결과로 초래된AH = remainder 0xF7/7, 0xF6/7
아이뮬 단일 피연산자 형태의 부호 곱셈 (1)DX:AX = AX * r/m;(2)AX = AL * r/m 0x69, 0x6B(모두 80186 이후), 0xF7/5, 0xF6/5, 0x0FAF(80386 이후)
IN 포트에서 입력 (1)AL = port[imm];(2)AL = port[DX];(3)AX = port[imm];(4)AX = port[DX]; 0xE4, 0xE5, 0xEC, 0xED
주식회사 1씩 증가 0x40...0x47, 0xFE/0, 0xFF/0
INT 방해를 위해 인터럽니다. 0xCC, 0xCD
안으로 오버플로인 경우 인터럽트하기 위해 호출 0xCE
IRET 인터럽트에서 반환 0xCF
Jcc 점프 시 조건일 경우 (JA, JAE, JB, JBE, JC, JE, JG, JGE, JL, JLE, 유고 인민군, JNAE, JNB, JNB, JNC, JNE, JNG, JNL, JNLE, JNO, JNP, JNS, JO, JP, JPE, JPO, JS, JZ) 0x70...0x7F, 0x0F80...0x0F8F (80386 이후)
JCXZ CX가 0인 경우 점프 0xE3
JMP 점프 0xE9...0xEB, 0xFF/4, 0xFF/5
LAHF 플래그를 AH 레지스터에 로드합니다. 0x9F
엘디에스 먼 포인터로 DS:r 로드 0xC5
LEA 유효 주소 로드 0x8D
LES 먼 포인터로 ES:r 로드 0xC4
잠그다 버스 LOCK# 신호 주장 (다중가공용) 0xF0
LODSB 문자열 바이트를 로드합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. if (DF==0) AL = *SI++; else AL = *SI--; 0xAC
LODSW 문자열 단어를 로드합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. if (DF==0) AX = *SI++; else AX = *SI--; 0xAD
LOOP/LOOPx 루프 제어 (루프, 루프네, 루프네, 루프즈)if (x && --CX) goto lbl; 0xE0...0xE2
MOV 이동 한 위치에서 다른 위치로 데이터를 복사합니다. (1)r/m = r;(2)r = r/m; 0xA0...0xA3
MOVSB 문자열에서 문자열로 바이트를 이동합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다.
한다면 (DF==0)   *(바이트로*)DI++ = *(바이트로*)SI++; 또 다른   *(바이트로*)DI-- = *(바이트로*)SI--; 
.
0xA4
MOBSW 문자열에서 문자열로 단어를 이동합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다.
한다면 (DF==0)   *(단어*)DI++ = *(단어*)SI++; 또 다른   *(단어*)DI-- = *(단어*)SI--; 
0xA5
부호없는 곱셈 (1)DX:AX = AX * r/m;(2)AX = AL * r/m; 0xF7/4, 0xF6/4
NEG 2의 보음부정 r/m = 0 r/m; 0xF6/3...0xF7/3
NOP 작업없음 에 해당하는 opcodeXCHG EAX, EAX 0x90
것은 아니다. 피연산자 부정, 논리적 없음 r/m ^= -1; 0xF6/2...0xF7/2
오어 논리적 논리합 (1)r/m(2)r 0x08...0x0D, 0x80...0x81/1, 0x82...0x83/1 (80186 이후)
나가. 포트로 출력 (1)port[imm] = AL;(2)port[DX] = AL;(3)port[imm] = AX;(4)port[DX] = AX; 0xE6, 0xE7, 0xEE, 0xEF
스택에서 데이터 팝 r/m = *SP++;POP CS(opcode 0x0F)는 8086/8088에서만 작동합니다.이후 CPU에서는 0x0F를 새로운 명령의 접두사로 사용합니다. 0x07, 0x0F(8086/8088만 해당), 0x17, 0x1F, 0x58...0x5F, 0x8F/0
POPF 스택에서 Pop FLAGS 레지스터 FLAGS = *SP++; 0x9D
푸쉬 데이터를 스택에 푸시 *--SP = r/m; 0x06, 0x0E, 0x16, 0x1E, 0x50...0x57, 0x68, 0x6A(모두 80186 이후), 0xFF/6
푸쉬프 플래그를 스택에 밀어 넣습니다. *--SP = FLAGS; 0x9C
RCL 왼쪽으로 회전(캐리 포함) 0xC0...0xC1/2(80186 이후), 0xD0...0xD3/2
RCR 오른쪽으로 회전(캐리 포함) 0xC0...0xC1/3(80186 이후), 0xD0...0xD3/3
REPxx MOVS/STOS/CMPS/LODS/SCAS 반복 (REP, REPE, REPNE, REPNZ, REPZ) 0xF2, 0xF3
RET 절차로부터 반환 진짜 지시사항이 아닙니다.어셈블러는 대상 시스템의 메모리 모델에 따라 RETN 또는 RETF로 변환합니다.
RETN 근거리 절차에서 반환 0xC2, 0xC3
RETF 원프로시저에서 복귀 0xCA, 0xCB
왼쪽으로 회전 0xC0...0xC1/0(80186 이후), 0xD0...0xD3/0
ROR 우회전 0xC0...0xC1/1(80186 이후), 0xD0...0xD3/1
SAHF AH를 플래그에 저장 0x9E
SAL Shift A 산술 왼쪽(서명된 Shift 왼쪽) (1)r/m <<= 1;(2)r/m <<= CL; 0xC0...0xC1/4(80186 이후), 0xD0...0xD3/4
SAR Shift A를 산술적으로 오른쪽(서명된 Shift 오른쪽) (1)(signed) r/m >>= 1;(2)(signed) r/m >>= CL; 0xC0...0xC1/7(80186 이후), 0xD0...0xD3/7
SBB 차입금감산출 의 대체 1바이트 인코딩은 문서화되지 않은 SALC 명령을 통해 사용할 수 있습니다. 0x18...0x1D, 0x80...0x81/3, 0x82...0x83/3 (80186 이후)
SCASB 바이트 문자열을 비교합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. 0xAE
SCASW 단어 문자열을 비교합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. 0xAF
SHL 시프트 왼쪽(부호 시프트 왼쪽) 0xC0...0xC1/4(80186 이후), 0xD0...0xD3/4
SHR 시프트 우측(부호 시프트 우측) 0xC0...0xC1/5(80186 이후), 0xD0...0xD3/5
STC 운반 플래그 설정 CF = 1; 0xF9
성병 방향 플래그 설정 DF = 1; 0xFD
STI 인터럽트 플래그 설정 IF = 1; 0xFB
STOSB 바이트를 문자열로 저장합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. if (DF==0) *ES:DI++ = AL; else *ES:DI-- = AL; 0xAA
STOSW 단어를 문자열에 저장합니다.REP 접두사와 함께 사용하여 명령 CX를 반복할 수 있습니다. if (DF==0) *ES:DI++ = AX; else *ES:DI-- = AX; 0xAB
후보선수 뺄셈 (1)r/m -= r/imm;(2)r -= m/imm; 0x28...0x2D, 0x80...0x81/5, 0x82...0x83/5 (80186 이후)
시험 논리비교(AND) (1)r/m & r/imm;(2)r & m/imm; 0x84, 0x85, 0xA8, 0xA9, 0xF6/0, 0xF7/0
잠깐만요. 바쁘지 않을 때까지 기다립니다. BUSY# 핀이 비활성화될 때까지 기다립니다(플로팅 포인트 장치와 함께 사용). 0x9B
XCHG 데이터교환 r :=: r/m;스핀록은 일반적으로 원자 연산으로 xchg를 사용합니다.(코마 버그). 0x86, 0x87, 0x91...0x97
XLAT 표 조회 번역 행세를 부리다MOV AL, [BX+AL] 0xD7
XOR 배타적 논리합 (1)r/m ^= r/imm;(2)r ^= m/imm; 0x30...0x35, 0x80...0x81/6, 0x82...0x83/6 (80186 이후)

특정 프로세서에 추가됨

80186/80188 추가

설명 옵코드 의미. 메모들
바운드 62/r 배열 인덱스를 경계와 비교하여 확인합니다. 테스트에 실패할 경우 소프트웨어 인터럽트 5가 발생합니다.
를 입력하십시오. C8 iwib 스택프레임입력 고급 언어에 대한 진입 절차를 위해 스택을 수정합니다.스택에 할당할 스토리지의 양과 프로시저의 네스팅 수준이라는 두 개의 피연산자를 사용합니다.
INSB/INSW 6C 포트에서 문자열로 입력 다음에 해당하는:
IN AX, DX MOV ES:[DI], AX ; 피연산자 크기 및 DF에 따라 DI 조정 
6D
떠나 C9 스택 프레임 남기기 이전 ENTER 지침에 의해 생성된 로컬 스택 저장소를 해제합니다.
OUTSB/OUTSW 6E 포트로 문자열 출력 다음에 해당하는:
MOV AX, DS:[SI] 나가. DX, AX ; 피연산자 크기와 DF에 따라 SI를 조정합니다. 
6층
포파 61 스택에서 모든 범용 레지스터 열기 다음에 해당하는:
 DI  SI  BP  AX ; 여기에는 POP SP가 없습니다. ADD SP, 2만 수행합니다(AX는 나중에 덮어쓰기되므로).  BX  DX  CX  AX 
푸샤 60 모든 범용 레지스터를 스택에 푸시 다음에 해당하는:
푸쉬 AX 푸쉬 CX 푸쉬 DX 푸쉬 BX 푸쉬 SP ; 저장된 값은 초기 SP 값입니다. 푸쉬 BP 푸쉬 SI 푸쉬 DI 
PUSH 즉시 6Aib 즉시 바이트/워드 값을 스택에 푸시 예:
푸쉬 12시 푸쉬 1200시간 
68 iw
IMUL 즉시 6B/립 즉시 바이트/워드 값의 부호화 및 비부호화 곱셈 예:
아이뮬 BX,12시 아이뮬 DX,1200시간 아이뮬 CX, DX, 12시 아이뮬 BX, SI, 1200시간 아이뮬 DI, 단어 ptr [BX+SI], 12시 아이뮬 SI, 단어 ptr [BP-4], 1200시간 

아래쪽 절반은 비부호 곱셈과 부호 곱셈에서 동일하므로 이 버전의 명령어는 비부호 곱셈에서도 사용할 수 있습니다.

69/줄
SHL/SHR/SAL/SAR/ROL/ROR/RCL/RCR 즉시 C0 즉시 값이 1보다 큰 비트 회전/시프트 예:
 AX,3 SHR BL,3 
C1

80286 추가

80286에 새로 추가된 명령어는 x86 보호 모드 지원을 추가했습니다.일부 지침은 있지만 모든 지침은 실제 모드에서도 사용할 수 있습니다.

설명 옵코드 지침설명 리얼모드 울리다
LGDT m16&32[a] 0F 01 /2 메모리에서 GDTR(Global Descriptor Table Register)을 로드합니다.[b] 네. 0
LIDT m16&32[a] 0F 01 /3 메모리에서 IDTR(Interrupt Descriptor Table Register) 로드..[b]
IDTR은 보호 모드에서 IDT(Interrupt Descriptor Table)의 주소/크기뿐만 아니라 실제 모드에서 IVT(Interrupt Vector Table)도 제어합니다.
LMSW r/m16 0F 01 /6 16비트 레지스터 또는 메모리에서 MSW(Machine Status Word)를 로드합니다.[b][c]
CLTS 0F 06 MSW에서 작업 전환 플래그를 지웁니다.
LLDT r/m16 0F 00 /2 16비트 레지스터 또는 메모리에서 LDTR(Local Descriptor Table Register)을 로드합니다.[b] #UD
LTR r/m16 0F 00 /3 16비트 레지스터 또는 메모리에서 TR(Task Register)을 로드합니다.[b]

16비트 인수로 지정된 TSS(Task State Segment)는 비지로 표시되지만 작업 전환이 수행되지 않습니다.

SGDT m16&32[a] 0F 01 /0 GDTR을 메모리에 저장합니다. 네. 보통 3개[d]
SIDT m16&32[a] 0F 01 /1 IDTR을 메모리에 저장합니다.
SMSW r/m16 0F 01 /4 MSW를 저장하여 등록하거나 16비트 메모리를 저장합니다.[e]
SLDT r/m16 0F 00 /0 LDTR을 저장하여 등록하거나 16비트 메모리를 저장합니다.[e] #UD
STR r/m16 0F 00 /1 등록할 TR 또는 16비트 메모리를 저장합니다.[e]
ARPL r/m16,r16 63 /r[f] 선택기의 RPL(Requested Privilege Level) 필드를 조정합니다.수행되는 작업은 다음과 같습니다.
(dst & 3) < (src & 3) 다음 dst = (dst & 0xFFFC) (src & 3) 이플래그인 경우.zf = 1개의 다른 플래그.zf = 0
#UD[g] 3
LAR r,r/m16 0F 02 /r 지정한 세그먼트 설명자에서 액세스 권한 바이트를 로드합니다.
세그먼트 설명자의 바이트 4-7을 읽습니다. 비트 단위로 AND 처리합니다.0x00FxFF00[h],그런 [h]다음 결과의 하위 16/32비트를 대상 레지스터에 저장합니다.EFLAGS를 설정합니다.디스크립터를 로드할 수 있는 경우 ZF=1, 그렇지 않은 경우 ZF=0.
#UD
LSL r,r/m16 0F 03 /r 지정한 세그먼트 설명자에서 세그먼트 제한을 로드합니다.디스크립터를 로드할 수 있는 경우 ZF=1을 설정하고, 그렇지 않은 경우 ZF=0을 설정합니다.
VERR r/m16 0F 00 /4 판독할 세그먼트를 확인합니다.세그먼트를 읽을 수 있는 경우 ZF=1, 그렇지 않은 경우 ZF=0을 설정합니다.
VERW r/m16 0F 00 /5 쓰기를 위해 세그먼트를 확인합니다.세그먼트를 쓸 수 있는 경우 ZF=1, 그렇지 않은 경우 ZF=0으로 설정합니다.
모두 로드[j] 0F 05 물리적 주소로 시작하는 102바이트 데이터 구조에서 모든 CPU 레지스터 로드800h, 세그먼트 기술자 레지스터의 "숨겨진" 부분을 포함합니다. 네. 0
모두 저장[j] F10F04 모든 CPU 레지스터를 물리적 주소로 시작하는 102바이트 데이터 구조에 저장800h, CPU를 종료합니다.
  1. ^ a b c d 에 의해 사용되는 설명자.LGDT,LIDT,SGDT그리고.SIDT명령어는 2-파트 데이터 구조로 구성됩니다.첫 번째 부분은 16비트 값으로, 테이블 크기를 바이트에서 1을 뺀 값으로 지정합니다.두 번째 부분은 32비트 값(64비트 모드의 경우 64비트 값)으로 테이블의 선형 시작 주소를 지정합니다.
    위해서LGDT그리고.LIDT16비트 피연산자 크기의 주소는 00FFFFFh로 AND 처리됩니다.Intel(AMD는 아님) CPU의 경우SGDT그리고.SIDT16비트 피연산자 크기의 명령어는 2023년 3월 Intel SDM 리비전 079에서 마지막 바이트가 0으로 설정된 상태에서 메모리에 디스크립터를 쓰기 위해 문서화되었습니다.그러나 관찰된 동작은 디스크립터 테이블 주소의 비트 31:24가 대신 기록되는 것입니다.[2]
  2. ^ a b c d e LGDT,LIDT,LLDT,LMSW그리고.LTR명령어는 펜티엄 이후의 프로세서에서 직렬화되고 있습니다.
  3. ^ 80386 이상에서 "Machine Status Word"는 CR0 제어 레지스터와 동일하지만,LMSW명령어는 이 레지스터의 하위 4비트만 수정할 수 있고 0비트는 지울 수 없습니다.
    비트 0을 지울 수 없다는 것은LMSWx86 Protected Mode(보호 모드)를 시작할 때는 사용할 수 있지만 종료할 수는 없습니다.80286에서는 CPU 리셋 없이 보호 모드를 완전히 종료할 수 없습니다. 80386 이상에서는 보호 모드를 종료할 수 있지만 이를 위해서는 80386 이상 MOV to CR0 명령을 사용해야 합니다.
  4. ^ 한다면CR4.UMIP=1설정된 다음,SGDT,SIDT,SLDT,SMSW그리고.STR명령은 Ring 0에서만 실행할 수 있습니다.
    이러한 지침은 80286 이후부터 2017년 UMIP가 도입될 때까지 모든 x86 CPU에서 적용되지 않았습니다.[3]이러한 지침은 VM 게스트가 VM 내부에서 실행 중임을 감지하는 데 사용할 수 있기 때문에 소프트웨어 기반 가상화에서 중요한 보안 문제가 되었습니다.[4][5]
  5. ^ a b c SMSW,SLDT그리고.STR명령어는 메모리 인수와 함께 사용될 때 항상 16비트의 피연산자 크기를 사용합니다.80386 이상의 프로세서에서 레지스터 인수를 사용하면 더 넓은 대상 피연산자 크기를 사용할 수 있으며 다음과 같이 동작합니다.
    • SMSW: x86-64 Long 모드에서 전체 CR0를 저장하며, 그렇지 않으면 정의되지 않습니다.
    • SLDT: Pentium Pro 이상의 프로세서에서 이전 프로세서에서는 정의되지 않은 16비트 인수를 0으로 확장합니다.
    • STR: 16비트 인수를 0으로 확장합니다.
  6. ^ x86-64 long 모드에서ARPL명령을 사용할 수 없습니다. – the63 /ropcode가 64비트 모드 전용으로 재할당되었습니다.MOVSXD설명.
  7. ^ ARPL명령은 #UD를 Real 모드Virtual 8086 Mode에서 유발합니다 – Windows 95와 OS/2 2.x는 이 #UD를 광범위하게 사용하여 사용하는 것으로 알려져 있습니다.63opcode는 가상 8086 모드에서 커널 모드로 전환하기 위한 1바이트 중단점입니다.[6][7]
  8. ^ 이 마스크의 비트 19:16은 Intel CPU에서 "정의되지 않음"으로 문서화됩니다.[8]AMD CPU에서 마스크는 다음과 같이 문서화되어 있습니다.0x00FFFF00.
  9. ^ 2019년 이후 인텔 CPU/마이크로코드의 일부 조합에서VERW명령어는 마이크로아키텍처 데이터 버퍼도 플러시합니다.이를 통해 마이크로아키텍처 데이터 샘플링 보안 취약성에 대한 해결책의 일부로 사용할 수 있습니다.[9][10]
  10. ^ a b 미문서, 80286만 해당.[11][12][13] (다른 버전의LOADALL80386에 다른 opcode와 메모리 레이아웃이 존재합니다.)

80386 추가

80386은 x86 명령어 세트에 32비트 연산 지원을 추가했습니다.이것은 범용 레지스터를 32비트로 확장하고 OperandSizeAddressSize의 개념을 도입함으로써 이루어졌습니다. 이전에 16비트 데이터 인수를 사용하던 대부분의 명령어 양식은 OperandSize를 32비트로 설정함으로써 32비트 인수를 사용할 수 있는 기능이 주어졌습니다.그리고 16비트 주소 인수를 받을 수 있는 명령어는 AddressSize를 32비트로 설정하여 32비트 주소 인수를 받을 수 있는 기능을 부여받았습니다.(8비트 데이터에서 작동하는 명령어 양식은 Operand Size에 관계없이 계속 8비트입니다.16비트의 데이터 크기를 사용하면 32비트 범용 레지스터의 하위 16비트만 수정됩니다. 상위 16비트는 변경되지 않습니다.)

각 명령에 사용할 기본 OperandSize 및 AddressSize는 현재 코드 세그먼트의 세그먼트 설명자의 D비트로 지정됩니다.D=0둘 다 16비트로 만들고,D=1둘 다 32비트로 만듭니다.또한 80386에 도입된 두 가지 새로운 명령어 접두사를 명령별로 재정의할 수 있습니다.

  • 66h: 피연산자 크기 재정의.다음과 같은 경우 Operand Size를 16비트에서 32비트로 변경합니다.CS.D=0, 또는 32비트에서 16비트 사이인 경우CS.D=1.
  • 67h: AddressSize를 재정의합니다.다음과 같은 경우 AddressSize를 16비트에서 32비트로 변경합니다.CS.D=0, 또는 32비트에서 16비트 사이인 경우CS.D=1.

80386은 또한 두 개의 새로운 세그먼트 레지스터를 소개했습니다.FS그리고.GSx86 컨트롤, 디버그테스트 레지스터 뿐만 아니라

80386에 도입된 새로운 명령어는 크게 두 가지 클래스로 나눌 수 있습니다.

  • 32비트 Operand Size 변형(예: 32비트 Operand Size 변형)을 위해 새로운 니모닉이 필요했던 기존 opcode.CWDE,LODSD)
  • 새로운 기능을 도입한 새로운 opcode (예:SHLD,SETcc)

명령어의 인수에서 피연산자 크기를 유추할 수 있는 명령어 양식의 경우(예:ADD EAX,EBXEAX를 인수로 사용하기 때문에 32비트 OperandSize를 갖는 것으로 추론할 수 있습니다), 새로운 명령어 니모닉이 필요하지 않고 제공되지 않습니다.

80386: 32비트 변종의 오래된 opcode에 대한 새로운 명령어 니모닉
유형 지시 기억법 옵코드 묘사 이전 16비트 변형의 경우 니모닉 울리다
문자열 명령어[a][b] LODSD AD 문자열 이중 단어 로드:EAX := DS:[rSI±±] LODSW 3
STOSD AB 문자열 이중 단어 저장:ES:[rDI±±] := EAX STOSW
MOVSD A5 문자열 이중 단어 이동:ES:[rDI±±] := DS:[rSI±±] MOVSW
CMPSD A7 문자열 이중 단어 비교:
temp1 := DS:[rSI±±±] temp2 := ES:[rDI±±] CMP temp1, temp2 /* 32비트 비교 및 설정 EFLAGS */
CMPSW
SCASD AF 문자열 이중 단어 검색:
temp1 := ES :[rDI±±] CMP EAX, temp1 /* 32비트 비교 및 설정 EFLAGS */
SCASW
INSD 6D 이중 워드 I/O 포트의 입력 문자열:ES:[rDI±±] := port[DX][c] INSW 보통[d] 0
OUTSD 6F 이중 워드 I/O 포트에 대한 출력 문자열:port[DX] := DS:[rSI±±] OUTSW
다른. CWDE 98 AX의 16비트 값을 EAX의[e] 32비트 값으로 서명 확장 CBW 3
CDQ 99 EAX의 32비트 값을 EDX의 64비트 값으로 부호 확장:EAX.

주로 32비트의 배당금을 준비하는 데 사용됩니다.IDIV(서명된 분할) 명령입니다.

CWD
JECXZ rel8 E3 cb[f] ECX가 0인 경우 점프 JCXZ
PUSHAD 60 모든 32비트 레지스터를 스택에[g] 푸시 PUSHA
POPAD 61 모든 32비트 범용 레지스터를 스택에서[h] 꺼냅니다. POPA
PUSHFD 9C 32비트 EFLAGS 레지스터를 스택에 푸시 PUSHF 보통 3개[i]
POPFD 9D 팝 32비트 EFLAGS 레지스터 오프스택 POPF
IRETD CF 32비트 인터럽트 리턴.기존의 16비트와 다른 점IRET16비트 항목이 아닌 32비트 항목으로 스택에서 인터럽트 리턴 항목(EIP, CS, EFLAGS; 또한 CPL 변경이 있는 경우[j] ESP 및 SS)을 팝합니다.인터럽트 핸들러가 32비트 IDT 인터럽트/트랩 게이트를 통해 입력되었을 때 인터럽트에서 반환할 때 사용해야 합니다.

명령을 직렬화하고 있습니다.

IRET
  1. ^ 32비트 문자열 명령의 경우 ±±표기를 사용하여 표시된 레지스터가 다음과 같이 4만큼 후감소됨을 나타냅니다.EFLAGS.DF=1그 외에는 4개가 증가했습니다.
    DS 세그먼트가 표시된 피연산자의 경우, 세그먼트 오버라이드 접두사로 DS 세그먼트를 재정의할 수 있습니다. ES 세그먼트가 표시된 경우 세그먼트는 항상 ES이므로 재정의할 수 없습니다.
    16비트 SI/DI 레지스터 또는 32비트 ESI/EDI 레지스터를 사용할 주소 레지스터로 사용할 것인지의 선택은 AddressSize에 의해 결정되며, 이는 덮어쓸 수 있습니다.67접두사를 붙입니다
  2. ^ 32비트 문자열 명령어는 이전 8/16비트 문자열 명령어와 동일한 방식으로 반복 접두사를 허용합니다.
    위해서LODSD,STOSD,MOVSD,INSD그리고.OUTSD,그REP접두사()F3)는 rCX(CX 또는 ECX, AddressSize에 의해 결정됨)에 지정된 횟수만큼 명령을 반복하여 각 반복에 대해 rCX를 감소시킵니다(rCX=0으로 인해 노옵이 발생하고 다음 명령으로 진행됨).
    위해서CMPSD그리고.SCASD,그REPE(F3) 및REPNE(F2) 접두사를 사용할 수 있습니다. 이 명령은 반복되지만 플래그 조건( 의 경우 ZF=1)인 경우에만 반복됩니다.REPE, 의 경우 ZF=0REPNE)이 성립합니다.
  3. ^ 를 위해INSB/W/D명령, 에 대한 메모리 액세스 권한ES:[rDI]메모리 주소는 포트 액세스가 수행된 후까지 확인되지 않을 수 있습니다. 이 확인이 실패할 경우(예: 페이지 오류 또는 기타 메모리 예외), 포트에서 읽은 데이터 항목이 손실됩니다.따라서 읽기 시 부작용이 발생하는 I/O 포트에 액세스하려면 이 지침을 사용하지 않는 것이 좋습니다.
  4. ^ CPL≤인 경우에만 I/O 포트 액세스가 허용됩니다.포트가 액세스할 IOPL 또는 I/O 포트 권한 비트맵 비트가 모두 0으로 설정됩니다.
  5. ^ CWDE오래된 것과 다른 지시.CWD그것에 관한 지시.CWD는 AX의 16비트 값을 DX:AX 레지스터 쌍의 32비트 값으로 부호 확장합니다.
  6. ^ 를 위해E3opcode ()JCXZ/JECXZ), 명령어가 다음을 사용할지 여부의 선택CX아니면ECX비교를 위해(그리고 결과적으로 어떤 니모닉을 사용할 것인지) OperandSize가 아닌 AddressSize를 기반으로 합니다(OperandSize는 대신 점프 대상을 16비트로 잘라야 하는지 여부를 제어합니다)
    이는 루프 지침에도 적용됩니다.LOOP,LOOPE,LOOPNE(opcode)E0,E1,E2), 단, 과는JCX/JECXZ, 이러한 지침은 ECX 사용 변형에 대한 새로운 니모닉이 주어지지 않았습니다.
  7. ^ 위해서PUSHA(D), 스택에 푸시된 SP/ESP의 값은 바로 직전에 가지고 있던 값입니다.PUSHA(D)명령이 실행되기 시작했습니다.
  8. ^ 위해서POPA/POPAD, SP/ESP에 해당하는 스택 항목은 스택에서 팝업되지만(메모리 읽기 수행) SP/ESP에는 배치되지 않습니다.
  9. ^ PUSHFD그리고.POPFDIOPL이 3이 아닌 경우 가상 8086 모드에서 실행되는 경우 명령어는 #GP 예외를 발생시킵니다.
    PUSHF,POPF,IRET그리고.IRETDIOPL이 3이 아니고 VME가 활성화되지 않은 경우 Virtual-8086 모드에서 실행되면 지침에 따라 #GP 예외가 발생합니다.
  10. ^ 한다면IRETD커널 모드에서 사용자 모드(CPL 변경을 수반할 것)로 되돌리는 데 사용되며 SS에 의해 지시되는 사용자 모드 스택 세그먼트는 16비트 세그먼트입니다.IRETD명령어는 스택 포인터(ESP/RSP)의 낮은 16비트만 복원할 것이며, 남은 비트들은 커널 코드에 그들이 가지고 있던 값을 이전에 유지할 것입니다.IRETD. 이로 인해 Linux("ESPIX")[14]와 Windows 모두에서 복잡한 해결책이 필요하게 되었습니다.[15]이 문제는 이후 64비트에도 영향을 미칩니다.IRETQ설명.
80386: 새로운 opcode 도입
명령어 기억법 옵코드 묘사 울리다
BT r/m, r 0F A3 /r 비트 테스트.[a]

두 번째 피연산자는 테스트할 첫 번째 피연산자의 비트를 지정합니다.테스트할 비트가 EFLAGS.CF에 복사됩니다.

3
BT r/m, imm8 0F BA /4 ib
BTS r/m, r 0F AB /r 비트 테스트 앤 세트.[a][b]

두 번째 피연산자는 첫 번째 피연산자의 어떤 비트를 테스트하고 설정할지를 지정합니다.

BTS r/m, imm8 0F BA /5 ib
BTR r/m, r 0F B3 /r 비트 테스트 및 재설정.[a][b]

두 번째 피연산자는 첫 번째 피연산자의 어떤 비트를 테스트하고 지울지 지정합니다.

BTR r/m, imm8 0F BA /6 ib
BTC r/m, r 0F BB /r 비트 테스트 및 보완.[a][b]

두 번째 피연산자는 첫 번째 피연산자의 어떤 비트를 테스트하고 토글할지 지정합니다.

BTC r/m, imm8 0F BA /7 ib
BSF r, r/m NFx 0F BC /r[c] 앞으로 비트 스캔.가장 낮은 설정 비트 입력의 비트 인덱스를 반환합니다.[d] 3
BSR r, r/m NFx 0F BD /r[e] 비트 스캔 역방향.가장 높은 설정 비트 입력의 비트 인덱스를 반환합니다.[d]
SHLD r/m, r, imm8 0F A4 /r ib Shift Left Double.
의 운용.SHLD arg1,arg2,shamt다음과 같습니다.
arg1 := (arg1<<shamt) (arg2>>(operand_size - shamt))[f]
SHLD r/m, r, CL 0F A5 /r
SHRD r/m, r, imm8 0F AC /r ib 시프트 오른쪽 두 배.
의 운용.SHRD arg1,arg2,shamt다음과 같습니다.
arg1 := (arg1>>shamt) (arg2<<(operand_size - shamt))[f]
SHRD r/m, r, CL 0F AD /r
MOVZX reg, r/m8 0F B6 /r 8/16비트 소스에서 16/32비트 레지스터로 제로 확장으로 이동합니다. 3
MOVZX reg, r/m16 0F B7 /r
MOVSX reg, r/m8 0F BE /r 부호 확장 기능을 사용하여 8/16비트 소스에서 16/32/64비트 레지스터로 이동합니다.
MOVSX reg, r/m16 0F BF /r
SETcc r/m8 0F 9x /0[g][h] 조건이 충족되면 바이트를 1로 설정하고, 그렇지 않으면 0으로 설정합니다.
Jcc rel16
Jcc rel32
0F 8x cw
0F 8x cd[g]
조건부 점프 근접.

8비트 오프셋이 아닌 16/32비트 오프셋을 수용한다는 점에서 이전 조건부 점프 변형과는 다릅니다.

IMUL r, r/m 0F AF /r 2연산자 및 비폭 정수 곱하기.
FS: 64 FS 및 GS 세그먼트 레지스터의 세그먼트 재정의 접두사. 3
GS: 65
PUSH FS 0F A0 FS 및 GS 세그먼트 레지스터를 푸시/팝업합니다.
POP FS 0F A1
PUSH GS 0F A8
POP GS 0F A9
LFS r16, m16&16
LFS r32, m32&16
0F B4 /r 메모리에서 먼 포인터를 로드합니다.

오프셋 부분은 명령 니모닉에 표시된 대로 대상 레지스터 인수, 세그먼트 부분은 FS/GS/SS 세그먼트 레지스터에 저장됩니다.[i]

LGS r16, m16&16
LGS r32, m32&16
0F B5 /r
LSS r16, m16&16
LSS r32, m32&16
0F B2 /r
MOV reg,CRx 0F 20 /r[j] 제어 레지스터에서 일반 레지스터로 이동합니다.[k] 0
MOV CRx,reg 0F 22 /r[j] 일반 레지스터에서 제어 레지스터로 이동합니다.[k]

Pentium 이상의 프로세서에서는 다음으로 이동합니다.CR0,CR3그리고.CR4제어 레지스터가 직렬화되고 있습니다.[l]

MOV reg,DRx 0F 21 /r[j] x86 디버그 레지스터에서 일반 레지스터로 이동합니다.[k]
MOV DRx,reg 0F 23 /r[j] 일반 레지스터에서 x86 디버그 레지스터로 이동합니다.[k]

Pentium 이상의 프로세서에서는 DR0-DR7 디버그 레지스터로 이동이 직렬화되고 있습니다.

MOV reg,TRx 0F 24 /r[j] x86 테스트 레지스터에서 일반 레지스터로 이동합니다.[m]
MOV TRx,reg 0F 26 /r[j] 일반 레지스터에서 x86 테스트 레지스터로 이동합니다.[m]
ICEBP,
INT01,
INT1[n]
F1 회로에뮬레이션 중단점입니다.

회로 내 에뮬레이션을 사용하지 않을 때 실행되는 경우 소프트웨어 인터럽트 #1을 수행합니다.[o]

3
UMOV r/m, r8 0F 10/r User Move – In-circuit 에뮬레이션 HALT 모드에서 사용자 메모리에 액세스할 수 있는 데이터 이동을 수행합니다.

다음과 같은 작업을 수행합니다.MOV회로 내 에뮬레이션을 수행하지 않을 때 실행되는 경우.[p]

UMOV r/m, r16/32 0F 11/r
UMOV r8, r/m 0F 12/r
UMOV r16/32, r/m 0F 13/r
XBTS reg,r/m 0F A6/r 비트 필드 추출.[q][r]
IBTS r/m,reg 0F A7/r 비트 필드 삽입.[q][r]
모두 로드,
로드올386
[s]
0F 07 ES에서 시작하는 296바이트 데이터 구조에서 모든 CPU 레지스터 로드:세그먼트 기술자 레지스터의 "숨겨진" 부분을 포함하는 EDI. 0
  1. ^ a b c d 를 위해BT,BTS,BTR그리고.BTC지침:
    • 명령에 대한 첫 번째 인수가 레지스터 피연산자이고 두 번째 인수가 즉시인 경우 두 번째 인수의 비트 인덱스는 modulo 피연산자 크기(16/32/64, 사실상 인덱스의 하위 4, 5 또는 6비트만 사용)를 가져옵니다.
    • 첫 번째 인수가 메모리 피연산자이고 두 번째 인수가 레지스터 피연산자인 경우 두 번째 인수의 비트 인덱스가 모두 사용됩니다. 즉, 비트 테스트에 사용할 메모리 주소를 오프셋하는 데 사용되는 부호 비트 인덱스로 해석됩니다.
  2. ^ a b c BTS,BTC그리고.BTR명령은 수락합니다.LOCK(F0) 메모리 인수와 함께 사용할 경우 접두사 – 명령어가 원자적으로 실행됩니다.
  3. ^ 만약에F3prefix는 opcode와 함께 사용되며, 명령어는 다음과 같이 실행됩니다.TZCNTBMI1 확장을 지원하는 시스템에서.TZCNT다르다BSF그 점에서TZCNT그러나 그렇지는BSR소스 피연산자가 0일 경우 피연산자 크기를 반환하도록 정의됩니다. 다른 소스 피연산자 값의 경우 동일한 결과를 생성합니다.
  4. ^ a b BSF그리고.BSREFLAGS를 설정합니다.소스 인수가 all-0이면 ZF를 1로 플래그를 지정하고 그렇지 않으면 0으로 플래그를 지정합니다.
    source 인수가 all-0s인 경우 대상 레지스터는 AMD 프로세서에서는 변경되지 않은 상태로 유지되지만 Intel 프로세서에서는 정의되지 않은 값으로 설정된 것으로 문서화됩니다.
  5. ^ 만약에F3prefix는 opcode와 함께 사용되며, 명령어는 다음과 같이 실행됩니다.LZCNTABM 또는 LZCNT 확장을 지원하는 시스템에서 사용할 수 있습니다.LZCNT와 다른 결과를 가져옵니다.BSR대부분의 입력 값에 적용됩니다.
  6. ^ a b 위해서SHLD그리고.SHRD, 시프트 양은 마스킹됩니다. 하위 5비트는 16/32비트 피연산자 크기에 사용되고 6비트는 64비트 피연산자 크기에 사용됩니다.
    SHLD그리고.SHRD16비트 인수와 16보다 큰 시프트 양은 정의되지 않은 결과를 생성합니다. (실제 결과는 인텔 CPU마다 다르며, 적어도 세 가지 동작이 알려져 있습니다.)[16]
  7. ^ a b 지원되는 조건 코드는SETcc그리고.Jcc near명령어(opcode)0F 9x /0그리고.0F 8x조건을 지정하는 x 니블과 함께 각각 다음과 같습니다.
    x cc 상태(EFLAGS)
    0 O OF=1: "오버플로"
    1 아니요. OF=0: "오버플로 아님"
    2 C,B,NAE CF=1: "Carry", "Below", "Not Above or Equal"
    3 NC,NB,AE CF=0: "Not Carry", "Not Below", "Over or Equal"
    4 Z,E ZF=1: "Zero", "Equal"
    5 NZ,NE ZF=0: "0 아님", "동일하지 않음"
    6 NA,BE (CF=1 또는 ZF=1): "위에 없음", "아래 또는 같음"
    7 A,NBE (CF=0 및 ZF=0): "위", "아래 또는 같지 않음"
    8 S SF=1: "사인"
    9 NS SF=0: "Not Sign"
    A P,PE PF=1: "Parity", "Parity Even"
    B NP,PO PF=0: "패리티 아님", "패리티 홀수"
    C L,NGE SF ≠OF: "덜함", "더 크거나 같지 않음"
    D NL,GE SF=OF: "덜하지 않음", "더 크거나 같음"
    E LE,NG (ZF=1 또는 SF ≠OF): "적음 또는 같음", "크지 않음"
    F NLE,G (ZF=0 및 SF=OF): "덜하거나 같지 않음", "더 크다"
  8. ^ 위해서SETcc, opcode는 일반적으로 /0으로 지정되는데, 이는 명령의 ModR/M 바이트의 비트 5:3이 000이어야 함을 의미합니다. – 현대 x86 프로세서(펜티엄 이후)는 비트 5:3을 무시하고 명령을 다음과 같이 실행합니다.SETcc이 비트들의 내용에 관계없이.
  9. ^ 위해서LFS,LGS그리고.LSS, 파 포인터의 오프셋 부분의 크기는 피연산자 크기로 표시됩니다. 세그먼트 부분의 크기는 항상 16비트입니다.64비트 모드에서는REX.W이러한 지침을 포함한 접두사를 사용하면 인텔에서는 64비트 오프셋이 있는 먼 포인터를 로드하지만 AMD 프로세서에서는 로드할 수 없습니다.
  10. ^ a b c d e f 위해서MOV로/출발CRx,DRx그리고.TRx레지스터, ModR/M 바이트의 reg 부분은 다음을 나타내는 데 사용됩니다.CRx/DRx/TRx레지스터와 r/m은 일반 레지스터의 일부입니다.opcode의 경우 고유하게 ModR/M 바이트의 상위 두 비트가 무시됩니다. 이 opcode는 ModR/M 바이트의 상위 두 비트가 다음과 같이 디코딩되고 실행됩니다.11b.
  11. ^ a b c d 이동/이동의 경우CRx그리고.DRx레지스터, 피연산자 크기는 64비트 모드에서는 항상 64비트이고 그렇지 않으면 32비트입니다.
  12. ^ Pentium 이전 프로세서에서는 다음으로 이동합니다.CR0명령 스트림을 직렬화하지 않습니다. 이러한 이유로 인해 일반적으로 다음과 같은 즉시 멀리뛰기를 수행해야 합니다.MOV로.CR0그와 같은 경우에는MOV보호 모드 및/또는 메모리 페이징을 활성화/비활성화하는 데 사용됩니다.
    MOV로.CR2는 구조적으로 직렬화로 나열되어 있지만 적어도 일부 인텔 Core-i7 프로세서에서는 직렬화되지 않는 것으로 보고되었습니다.[17]
    MOV로.CR8(x86-64와 함께 도입됨)이(가) 직렬화되고 있지 않습니다.
  13. ^ a b MOV TRx명령은 펜티엄 이후부터 중단되었습니다.
  14. ^ INT1/ICEBP(F1) 지침은 80386 이후의 알려진 모든 Intel x86 프로세서에 있지만 Intel SDM(rev 067) 이후의 Intel 프로세서에 대해서만 완전히 문서화되었습니다.[18][19]이 릴리스 이전에는 Intel 자료에 대한 설명이 산발적으로 언급되었습니다(예: AP-526 rev001).[20]
    AMD 프로세서의 경우 2002년부터 지침이 문서화되어 있습니다.[21]
  15. ^ 의 작동.F1(ICEBP) opcode는 일반 소프트웨어 인터럽트 opcode와 몇 가지 점에서 다릅니다.
      보호 모드에서는 접근 권한 검사로 인터럽트 설명자의 DPL 필드에 대해 CPL을 검사합니다.F1하지 않을 것이다.
    • virtual-8086 모드에서는 액세스 권한 검사로 IOPL에 대한 CPL도 검사합니다.F1하지 않을 것이다.
    • VME를 사용하도록 설정된 virtual-8086 모드에서는 인터럽트 리디렉션이 지원되지만 다음에 대해서는 지원되지 않습니다.F1.
  16. ^ UMOV 명령은 386 및 486 프로세서에만 있습니다.[18]
  17. ^ a b XBTS그리고.IBTS명령은 80386의 B1 스텝핑과 함께 중단되었습니다.
    주로 80386의 버그[22] B0 스텝을 감지하기 위해 소프트웨어에 의해 사용되었습니다.Microsoft Windows(v2.01 이상)에서는XBTSCPU 검출의 일부로 명령을 실행하는 경우CPUID존재하지 않으며, 만약에 부팅을 위해 부팅을 거부할 것입니다.XBTS작동 중인 것으로 확인되었습니다.[23]
  18. ^ a b 위해서XBTS그리고.IBTS, r/m 인수는 비트 필드를 추출/삽입할 데이터, reg 인수는 삽입/추출할 비트 필드, AX/EAX는 비트 오프셋, CL은 비트 필드 길이를 나타냅니다.[24]
  19. ^ 미등록, 80386만.[25]

80486 추가

설명 옵코드 묘사 울리다
BSWAP r32 0F C8+r 바이트 순서 스왑.일반적으로 빅 엔디언 데이터 표현과 리틀 엔디언 데이터 표현 간의 변환에 사용됩니다.32비트 레지스터의 경우 수행되는 작업은 다음과 같습니다.
r = (r < 24) ((r < 8) & 0x00FF0000) ((r >> 8) & 0x0000FF00)(r >> 24);

사용.BSWAP16비트 레지스터 인수를 사용하면 정의되지 않은 결과가 생성됩니다.[a]

3
CMPXCHG r/m8,r8 0F B0 /r[b] 비교하고 교환합니다.누산기(AL/AX/EAX/RAX)가 첫 번째 피연산자와[c] 동일한 값을 비교할 경우EFLAGS.ZF를 1로 설정하고 첫 번째 피연산자를 두 번째 피연산자로 덮어씁니다.그렇지않으면,EFLAGS.ZF는 0으로 설정되며, 첫 번째 피연산자는 누산기에 복사됩니다.

명령 원자만 함께 사용되는 경우LOCK접두사를 붙입니다

CMPXCHG r/m,r16
CMPXCHG r/m,r32
0F B1 /r[b]
XADD r/m,r8 0F C0 /r eExchange and ADD.첫 번째 피연산자와 두 번째 피연산자를 교환한 다음 두 값의 합을 대상 피연산자에 저장합니다.

명령 원자만 함께 사용되는 경우LOCK접두사를 붙입니다

XADD r/m,r16
XADD r/m,r32
0F C1 /r
INVLPG m8 0F 01 /7 1바이트 메모리 피연산자에 사용할 TLB 항목을 무효화합니다.[d]

명령을 직렬화하고 있습니다.

0
INVD 0F 08 내부 캐시를 무효화했습니다.[e]캐시의 수정된 데이터는 메모리에 다시 기록되지 않으므로 데이터 손실이 발생할 수 있습니다.[f]
WBINVD NFx 0F 09[g] 캐시를 다시 쓰고 캐시를 무효화합니다.[e]프로세서의 내부 캐시에 있는 모든 수정된 캐시 라인을 기본 메모리에 다시 쓰고 내부 캐시를 무효화합니다.
  1. ^ 사용.BSWAP16비트 레지스터는 허용되지 않지만(#UD나 다른 예외를 생성하지 않고 실행) 정의되지 않은 결과를 생성하도록 문서화되어 있습니다(486, 586,[26] Box/QEMU에서 다양한 결과를 생성하는 것으로 보고됩니다).[27]
  2. ^ a b 인텔 80486 스텝 A에서,[28]CMPXCHG명령어는 다른 인코딩을 사용합니다 - 8비트 변형의 경우, 16/32비트 변형의 경우.인코딩은 80486 단계 B 이상에서 사용됩니다.[29][30]
  3. ^ CMPXCHG명령어 세트EFLAGS와 마찬가지로CMP첫 번째 인수와 같이 누적기(AL/AX/EAX/RAX)를 사용하는 명령.
  4. ^ INVLPGm8 인수가 올바르지 않은 경우(예: 매핑되지 않은 페이지 또는 canonical가 아닌 주소), no-operation으로 실행됩니다.
    INVLPG를 사용하여 개별 전역 페이지에 대한 TLB 항목을 무효화할 수 있습니다.
  5. ^ a b INVD그리고.WBINVD명령어는 CPU의 L1 캐시에 있는 모든 캐시 라인을 무효화합니다.L2/L3 캐시도 무효화할지 여부는 구현에 정의되어 있습니다.
    이 명령어는 직렬화되고 있습니다. 일부 프로세서에서는 완료될 때까지 인터럽트를 차단할 수도 있습니다.
  6. ^ PRM(Processor Reserved Memory)이 PRMR(PRM range registers)을 사용하여 설정된 경우INVD명령이 허용되지 않으므로 #GP(0) 예외가 발생합니다.(PRM은 Intel SGX에 필요합니다.)[31]
  7. ^ 만약에F3접두사는 다음과 함께 사용됩니다.0F 09opcode, 그러면 명령어는 다음과 같이 실행됩니다.WBNOINVDWBNOINVD 확장을 지원하는 프로세서에서는 캐시가 무효화되지 않습니다.

P5/P6급 프로세서에 추가됨

기본 80486 명령어 집합에는 존재하지 않지만 SSE가 도입되기 전에 다양한 x86 프로세서에 추가된 정수/시스템 명령어(단종 명령어는 포함되지 않음)

설명 옵코드 묘사 울리다 추가됨
RDMSR 0F 32 모델별 레지스터를 읽습니다.판독할 MSR은 ECX에 지정되어 있습니다.그러면 MSR의 값은 EDX에서 64비트 값으로 반환됩니다.EAX. 0 IBM 386SLC,[32]
인텔 펜티엄,
AMD K5,
Cyrix 6x86MX, MediaGXM,
IDT 윈칩 C6,
트란스메타 크루소
WRMSR 0F 30 모델별 레지스터를 작성합니다.기록할 MSR은 ECX에 지정되며, 기록할 데이터는 EDX에 제공됩니다.EAX.[a]

명령은 몇 가지 예외를 제외하고 직렬화하는 것입니다.[b]

RSM[34] 0F AA 시스템 관리 모드에서 다시 시작합니다.

명령을 직렬화하고 있습니다.

-2
(SMM)
인텔 386SL,[35] 486SL,[c]
인텔 펜티엄,
AMD 5x86,
사이릭스 486SLC/e,[36]
IDT 윈칩 C6,
트랜스메타 크루소,
상승 mP6
CPUID 0F A2 CPU 식별 및 기능 정보.EAX에서 CPUID 리프 인덱스를 입력으로 사용하고 리프에 따라 ECX에서 하위 인덱스를 사용합니다.결과는 EAX, EBX, ECX, EDX로 반환됩니다.[d]

명령이 직렬화되고 있으며 가상화 하에서 #VMEXIT 의무화를 야기합니다.

지원.CPUIDEFLAGS(EFLAGS)의 토글링 비트 21을 통해 확인할 수 있습니다.ID) – 이 비트를 토글할 수 있다면,CPUID존재합니다.

보통 3개[e] 인텔 펜티엄,[f]
AMD 5x86,[f]
싸이릭스 5x86,[g]
IDT 윈칩 C6,
트랜스메타 크루소,
mP6 상승,
넥스젠 Nx586,[h]
UMC 그린 CPU
CMPXCHG8B m64 0F C7 /1 8바이트를 비교하여 교환합니다.EDX 비교:EAX와 m64.동일한 경우 ZF를[i] 설정하고 ECX를 저장합니다.EBX를 m64로 변환합니다.그렇지 않으면 ZF를 지우고 m64를 EDX에 로드합니다.EAX.
명령 원자만 함께 사용되는 경우LOCK접두사를 [j]붙입니다
3 인텔 펜티엄,
AMD K5,
Cyrix 6x86L, MediaGXM,
IDT 윈칩 C6,[k]
트랜스메타 크루소,[k]
상승 mP6[k]
RDTSC 0F 31 64비트 타임 스탬프 카운터(TSC)를 EDX로 읽습니다.EAX.[l]

초기 프로세서에서 TSC는 각 클럭 주기마다 1씩 증가하는 사이클 카운터(실행 시간에 클럭 속도를 변경할 수 있는 프로세서에서 속도가 달라질 수 있음)였는데, 이후 프로세서에서는 CPU 클럭 속도와 일치하지 않는 고정 속도로 증가합니다.[m]

보통 3개[n] 인텔 펜티엄,
AMD K5,
Cyrix 6x86MX, MediaGXM,
IDT 윈칩 C6,
트랜스메타 크루소,
상승 mP6
RDPMC 0F 33 성능 모니터링 카운터를 읽습니다.판독할 카운터는 ECX에 의해 지정되며 값은 EDX로 반환됩니다.EAX.[l] 보통 3개[o] 인텔 펜티엄 MMX,
인텔 펜티엄 프로,
AMD K7,
Cyrix 6x86MX,
IDT 윈칩 C6,
비아 나노[p]
CMOVcc reg,r/m 0F 4x /r[q] 등록하려면 조건부 이동을(를)소스 피연산자는 레지스터 또는 메모리일 수 있습니다.[r] 3 인텔 펜티엄 프로,
AMD K7,
Cyrix 6x86MX, MediaGXM,
트랜스메타 크루소,
VIA C3 "네헤미아"
NOP r/m,
NOPL r/m
NFx 0F 1F /0 공식 롱 NOP.

AMD K7/K8 이외에는 2006년 이전에 출시된 비인텔 프로세서에서는 지원되지 않습니다.[s][49]

3 인텔 펜티엄 프로,[t]
AMD K7, x86-64[u]
UD2,[v]
UD2A[w]
0F 0B 정의되지 않은 명령 – 모든 작동 모드에서 잘못된 opcode(#UD) 예외가 발생합니다.

이러한 지침은 소프트웨어 테스트에서 유효하지 않은 opcode를 명시적으로 생성하기 위해 제공됩니다.이러한 지침에 대한 opcode는 이러한 목적을 위해 예약되어 있습니다.

(3) (80186),[x]
인텔 펜티엄[56]
UD1 reg,r/m,[y]
UD2B reg,r/m[w]
0F B9 /r[z]
OIO,
UD0,
UD0 reg,r/m[aa]
0F FF,
0F FF /r[z]
(80186),[x]
싸이릭스 6x86,[60]
AMD K5[62]
SYSCALL 0F 05 빠른 시스템 호출. 3 AMD K6,[ab]
x86-64[ac][광고]
SYSRET 0F 07[ae] 시스템 통화에서 빠른 복귀.함께 사용할 수 있도록 설계되었습니다.SYSCALL. 0[af]
SYSENTER 0F 34 빠른 시스템 호출. 3[af] 인텔 펜티엄 II,[ag]
AMD K7,[67][ah]
트랜스메타 크루소,[ai]
NatSemi Geode GX2,
VIA C3 "네헤미아"[aj]
SYSEXIT 0F 35[ae] 시스템 통화에서 빠른 복귀.함께 사용할 수 있도록 설계되었습니다.SYSENTER. 0[af]
  1. ^ Intel 및 AMD CPU의 경우WRMSR명령어는 또한 CPU 마이크로코드를 업데이트하는데 사용됩니다.MSR에 업로드할 새 마이크로코드의 가상 주소를 기록하면 됩니다.79h인텔 CPU 및 MSR에서C001_0020hAMD CPU에서.
  2. ^ 다음 MSR에 대한 쓰기는 직렬화되지 않습니다.[33]
    번호 이름.
    48h SPEC_CTRL
    49h PED_CMD
    122h TSX_CTRL
    6E0h TSC_DEADLINE
    6E1h PKRS
    774h HWP_REQUEST
    (FAST인 경우에만 직렬화되지 않음)IA32_ ­HWP_REQUEST 비트잇세트)
    802h로.83Fh (x2APIC MSR)
    C001_011Bh 초인종 레지스터(AMD)
  3. ^ 시스템 관리 모드RSM인텔 486은 1993년 인텔 펜티엄이 처음 출시된 후에야 SL이 아닌 버전에서 사용할 수 있었습니다.
  4. ^ 일부 이전 32비트 프로세서에서 실행CPUID리프 인덱스(EAX)가 0보다 크면 EBX 및 ECX가 수정되지 않은 상태로 남아 이전 값을 유지할 수 있습니다.따라서 실행하기 전에 EBX와 ECX를 제로 아웃하는 것이 좋습니다.CPUID.
    이러한 동작을 나타내는 것으로 주목되는 프로세서로는 Cyrix MII와[37] IDT WinChip 2가 있습니다.[38]

    64비트 모드에서는,CPUID는 RAX, RBX, RCX 및 RDX의 상위 32비트를 0으로 설정합니다.
  5. ^ Ivy Bridge에서 시작하는 일부 Intel 프로세서에는 제한을 위해 사용할 수 있는 MSR이 존재합니다.CPUID0을 울립니다.이러한 MSR은 적어도 Ivy Bridge와[39] Denverton에 대해서는 문서화되어 있습니다.[40]
    제한하는 능력CPUID링 0은 "CpuidUserDis" 기능(Zen 4 "Raphael" 이상)을 지원하는 AMD 프로세서에도 존재합니다.[41]
  6. ^ a b CPUID또한 인텔 펜티엄 최초 출시 이후 출시된 일부 인텔 및 AMD 486 프로세서 변종에서도 사용할 수 있습니다.
  7. ^ Cyrix 5x86 및 6x86 CPU의 경우,CPUID는 기본적으로 활성화되지 않으며 Cyrix 구성 레지스터를 통해 활성화해야 합니다.
  8. ^ NexGen CPU의 경우,CPUID일부 시스템 BIOS에서만 지원됩니다.를 지원하는 일부 NexGen CPU에서CPUID, EFLAGS.ID는 지원되지 않지만 EFLAGS입니다.AC는 CPU 검출을 복잡하게 만듭니다.[42]
  9. ^ 형들과는 다르게CMPXCHG수업, 그CMPXCHG8B명령어는 ZF 이외의 EFLAGS 비트를 수정하지 않습니다.
  10. ^ LOCK CMPXCHG8B 레지스터 피연산자(잘못된 인코딩)를 사용하면 일부 Intel Pentium CPU(Pentium F00F 버그)가 중단될 수 있습니다.
  11. ^ a b c IDT WinChip, Transmeta Crusoe 및 Rise mP6 프로세서에서CMPXCHG8B명령은 항상 지원되지만 해당 CPUID 비트가 누락될 수 있습니다.이것은 윈도우 NT의 버그에 대한 해결책입니다.[43]
  12. ^ a b RDTSC그리고.RDPMC명령어는 다른 명령어와 관련하여 명령되지 않으며, 이전 명령어가 실행되기 전에 또는 이후 명령어가 실행된 후에 각각의 카운터를 샘플링할 수 있습니다.호출RDPMC(그렇지는 않음)RDTSC)는 동일한 카운터의 읽기에 대해서도 서로 상대적으로 재정렬될 수 있습니다.
    그 밖의 지시에 관하여 명령을 부과하기 위하여,LFENCE또는 명령을 직렬화합니다(예:CPUID)가 필요합니다.[44]
  13. ^ 고정 비율 TSC는 다음 두 단계로 도입되었습니다.
    Constant TSC
    프로세서 코어가 딥 슬립(C2 이상) 모드에 있지 않고 CPU 코어 간에 동기화되지 않는 한 TSC가 고정 속도로 실행됩니다.Intel Prescott, Yonah and Bonnell에서 소개되었습니다.또한 모든 TransmetaVIA Nano[45] CPU에 존재합니다.CPUID 비트가 없습니다.
    Invariant TSC
    TSC는 고정된 속도로 실행되며, 모든 P-, C- T- 상태에서 CPU 코어 간에 동기화된 상태로 유지됩니다(하지만 반드시 S- 상태일 필요는 없음).
    AMD K10 이상, Intel Nehalem/Saltwell[46] 이상, Zhaoxin LuJiaZui[47].CPUID 비트(leaf)로 표시됨8000_0007:EDX[8]).
  14. ^ RDTSC다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0.
    인텔 펜티엄과 AMD K5에서,RDTSCVirtual-8086 모드에서는 실행할 수 없습니다.[48]이후 프로세서는 이 제한을 없앴습니다.
  15. ^ RDPMC다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.PCE=1.
  16. ^ RDPMCNano 이전의 VIA 프로세서에는 지침이 없습니다.
  17. ^ 지원되는 조건 코드는CMOVcc명령어(opcode)0F 4x /r, 조건을 지정하는 x 니블과 함께):
    x cc 상태(EFLAGS)
    0 O OF=1: "오버플로"
    1 아니요. OF=0: "오버플로 아님"
    2 C,B,NAE CF=1: "Carry", "Below", "Not Above or Equal"
    3 NC,NB,AE CF=0: "Not Carry", "Not Below", "Over or Equal"
    4 Z,E ZF=1: "Zero", "Equal"
    5 NZ,NE ZF=0: "0 아님", "동일하지 않음"
    6 NA,BE (CF=1 또는 ZF=1): "위에 없음", "아래 또는 같음"
    7 A,NBE (CF=0 및 ZF=0): "위", "아래 또는 같지 않음"
    8 S SF=1: "사인"
    9 NS SF=0: "Not Sign"
    A P,PE PF=1: "Parity", "Parity Even"
    B NP,PO PF=0: "패리티 아님", "패리티 홀수"
    C L,NGE SF ≠OF: "덜함", "더 크거나 같지 않음"
    D NL,GE SF=OF: "덜하지 않음", "더 크거나 같음"
    E LE,NG (ZF=1 또는 SF ≠OF): "적음 또는 같음", "크지 않음"
    F NLE,G (ZF=0 및 SF=OF): "덜하거나 같지 않음", "더 크다"
  18. ^ 64비트 모드에서는,CMOVcc32비트 피연산자 크기의 경우 조건이 거짓일지라도 대상 레지스터의 상위 32비트를 지웁니다.
    위해서CMOVcc메모리 소스 피연산자를 사용하면 CPU는 이동 조건이 충족되지 않더라도 항상 메모리에서 피연산자를 읽어와 메모리 예외 및 캐시 라인 채우기를 유발할 수 있습니다.(Intel APX 확장은 EVEX로 인코딩된 버전을 정의합니다.CMOVcc조건이 false일 경우 메모리 예외를 억제합니다.)
  19. ^ Pentium Pro에 추가된 다른 명령어와 달리 long NOP에는 CPUID 기능 비트가 없습니다.
  20. ^ 0F 1F /0Long-NOP는 펜티엄 프로에 도입되었지만 2006년까지 문서화되지 않았습니다.[50]전체 작전 코드 범위는NOP펜티엄 프로에서.단, 인텔은 다음을 제외하고는 이러한 옵코드가 그대로 유지된다는 것을 보장하지 않습니다.NOP미래의 프로세서에서, 그리고 적어도 일부 프로세서에서 이러한 옵코드 중 일부를 다른 명령어에 할당했습니다.[51]
  21. ^ 2002년부터 AMD x86-64용으로 문서화되었습니다.[52]
  22. ^ opcode는 펜티엄 이후부터 유효하지 않은 opcode로 공식적으로 예약되었지만, nemonic만 할당되었습니다.UD2펜티엄 프로 이후로.[53]
  23. ^ a b GNU Binutils는 다음을 사용합니다.UD2A그리고.UD2B버전 2.7 이후의 및 opcode에 대한 니모닉스.[54]
    둘 다 아니다.UD2A도 아니다UD2B원래는 모든 주장을 폈습니다.UD2B나중에 Binutils 버전 2.30에서 ModR/M 바이트를 허용하도록 수정되었습니다.[55]
  24. ^ a b UD0/1/2 opcode -, 및 -는 80186 이후의 모든 x86 프로세서(NEC V-Series 프로세서 제외)에서 #UD 예외를 발생시키지만 P5급 프로세서까지 이 목적으로 명시적으로 예약되지 않았습니다.
  25. ^ opcode는 펜티엄 이후부터 유효하지 않은 opcode로 공식적으로 예약되었지만, 그것은 단지 니모닉만 할당되었습니다.UD1훨씬 나중에 – AMD APM이 상장을 시작했습니다.UD1Rev 3.17 이후의 Opcode Map에서,[57] 인텔 SDM은 Rev 061 이후부터 그것을 목록화하기 시작했습니다.[58]
  26. ^ a b 및 opcode 모두에서, opcode가 ModR/M 바이트를 수용하는지 여부에 따라 상이한 x86 구현이 상이한 것으로 알려져 있습니다.[59]
  27. ^ opcode의 경우,OIO니모닉은 사이릭스에 의해 도입된 반면,[60]UD0menmonic은 (논쟁없이) AMD와 인텔에 의해 동시에 도입되었습니다.UD1에 대한 니모닉.[57][58] 나중에 인텔(AMD는 아님) 문서는 설명을 수정했습니다.UD0ModR/M 바이트를 추가하고 두 개의 인수를 수행합니다.[61]
  28. ^ K6에서.SYSCALL/SYSRET지침은 이전 모델 6이 아닌 모델 7(250nm "Little Foot") 이상에서 사용할 수 있었습니다.[63]
  29. ^ SYSCALL그리고.SYSRETx86-64의 필수 구성 요소가 되었습니다. 그 결과 AMD, Intel, VIA 및 Zhaoxin의 모든 x86-64 프로세서에서 64비트 모드로 명령어를 사용할 수 있게 되었습니다.
    64비트 모드 이외에서는 AMD 프로세서에서만 명령을 사용할 수 있습니다.
  30. ^ 의 정확한 의미론은SYSRETAMD 프로세서와 Intel 프로세서 간에 약간의 차이가 있습니다. 정규식이 아닌 반환 주소로 인해 AMD CPU에서는 #GP 예외가 Ring 3에서 발생하지만 Intel CPU에서는 Ring 0에서 발생합니다.이로 인해 보안 문제가 발생하는 것으로 알려져 있습니다.[64]
  31. ^ a b 를 위해SYSRET그리고.SYSEXITx86-64에 의거한 명령어들은 다음을 추가할 필요가 있습니다.REX.W64비트 사용자 모드 코드로 돌아가는 변형의 접두사.
    이 지침의 암호화는 다음과 같습니다.REX.W접두사는 32비트 사용자 모드 코드로 되돌리는 데 사용됩니다.(16비트 사용자 모드 코드로 되돌리는 데는 이 두 가지 지침을 모두 사용할 수 없습니다.)
  32. ^ a b c SYSRET,SYSENTER그리고.SYSEXITReal 모드에서는 명령을 사용할 수 없습니다. (SYSENTER가상 8086 모드에서 사용할 수 있습니다.)
  33. ^ CPUID지원을 나타내는 플래그SYSENTER/SYSEXIT프로세서가 공식적으로 이러한 지침을 지원하지 않음에도 불구하고 Pentium Pro에 설정되어 있습니다.[65]
    타사 테스트 결과, 펜티엄 프로에는 opcode가 있지만 버그가 너무 심하여 사용할 수 없음을 알 수 있습니다.[66]
  34. ^ AMD CPU의 경우SYSENTER그리고.SYSEXITx86-64 long mode(#UD)에서는 지침을 사용할 수 없습니다.
  35. ^ Transmeta CPU의 경우SYSENTER그리고.SYSEXIT지침은 Transmeta Code Morphing 소프트웨어 버전 4.2 이상에서만 사용할 수 있습니다.[68]
  36. ^ 느헤미아에 대하여,SYSENTER그리고.SYSEXIT는 8단계 이상에서만 사용할 수 있습니다.[69]

명령어 집합 확장으로 추가됨

x86-64에 추가됨

이러한 명령어는 64비트 모드에서만 인코딩할 수 있습니다.이들은 네 그룹으로 나뉩니다.

  • 기존의 opcode를 다른 용도로 재사용하는 오리지널 명령어 (MOVSXD교체하기ARPL)
  • 새로운 opcode가 포함된 원본 지침(SWAPGS)
  • 64비트 주소 크기로 확장된 기존 명령어(JRCXZ)
  • 64비트 피연산자 크기로 확장된 기존 명령어(remaining 명령어)

64비트 피연산자 크기의 대부분의 명령어는 이것을 인코딩합니다.REX.W접두사; 가 없는 경우REX.Wprefix, 32비트 피연산자 크기의 해당 명령어가 인코딩됩니다.이 메커니즘은 32비트 피연산자 크기의 다른 대부분의 명령에도 적용됩니다.64비트 피연산자 크기와 함께 사용할 경우 Intel 구문에서 새로운 니모닉을 얻지 못하기 때문에 여기에는 나열되지 않습니다.

설명 인코딩 의미.
CDQE REX.W 98 EAX를 RAX로 확장 서명
CQO REX.W 99 RDX에 RX 확장 서명:RAX
CMPSQ REX.W A7 CoMPare 문자열 쿼드워드
CMPXCHG16B m128[a][b] REX.W 0F C7 /1 CoMPare 및 eXChange 16바이트.
LOCK 접두사와 함께 사용되는 경우에만 원자성입니다.
IRETQ REX.W CF 인터럽트에서 64비트 리턴
JRCXZ rel8 E3 cb RCX가 0인 경우 점프
LODSQ REX.W AD LoaD 문자열 쿼드워드
MOVSXD r64,r/m32 REX.W 63 /r[c] 부호가 있는 MOV 32비트에서 64비트로 확장
MOVSQ REX.W A5 문자열 쿼드워드 이동
POPFQ 9D POP RFLAGS 레지스터
PUSHFQ 9C PUSH RFLAGS 레지스터
SCASQ REX.W AF SCAn 문자열 쿼드워드
STOSQ REX.W AB STORE 문자열 쿼드워드
SWAPGS 0F 01 F8 KernelGSBase MSR과 GSBase 교환
  1. ^ 메모리가 작동합니다.CMPXCHG16B정렬된 16바이트여야 합니다.
  2. ^ CMPXCHG16B초기 인텔/AMD x86-64 프로세서 중 일부에서는 명령이 없었습니다.인텔 프로세서에서는 제온 노코나(Xeon Nocona) 스텝 D에서 명령어가 누락되었지만 [70]스텝 E에서 추가되었습니다.[71]AMD K8 계열 프로세서에서는 DDR2 지원이 도입됨과 동시에 F 단계에서 추가되었습니다.[72]
    이런 이유로,CMPXCHG16B는 나머지 x86-64와는 별개로 자체 CPUID 플래그를 가지고 있습니다.
  3. ^ 암호화MOVSXD렉스 없이W 접두사는 허용되지만 사용하지[73] 않습니다. 이러한 인코딩은 16/32비트와 동일하게 동작합니다.MOV(8B /r).

비트 조작 확장자

비트 조작 지침.BMI1 및 BMI2에 의해 정의된 모든 VEX 인코딩 명령의 경우, 피연산자 크기는 VEX에 의해 제어되는 32비트 또는 64비트일 수 있습니다.W bit – 16비트 버전으로 제공되는 지침은 없습니다.

비트 조작 확장 설명
기억법
옵코드 지침설명 추가됨
ABM (LZCNT)[a]
고급 비트 조작
POPCNT r16,r/m16
POPCNT r32,r/m32
F3 0F B8 /r 인구 수.원본 인수에서 1로 설정된 비트 수를 카운트합니다. K10,
밥캣,
해스웰,
장장,
그레이스몬트
POPCNT r64,r/m64 F3 REX.W 0F B8 /r
LZCNT r16,r/m16
LZCNT r32,r/m32
F3 0F BD /r 선행 0을 카운트합니다.[b]
소스 피연산자가 all-0일 경우LZCNT는 피연산자 크기를 비트(16/32/64)로 반환하고 CF=1로 설정합니다.
LZCNT r64,r/m64 F3 REX.W 0F BD /r
BMI1
비트 조작 명령어 세트 1
TZCNT r16,r/m16
TZCNT r32,r/m32
F3 0F BC /r 후행 0 카운트.[c]
소스 피연산자가 all-0일 경우TZCNT는 피연산자 크기를 비트(16/32/64)로 반환하고 CF=1로 설정합니다.
해스웰,
쌓인 강,
재규어,
장장,
그레이스몬트
TZCNT r64,r/m64 F3 REX.W 0F BC /r
ANDN ra,rb,r/m VEX.LZ.0F38 F2 /r 비트 와이즈 앤 낫:ra = r/m AND NOT(rb)
BEXTR ra,r/m,rb VEX.LZ.0F38 F7 /r 비트 필드 추출.비트 필드 시작 위치는 [7:0]의 비트로 지정됩니다.rb, 비트 단위 길이[15:8]rb. 그런 다음 비트 필드를 추출합니다.r/m값을 영-extension로 설정한 다음 에 저장합니다.ra. 에[d] 상당함
마스크 = (1 < rb[15:8]) - 1 ra = (r/m >> rb[7:0]) 및 마스크
BLSI reg,r/m VEX.LZ.0F38 F3 /3 소스 인수에서 가장 낮은 설정 비트를 추출합니다.source 인수가 0이면 0을 반환합니다.에 상당함
dst = (-src) AND src
BLSMSK reg,r/m VEX.LZ.0F38 F3 /2 source 인수에서 1을 사용하여 가장 낮은 비트 위치까지 모든 1s 비트의 비트 마스크를 생성합니다.source 인수가 0인 경우 all-1s를 반환합니다.에 상당함
dst = (src-1) XOR src
BLSR reg,r/m VEX.LZ.0F38 F3 /1 source 인수의 모든 비트를 복사한 다음 가장 낮은 설정 비트를 지웁니다.에 상당함
dst = (src-1) AND src
BMI2
비트 조작 명령어 세트 2
BZHI ra,r/m,rb VEX.LZ.0F38 F5 /r 상위 비트를 제로 아웃(zero-out)하는 경우r/m에 지정된 비트 위치에서 시작합니다.rb, 그런 다음 결과를 에 씁니다.rd. 에 상당함
ra = r/m AND NOT(-1 << rb[7:0])
해스웰,
굴삭기,[e]
장장,
그레이스몬트
MULX ra,rb,r/m VEX.LZ.F2.0F38 F6 /r 확장 부호 없는 정수는 플래그를 설정하지 않고 곱합니다.EDX/RDX 곱하기r/m, 그런 다음 곱셈 결과의 낮은 절반을 저장합니다.ra그리고 높은 반은rb.한다면ra그리고.rb동일한 레지스터를 지정하고 결과의 높은 절반만 저장합니다.
PDEP ra,rb,r/m VEX.LZ.F2.0F38 F5 /r 병렬 비트 퇴적물.연속된 비트를 다음에서 분산합니다.rb에 설정된 비트 위치로r/m, 저장 결과는 다음과 같습니다.ra. 수행된 작업은 다음과 같습니다.
ra=0; k=0; mask=r/m for i=0 to opsize-1인 경우 (mask[i] == 1) ra[i]= rb[k]; k=k+1인 경우
PEXT ra,rb,r/m VEX.LZ.F3.0F38 F5 /r 병렬 비트 추출.사용하다r/m비트를 선택하기 위한 비트 마스크로서의 인수rb, 그런 다음 선택한 비트를 연속 비트 vector로 압축합니다.수행된 작업은 다음과 같습니다.
ra=0; k=0; mask=r/m for i=0 to opsize-1인 경우 (mask[i] == 1) ra[k]= rb[i]; k=k+1인 경우
RORX reg,r/m,imm8 VEX.LZ.F2.0F3A F0 /r ib 플래그에 영향을 주지 않고 바로 오른쪽으로 회전합니다.
SARX ra,r/m,rb VEX.LZ.F3.0F38 F7 /r 플래그를 업데이트하지 않고 산술 시프트 오른쪽.
위해서SARX,SHRX그리고.SHLX, 에 규정된 시프트량rb32비트 피연산자 크기의 경우 5비트로 마스킹되고 64비트 피연산자 크기의 경우 6비트로 마스킹됩니다.
SHRX ra,r/m,rb VEX.LZ.F2.0F38 F7 /r 플래그를 업데이트하지 않고 오른쪽으로 논리 이동.
SHLX ra,r/m,rb VEX.LZ.66.0F38 F7 /r 플래그를 업데이트하지 않고 왼쪽으로 이동합니다.
  1. ^ AMD CPU에서 "ABM" 확장은 두 가지를 모두 제공합니다.POPCNT그리고.LZCNT. 그러나 Intel CPU의 경우 "ABM"에 대한 CPUID 비트는 다음의 존재를 나타내도록 문서화되어 있을 뿐입니다.LZCNT"LZCNT"로 나열되는 반면,POPCNT는 자체 CPUID 기능 비트를 가지고 있습니다.
    그러나 "ABM"/"LZCNT" 확장을 구현하는 알려진 모든 프로세서는 또한POPCNT그리고 POPCNT의 CPUID 피쳐 비트를 설정하므로 구분은 이론적으로만 가능합니다.
    (그 반대는 사실이 아닙니다. 를 지원하는 프로세서가 있습니다.POPCNTIntel NehalemVIA Nano 3000과 같은 ABM은 아닙니다.)
  2. ^ LZCNT명령은 다음과 같이 실행됩니다.BSRLZCNT 또는 ABM 확장을 지원하지 않는 시스템의 경우.BSR소스 피연산자에서 가장 높은 설정 비트의 인덱스를 계산하여 다음과 다른 결과를 생성합니다.LZCNT대부분의 입력 값에 적용됩니다.
  3. ^ TZCNT명령은 다음과 같이 실행됩니다.BSFBMI1 확장을 지원하지 않는 시스템에서.BSF다음과 같은 결과를 가져옵니다.TZCNT0을 제외한 모든 입력 피연산자 값 - 에 대해TZCNT입력 피연산자 크기를 반환하지만BSF는 정의되지 않은 동작을 생성합니다(대부분의 최신 CPU에서 대상을 수정하지 않은 상태로 유지).
  4. ^ 위해서BEXTR, 시작 위치와 길이는 마스킹되지 않으며 0 ~ 255의 값을 취할 수 있습니다.선택한 비트가 끝을 넘어 확장되는 경우r/m인수(일반적인 32/64비트 피연산자 크기)를 사용하면 초과 비트가 0으로 읽힙니다.
  5. ^ 젠 3 이전의 AMD 프로세서에서는PEXT그리고.PDEP명령어는 상당히 느리고[74] 마이크로코딩된 구현(마스크 인수에서 설정된 비트 수에 따라 약 18 ~ 300 사이클)을 사용하기 때문에 데이터에 의존하는 타이밍을 나타냅니다.따라서 이러한 프로세서에서 다른 명령어 시퀀스를 사용하는 것이 더 빠른 경우가 많습니다.[75][76]

Intel TSX 추가

TSX 부분 집합 설명 옵코드 묘사 추가됨
RTM
제한된 트랜잭션 메모리
XBEGIN rel16
XBEGIN rel32
C7 F8 cw
C7 F8 cd
거래를시작합니다.트랜잭션이 실패할 경우 지정된 상대 오프셋으로 분기를 수행합니다. 해스웰
(10세대(Ice Lake, Comet Lake) 이후부터는 데스크톱/노트북 CPU에서 사용하지 않지만 Xeon 브랜드 서버 부품(예: Ice Lake-SP, Sapphire Rapids)에서 계속 사용 가능)
XABORT imm8 C6 F8 ib 오류 코드로 즉시 8비트로 트랜잭션을 중단합니다.
XEND NP 0F 01 D5 거래종료.
XTEST NP 0F 01 D6 트랜잭션 실행 중인지 테스트합니다.놓다EFLAGS.ZF트랜잭션(RTM 또는 HLE) 내부에서 실행되면 0으로, 그렇지 않으면 1로 설정합니다.
HLE
하드웨어 잠금 엘리전
XACQUIRE F2 하드웨어 잠금 해제의 시작을 나타내는 명령 접두사, 메모리 원자 명령에만 사용(다른 명령의 경우,F2prefix는 다른 의미를 가질 수 있습니다.이러한 지침과 함께 사용하면 메모리 원자 작동 대신 트랜잭션을 시작할 수 있습니다. 해스웰
(단종 – HLE를 지원하는 마지막 프로세서는 Coffee LakeCascade Lake)
XRELEASE F3 하드웨어 잠금 해제의 종료를 나타내는 명령 접두사, 메모리 원자/저장 명령에만 사용(다른 명령의 경우에는F3prefix는 다른 의미를 가질 수 있습니다.하드웨어 잠금 해제 중에 이러한 지침과 함께 사용하면 저장/원자를 수행하는 대신 관련 트랜잭션을 종료합니다.
TSXLDTRK
로드 주소 추적 일시 중단/재개
XSUSLDTRK F2 0F 01 E8 추적 로드 주소 일시 중지 사파이어 래피즈
XRESLDTRK F2 0F 01 E9 로드 주소 추적 재개

Intel CET 추가

Intel CET(Control-Flow Enforcement Technology)는 반환 지향 프로그래밍(CET_SS)과 간접 분기 추적(CET_IBT)과 같은 보안 공격으로부터 보호하는 데 도움이 되는 두 가지 기능을 추가했습니다.

CET 부분 집합 설명 옵코드 묘사 울리다 추가됨
CET_SS
그림자 스택.
섀도 스택을 활성화하면 함수 호출 시 일반 스택과 섀도 스택 모두에서 반환 주소가 푸시됩니다.그러면 함수 호출에서 반환될 때 둘 다 팝업됩니다. 일치하지 않으면 스택이 손상된 것으로 간주되고 #CP 예외가 발생합니다.
섀도 스택은 일반적인 메모리 저장 지침으로는 수정할 수 없는 특수 표시된 메모리 페이지에 저장해야 합니다.
INCSSPD r32 F3 0F AE /5 그림자 스택 포인터 증가 3 타이거 레이크,
선3
INCSSPQ r64 F3 REX.W 0F AE /5
RDSSPD r32 F3 0F 1E /1 섀도 스택 포인터를 레지스터로 읽습니다(낮은 32비트).[a]
RDSSPQ r64 F3 REX.W 0F 1E /1 섀도 스택 포인터를 레지스터로 읽습니다(전체 64비트)[a]
SAVEPREVSSP F3 0F 01 EA 이전 섀도 스택 포인터 저장
RSTORSSP m64 F3 0F 01 /5 저장된 섀도 스택 포인터 복원
WRSSD m32,r32 NP 0F 38 F6 /r 섀도 스택에 4바이트 쓰기
WRSSQ m64,r64 NP REX.W 0F 38 F6 /r 섀도 스택에 8바이트 쓰기
WRUSSD m32,r32 66 0F 38 F5 /r 사용자 섀도 스택에 4바이트 쓰기 0
WRUSSQ m64,r64 66 REX.W 0F 38 F5 /r 사용자 섀도 스택에 8바이트 쓰기
SETSSBSY F3 0F 01 E8 섀도 스택을 사용 중으로 표시
CLRSSBSY m64 F3 0F AE /6 섀도 스택 사용 중 플래그 지우기
CET_IBT
간접 분기 추적입니다.
IBT가 활성화된 경우, 명령이 아닌 명령으로 간접 분기(점프, 호출, 반환)ENDBR32/64명령을 실행하면 #CP 예외가 발생합니다.
ENDBR32 F3 0F 1E FB 32비트 모드에서[b] 간접 분기 종료 3 타이거 레이크
ENDBR64 F3 0F 1E FA 64비트 모드에서[b] 간접 분기 종료
NOTRACK 3E[c] 간접과 함께 사용되는 접두사CALL/JMPnear 명령(opcodes 및 )을 사용하여 분기 대상이 시작할 필요가 없음을 나타내는ENDBR32/64설명.NO_TRACK_EN 플래그가 설정된 경우에만 프리픽스가 지정됩니다.
  1. ^ a b RDSSPD그리고.RDSSPQ명령어는 그림자 스택이 비활성화되거나 CET가 지원되지 않는 프로세서에서 NOP로 작동합니다.
  2. ^ a b ENDBR32그리고.ENDBR64CET를 지원하지 않는 프로세서에서 NOP 역할 수행_IBT 또는 IBT가 비활성화된 경우.
  3. ^ 이 접두사는 DS: 세그먼트 재정의 접두사와 동일한 인코딩을 갖습니다. 2022년 4월 현재 인텔 문서에는 이 접두사가 노트랙 접두사로 사용될 때 이전 세그먼트 재정의 기능을 유지하는지 여부를 명시하지 않은 것으로 보이며, 이 접두사에 대한 공식적인 기억법도 제공하지 않습니다.[77][78] (GNU binutils는 "nottrack"을 사용합니다.)[79]

다른 공급업체 간 확장 기능 추가

명령어 집합 확장 설명
기억법
옵코드 지침설명 울리다 추가됨
SSE[a]
(비 SIMD)
PREFETCHNTA m8 0F 18 /0 Non-Temporal Access(비-Temporal Access)를 사용하여 사전 검색합니다.
데이터가 한 번만 사용된다는 가정하에 데이터를 사전에 페치하고 해당 데이터에서 발생하는 캐시 오염을 최소화합니다.캐시 오염을 최소화하기 위해 사용되는 방법은 구현에 의존적입니다.[b]
3 펜티엄 3세
(K7),[a]
(Geode GX2),[a]
느헤미야,
에피슨
PREFETCHT0 m8 0F 18 /1 캐시 계층의 모든 계층으로 데이터를 미리 불러옵니다.[b]
PREFETCHT1 m8 0F 18 /2 데이터를 L1 캐시를 제외한 모든 캐시 계층으로 미리 페치합니다.[b]
PREFETCHT2 m8 0F 18 /3 데이터를 L1 및 L2 캐시를 제외한 모든 캐시 계층 레벨로 미리 페치합니다.[b]
SFENCE NP 0F AE F8+x[c] 펜스 저장.[d]
SSE2
(비 SIMD)
LFENCE NP 0F AE E8+x[c] 펜스와 디스패치 시리얼라이제이션.[e] 3 펜티엄 4,
K8,
이피슨,
C7 에스더
MFENCE NP 0F AE F0+x[c] 메모리 펜스.[f]
MOVNTI m32,r32
MOVNTI m64,r64
NP 0F C3 /r
NP REX.W 0F C3 /r
Non-Temporal 메모리 저장소.
PAUSE F3 90[g] CPU 스레드를 짧은 시간 동안 일시 중지합니다.[h]
스핀락에 사용하도록 설계되었습니다.[i]
CLFSH[j]
캐시 라인 플러시.
CLFLUSH m8 NP 0F AE /7 하나의 캐시 라인을 메모리에 플러시합니다.
여러 의 캐시 계층 레벨 및/또는 각각 고유한 캐시를 가진 여러 개의 프로세서를 가진 시스템에서는 라인이 모두 플러시됩니다.
3 (SSE2),
지오데 LX
MONITOR[k]
메모리 쓰기를 위해 메모리 위치를 모니터링합니다.
MONITOR[l]
MONITOR EAX,ECX,EDX
NP 0F 01 C8 메모리 쓰기를 위해 메모리 위치 모니터링을 시작합니다.모니터링할 메모리 주소는 DS:AX/EAX/RAX가 지정합니다.[m]
ECX와 EDX는 각각 추가 확장 플래그와 힌트 플래그를 위해 예약됩니다.[n]
보통[o] 0 프레스콧,
요나,
보넬,
K10,
나노
MWAIT[l]
MWAIT EAX,ECX
NP 0F 01 C9 이전에 지정한 모니터링된 메모리 위치에 쓰기를 기다립니다.MONITOR.[p]
ECX와 EAX는 각각 추가 확장[q] 플래그와 힌트[r] 플래그를 제공하는 데 사용됩니다.MWAIT힌트는 CPU 전원 관리에 일반적으로 사용됩니다.
SMX
안전 모드 확장.
Intel Trusted Execution Technology의 일부로 디지털 서명된 "Authenticated Code Module"을 로드, 인증 및 실행합니다.
GETSEC NP 0F 37 SMX 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[s] 0 콘로/메롬,
우다오커우,[90]
트레몽
XSAVE
프로세서 확장 상태 저장/복원.
XSAVE mem
XSAVE64 mem
NP 0F AE /4
NP REX.W 0F AE /4
EDX에서 지정한 상태 구성 요소 저장:EAX를 메모리에 연결합니다. 3 펜린,[t]
불도저,
재규어,
골드몬트,
장장
XRSTOR mem
XRSTOR64 mem
NP 0F AE /5
NP REX.W 0F AE /5
EDX에서 지정한 상태 구성 요소 복원:메모리의 EAX.
XGETBV NP 0F 01 D0 확장 제어 레지스터 값을 가져옵니다.
ECX에서 지정한 XCR을 EDX로 읽습니다.EAX.[u]
XSETBV NP 0F 01 D1 확장 제어 레지스터를 설정합니다.
EDX에 값 기록:ECX에서 지정한 XCR에 EAX를 적용합니다.
0
RDTSCP
타임 스탬프 카운터와 프로세서 ID를 읽습니다.
RDTSCP 0F 01 F9 타임 스탬프 카운터와 프로세서 코어 ID를 읽습니다.[v]
TSC 값은 EDX에 배치됩니다.EAX와 ECX의 핵심 ID.[w]
보통 3개[x] K8,[y]
네할렘,
실버몬트,
나노
POPCNT[z]
인구 수.
POPCNT r16,r/m16
POPCNT r32,r/m32
F3 0F B8 /r source 인수에서 1로 설정된 비트 수를 계산합니다. 3 K10,
네할렘,
나노3000
POPCNT r64,r/m64 F3 REX.W 0F B8 /r
SSE4.2
(비 SIMD)
CRC32 r32,r/m8 F2 0F 38 F0 /r CRC-32C(Castagnoli) 다항식 0x11을 사용하여 CRC 값 누적EDC6F41(정상 형태 0x1EDC6F41).iSCSI에서 사용되는 다항식입니다.이더넷에서 사용되는 일반적인 패리티와는 달리 패리티는 짝수이며 따라서 홀수 개의 변경된 비트로 오류를 탐지할 수 있습니다. 3 네할렘,
불도저,
장장
CRC32 r32,r/m16
CRC32 r32,r/m32
F2 0F 38 F1 /r
CRC32 r64,r/m64 F2 REX.W 0F 38 F1 /r
XSAVEOPT
프로세서 확장 상태 저장/복원 최적화
XSAVEOPT mem
XSAVEOPT64 mem
NP 0F AE /6
NP REX.W 0F AE /6
EDX에서 지정한 상태 구성 요소 저장:EAX를 메모리에 연결합니다.
형들과는 다르게XSAVE설명,XSAVEOPTCPU가 가장 최근 대응하는 이후로 변경되지 않았다고 판단할 수 있을 때 프로세서 상태 항목을 메모리에 쓰는 것을 자제할 수 있습니다.XRSTOR.
3 샌디브릿지,
스팀롤러,
퓨마,
골드몬트,
장장
FSGSBASE
사용자 모드에서 FS 및 GS 세그먼트의 기본 주소를 읽고 씁니다.
64비트 모드에서만 사용할 수 있습니다.
RDFSBASE r32
RDFSBASE r64
F3 0F AE /0
F3 REX.W 0F AE /0
FS: 세그먼트의 기본 주소를 읽습니다. 3 아이비 브릿지,
스팀롤러,
골드몬트,
장장
RDGSBASE r32
RDGSBASE r64
F3 0F AE /1
F3 REX.W 0F AE /1
GS: 세그먼트의 기본 주소를 읽습니다.
WRFSBASE r32
WRFSBASE r64
F3 0F AE /2
F3 REX.W 0F AE /2
FS: 세그먼트의 기본 주소 쓰기.
WRGSBASE r32
WRGSBASE r64
F3 0F AE /3
F3 REX.W 0F AE /3
GS: segment의 write base address.
MOVBE
바이트 순서 스왑으로 메모리로 이동/이동합니다.
MOVBE r16,m16
MOVBE r32,m32
NFx 0F 38 F0 /r 메모리에서 바이트 순서 스왑으로 등록하기 위해 로드합니다. 3 보넬,
해스웰,
재규어,
스팀롤러,
장장
MOVBE r64,m64 NFx REX.W 0F 38 F0 /r
MOVBE m16,r16
MOVBE m32,r32
NFx 0F 38 F1 /r 바이트 순서 스왑으로 레지스터의 메모리에 저장합니다.
MOVBE m64,r64 NFx REX.W 0F 38 F1 /r
INVPCID
프로세스 컨텍스트 식별자에 의해 TLB 항목을 무효화합니다.
INVPCID reg,m128 66 0F 38 82 /r m128의[aa] 레지스터 및 디스크립터의 무효화 유형에 따라 TLB 및 페이징 구조 캐시의 항목을 무효화합니다.디스크립터에는 메모리 주소와 PCID가 포함되어 있습니다.[ab]

AMD에서 명령이 직렬화되고 있지만 Intel CPU는 그렇지 않습니다.

0 해스웰,
장장,
3번 선,
그레이스몬트
PREFETCHW[ac]
쓰기 작업이 포함된 캐시 라인 프리페치입니다.
PREFETCHW m8 0F 0D /1 쓸 캐시 라인을 미리 페치합니다.[b] 3 K6-2,
(세더밀),[ad]
실버몬트,
브로드웰,
장장
PREFETCH m8[ae] 0F 0D /0 캐시 라인을 미리 페치합니다.[b]
ADX
향상된 애드 위드 캐리 변형.
ADCX r32,r/m32
ADCX r64,r/m64
66 0F 38 F6 /r
66 REX.W 0F 38 F6 /r
휴대용 추가.오래된 것과 다른 점ADC이외의 깃발을 남긴다는 점에서 지시.EFLAGS.CF불변의 3 브로드웰,
젠1,
장장,
그레이스몬트
ADOX r32,r/m32
ADOX r64,r/m64
F3 0F 38 F6 /r
F3 REX.W 0F 38 F6 /r
오버플로 플래그가 있는 휴대용 추가 기능EFLAGS.OF다른 플래그는 변경되지 않은 채로 운반 입력 및 출력 역할을 합니다.
SMAP
슈퍼바이저 모드 액세스 방지.
용도 변경:EFLAGS.AC(alignment check) 플래그는 링 0, 1 또는 2에 있는 동안 사용자 모드 메모리에 대한 액세스를 금지하는 플래그입니다.
CLAC NP 0F 01 CA 분명한EFLAGS.AC. 0 브로드웰,
골드몬트,
젠1,
루자쭈이[af]
STAC NP 0F 01 CB 세트EFLAGS.AC.
CLFLUSHOPT
캐시 라인 플러시 최적화.
CLFLUSHOPT m8 NFx 66 0F AE /7 캐시 라인을 플러시합니다.
오래된 것과 다른 점CLFLUSH메모리 저장소 및 기타 캐시 라인 플러시와 관련하여 보다 완화된 주문 규칙을 가지고 있어 성능을 향상시킬 수 있습니다.
3 스카이레이크,
골드몬트,
젠1
XSAVEC
프로세서 확장 상태 압축을 사용하여 저장/복원합니다.
XSAVEC mem
XSAVEC64 mem
NP 0F C7 /4
NP REX.W 0F C7 /4
EDX에서 지정한 프로세서 확장 상태 구성 요소 저장:EAX를 압축을 사용하여 메모리에 연결합니다. 3 스카이레이크,
골드몬트,
젠1
XSS
프로세서 확장 상태 슈퍼바이저 상태를 포함하여 저장/복원합니다.
XSAVES mem
XSAVES64 mem
NP 0F C7 /5
NP REX.W 0F C7 /5
EDX에서 지정한 프로세서 확장 상태 구성 요소 저장:가능한 경우 압축 및 최적화를 통해 메모리에 EAX. 0 스카이레이크,
골드몬트,
젠1
XRSTORS mem
XRSTORS64 mem
NP 0F C7 /3
NP REX.W 0F C7 /3
EDX에서 지정한 상태 구성 요소 복원:메모리의 EAX.
PREFETCHWT1
쓰기 의도를 가지고 L2 캐시에 캐시 라인 프리페치.
PREFETCHWT1 m8 0F 0D /2 T1 로컬리티 힌트(L2 캐시로 가져오기, L1 캐시는 제외)와 쓰기 의도 힌트로 데이터를 미리 페치합니다.[b] 3 나이트 랜딩,
용펑
PKU
사용자 페이지의 보호 키.
RDPKRU NP 0F 01 EE 사용자 페이지 키 등록기를 EAX로 읽습니다. 3 스카이레이크-X,
혜성 호수,
그레이스몬트,
3번 선,
루자쭈이[af]
WRPKRU NP 0F 01 EF EAX의 데이터를 User Page Key Register에 기록하고 Memory Fence를 수행합니다.
CLWB
캐시 라인 메모리에 다시 쓰기.
CLWB m8 NFx 66 0F AE /6 캐시 라인을 무효화하지 않고 캐시 라인 하나를 메모리에 다시 씁니다. 3 스카이레이크-X,
젠2,
타이거 레이크,
트레몽
RDPID
프로세서 코어 ID를 읽습니다.
RDPID r32 F3 0F C7 /7 프로세서 코어 ID를 레지스터로 읽습니다.[v] 3[ag] 골드몬트 플러스,
젠2,
얼음 호수,
루자쭈이[af]
WBNOINVD
유효하지 않은 전체 캐시 쓰기백입니다.
WBNOINVD F3 0F 09 모든 더러운 캐시 라인을 무효화하지 않고 메모리에 다시 씁니다.[ah]명령을 직렬화하고 있습니다. 0 젠2,
아이스레이크-SP
  1. ^ a b c Athlon XP 이전의 AMD Athlon 프로세서는 전체 SSE를 지원하지 않았지만, "MMX Extensions"의 일부로 SSE의 비 SIMD 명령을 도입했습니다.[80]전체 SSE가 없는 이러한 확장 기능은 Geode GX2 이상의 Geode 프로세서에도 있습니다.
  2. ^ a b c d e f g 모두PREFETCH*명령어는 프로그램 의미론이 아닌 성능에만 영향을 미치는 힌트 명령어입니다.잘못된 주소(예: 매핑되지 않은 페이지의 주소 또는 정규식이 아닌 주소)를 제공하면 명령이 생성된 예외 없이 NOP 역할을 수행하게 됩니다.
  3. ^ a b c 를 위해SFENCE,LFENCE그리고.MFENCE명령어, ModR/M 바이트의 하위 3비트는 무시되며, 0.7 범위의 x 값은 유효한 명령어가 됩니다.
  4. ^ SFENCE명령어는 모든 메모리가 다음에 저장되도록 보장합니다.SFENCE명령어는 모든 메모리 저장 후에 전세계적으로 관찰 가능하게 됩니다.SFENCE. 이것은 WC(Write-Combining) 메모리 영역에 대한 비일시적 스토어 및 스토어와 같이 다른 방식으로 다시 주문할 수 있는 스토어에 대한 주문을 부과합니다.[81]
    Intel CPU뿐만 아니라 Zen1 이후의 AMD CPU(이전 AMD CPU는 아님)의 경우,SFENCE또한 캐시 플러시/쓰기백의 순서 변경 장벽으로 작용합니다.CLFLUSH,CLFLUSHOPT그리고.CLWB지시사항(이전 AMD CPU는MFENCE주문하다CLFLUSH.)
    SFENCE에 대해 명령되지 않았습니다.LFENCE, 그리고 또SFENCE+LFENCE시퀀스가 충분하지 않아 로드가 이전 스토어를 지나 다시 정렬되는 것을 방지할 수 없습니다.[82]이러한 순서 변경을 방지하기 위해서는 다음과 같은 작업을 수행해야 합니다.MFENCE,LOCK또는 직렬화 명령어를 사용할 수도 있습니다.
  5. ^ LFENCE명령어는 모든 메모리가 다음에 로드되도록 보장합니다.LFENCE명령어는 모든 메모리 로드 후에 전세계적으로 관찰 가능하게 됩니다.LFENCE.
    SSE2를 지원하는 모든 Intel CPU에서LFENCE명령어는 더 강력한 주문 보증을 제공합니다. 그것은 디스패치 serial라이징입니다. 즉, 명령 후에 명령을 의미합니다.LFENCE명령은 모든 명령이 종료되기 전에만 실행을 시작할 수 있습니다(이전의 모든 로드가 완료되었지만 반드시 저장이 완료된 것은 아님).파견-직렬화의 효과는LFENCE는 또한 성능 카운터와 같은 비메모리 리소스에 대한 액세스를 위한 추측 장벽 및 순서 변경 장벽으로 작용합니다(예를 들어, accessed ~ ).RDTSC아니면RDPMC) 및 x2apic MSR.
    AMD CPU의 경우,LFENCE기본적으로 dispatch-serializing은 아니지만 모든 형태의 non-dispatch-serializing을 지원하는 모든 AMD CPU에서LFENCE, MSR의 bit 1을 설정하여 dispatch-serializing 할 수 있습니다.C001_1029.[84]
  6. ^ MFENCE명령어는 모든 메모리 로드, 저장 및 캐시라인 플러시를 보장합니다.MFENCE명령어는 모든 메모리 로드, 저장 및 캐시라인 플러시 후에 전세계적으로 관찰 가능합니다.MFENCE.
    인텔 CPU의 경우,MFENCE는 dispatch-serializing이 아니므로 성능 카운터 및 x2apic MSR과 같은 비메모리 리소스에 대한 액세스 시 순서 지정을 강제하는 데 사용할 수 없습니다.MFENCE에 관해서는 여전히 명령이 내려져 있습니다.LFENCE, 만약 디스패치 시리얼라이제이션과 함께 메모리 장벽이 필요하다면, 그것은 발행함으로써 얻어질 수 있습니다.MFENCE뒤를 이어LFENCE.[44]
    AMD CPU의 경우,MFENCE연재 중입니다.
  7. ^ 의 작동.PAUSE64비트 모드에서의 명령은 다음과 같습니다.NOP, 의 존재에 영향을 받지 않는REX.R접두사를 붙입니다둘 다 아니다.NOP도 아니다PAUSE다른 비트의 영향을 받습니다.REX접두사를 붙입니다opcode의 몇 가지 예9064비트 모드의 다양한 접두사는 다음과 같습니다.
    • 90NOP
    • 41 90XCHG R8D,EAX
    • 4E 90NOP
    • 49 90XCHG R8,RAX
    • F3 90PAUSE
    • F3 41 90PAUSE
    • F3 4F 90PAUSE
  8. ^ 에 의해 수행된 일시 중지의 실제 길이PAUSE명령은 구현에 의존적입니다.
    SSE2가 없는 시스템에서는PAUSENOP로 실행됩니다.
  9. ^ VT-x 또는 AMD-V 가상화 하에서 실행PAUSE짧은 시간 간격으로 여러 번 #VMEXIT가 발생할 수 있습니다.개수PAUSE#VMEXIT를 트리거할 수 있는 실행 및 간격 길이는 플랫폼별로 다릅니다.
  10. ^ 그 동안에CLFLUSH명령어는 SSE2와 함께 도입되었으며 자체 CPUID 플래그가 있으며 SSE2를 구현하지 않는 프로세서에 존재하거나 SSE2를 구현하지 않는 프로세서에 존재할 수 있습니다(예: AMD Geode LX 지원).CLFLUSHSSE2는 아닙니다.)
  11. ^ 그 동안에MONITOR그리고.MWAITSSE3와 동시에 도입된 지침으로 SSE3 CPUID 플래그와 별도로 확인해야 하는 자체 CPUID 플래그가 있습니다(예: Athlon64 X2 및 VIA C7은 SSE3를 지원하지만 MONITOR는 지원하지 않음).
  12. ^ a b 를 위해MONITOR그리고.MWAIT명령어, 구 인텔 문서[85] 목록 명시적 피연산자가 있는 명령어 니모닉(MONITOR EAX,ECX,EDX그리고.MWAIT EAX,ECX), 최신 문서에서는 이러한 피연산자를 생략합니다.조립자/분해자는 이 두 가지 변형을 모두 지원할 수 있습니다.[86]
  13. ^ 위해서MONITOR, DS: 세그먼트는 세그먼트 접두사로 재정의할 수 있습니다.
    모니터링할 메모리 영역은 DS:rAX에서 지정한 단일 바이트뿐만 아니라 바이트를 포함하는 선형 메모리 영역이 됩니다. 이 메모리 영역의 크기와 정렬은 구현에 따라 다르며 CPUID를 통해 쿼리할 수 있습니다.
    모니터링할 메모리 위치에 메모리 유형 WB(write-back cacheable)가 있어야 합니다. 그렇지 않으면 모니터링이 실패할 수 있습니다.
  14. ^ 2023년 3월 현재, 확장이나 힌트는 정의되지 않았습니다.MONITOR설명.따라서 명령어는 ECX=0을 필요로 하며 EDX를 무시합니다.
  15. ^ Intel Xeon Phix200[87] 및 AMD K10[88] 이상과 같은 일부 프로세서에는 다음을 지원하는 데 사용할 수 있는 문서화된 MSR이 있습니다.MONITOR그리고.MWAIT3번 링에서 뛰게 될 겁니다
  16. ^ 수행된 대기 시간MWAIT메모리 쓰기 이외의 시스템 이벤트(예: 캐시라인 퇴거, 인터럽트)에 의해 종료될 수 있습니다. 종료 대기를 유발할 수 있는 정확한 이벤트 집합은 구현에 따라 다릅니다.
    메모리 쓰기 또는 다른 이벤트로 인해 대기가 종료되었는지 여부에 관계없이 모니터링이 종료되고 다음을 사용하여 다시 모니터링을 설정해야 합니다.MONITOR더 이상 공연하기 전에MWAITs.
  17. ^ 에 사용 가능한 확장 플래그MWAITECX 레지스터에는 다음이 있습니다.
    비트 MWAIT 확장자
    0 EFLAGS(EFLAGS)를 마스킹한 경우에도 인터럽트를 중단 이벤트로 처리합니다.IF=0). (NetBurst가 아닌 모든 구현에서 사용 가능)MWAIT.)
    1 Timed MWAIT: TSC가 EDX의 값에 도달하거나 초과하면 대기를 종료합니다.EBX. (Intel Skylake 이후의 Intel 프로세서에 문서화되지 않은 것으로 알려짐)[89]
    31:2 사용하지 않습니다. 0으로 설정해야 합니다.
  18. ^ 에 사용할 수 있는 힌트 플래그MWAITEAX 레지스터에는 다음이 있습니다.
    비트 MWAIT 힌트
    3:0 C 상태 내의 하위 상태(비트 7:4 참조)(Intel 프로세서만 해당)
    7:4 대기 중 대상 CPU 전원 C-상태 - 1(예: C1,0001b의 경우 C2, 1111b의 경우 C0)
    31:8 사용하지 않음.

    C-상태는 프로세서 고유의 전력 상태이며, ACPI C-상태와 반드시 1:1로 일치하지는 않습니다.

  19. ^ 다음에 대해 정의된 리프 함수GETSEC(EAX에 의해 선택됨)은 다음과 같습니다.
    EAX 기능.
    0(기능) SMX 기능 보고
    2 (ENTERACCES) 인증코드모듈실행입력
    3(EXITAC) 인증된 코드 모듈 실행 종료
    4(SENTER) 측정환경입력
    5(섹트) 측정환경종료
    6(파라미터) SMX 매개변수 보고
    7(SMTRL) SMX 모드 제어
    8(웨이크업) 측정된 환경에서 취침 프로세서 깨우기

    EAX에서 지원되지 않는 값은 #UD 예외를 발생시킵니다.

  20. ^ XSAVE는 Penryn의 스텝 E0/R0에 추가되었으며 이전 스텝에서는 사용할 수 없습니다.
  21. ^ 일부 프로세서(Skylake, GoldmontZen 1부터 시작)에서 실행XGETBVECX=1 사용이 허용됩니다. 이 경우에는 반환되지 않습니다.XCR1(해당 레지스터가 없습니다) 대신 반환XCR0"XINUSE" 상태 구성 요소 비트맵(초기 상태가 아닌 XSAVE 상태 구성 요소의 비트맵)의 현재 값으로 bitwise-ANDED.
    이러한 기능의 존재는XGETBVCPUID로 표시됩니다. (EAX=0Dh,ECX=1):EAX[비트 2].
  22. ^ a b 에서 읽은 "core ID" 값RDTSCP그리고.RDPID사실은.TSC_AUXMSR (MSR)C000_0103h). 이 값이 실제로 프로세서 ID에 해당하는지 여부는 운영체제 관례의 문제입니다.
  23. ^ 형들과는 다르게RDTSC설명,RDTSCP는 이전의 모든 명령이 폐기될 때까지 TSC 읽기를 지연시켜 이전의 메모리 로드(저장은 제외)에 대한 순서를 보장합니다.RDTSCP그러나 후속 지침과 관련하여 명령되지 않습니다.
  24. ^ RDTSCP다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0.
  25. ^ 지원.RDTSCPAMD K8의 스텝 F에서 추가되었으며 이전 스텝에서는 사용할 수 없습니다.
  26. ^ 그 동안에POPCNTSSE 4.2와 동시에 도입된 명령어는 SSE 4.2의 일부가 아니라 자체 CPUID 플래그가 있는 별도의 확장으로 간주됩니다.
    AMD 프로세서에서는 ABM 확장의 일부로 간주되지만 자체 CPUID 플래그가 있습니다.
  27. ^ 다음에 대해 정의된 무효화 유형INVPCID(register 인수에 의해 선택됨)은 다음과 같습니다.
    가치 기능.
    0 설명자의 PCID 및 가상 메모리 주소와 일치하는 TLB 항목을 무효화(글로벌 항목 제외)
    1 전역 항목을 제외하고 디스크립터의 PCID와 일치하는 TLB 항목을 무효화합니다.
    2 전역 항목을 포함한 모든 TLB 항목을 무효화합니다.
    3 글로벌 항목을 제외한 모든 TLB 항목을 무효화합니다.

    register 인수에서 지원되지 않는 값은 #GP 예외를 발생시킵니다.

  28. ^ 형들과는 다르게INVLPG설명,INVPCID제공된 메모리 주소가 정규식이 아닌 경우에는 #GP 예외가 발생합니다.이러한 불일치로 인해 보안 문제가 발생하는 것으로 알려져 있습니다.[91]
  29. ^ PREFETCH그리고.PREFETCHW명령은 3DNow! 명령 집합 확장의 필수 부분이지만 3DNow를 지원하지 않는 시스템에서는 독립 실행형 확장으로도 사용할 수 있습니다.
  30. ^ 에 대한 opcode.PREFETCH그리고.PREFETCHW(0F 0D /rCedar Mill(65nm Pentium 4) 이후부터 Intel CPU에서 NOP로 실행됩니다.PREFETCHWBroadwell 이후부터 프리페치 기능을 이용할 수 있습니다.
  31. ^ PREFETCH()0F 0D /0 명령어는 3DNow! 명령어로, 3DNow!가 있는 모든 프로세서에 존재하지만 반드시 PREFETCHW 확장자가 있는 프로세서에는 존재하지 않습니다.
    PREFETCHW가 있는 AMD CPU에서는 opcode뿐만 아니라 opcode도 모두 prefetch를 수행하는 것으로 문서화되어 있습니다.
    PREFETCHW를 사용하는 Intel 프로세서에서 이러한 opcode는 예약된 NOP를[92] 수행하는 것으로 문서화됩니다(Xeon Phi에만 해당됨). 제3자 테스트[93] 결과, 이러한 opcode 중 일부 또는 전부가 적어도 일부 Intel Core CPU에서 프리페치를 수행하는 것으로 나타났습니다.
  32. ^ a b c SMAP, PKU 및 RDPID 명령어 세트 확장은 Zhaoxin LuJiaZui의 2단계[94] 이상에서는 지원되지만 이전 단계에서는 지원되지 않습니다.
  33. ^ 형들과는 다르게RDTSCP프로세서 ID, 사용자 모드를 읽기 위해 사용할 수도 있는 명령어RDPID다음에 의해 비활성화되지 않습니다.CR4.TSD=1.
  34. ^ WBNOINVD명령은 다음과 같이 실행됩니다.WBINVDWBNOINVD 확장을 지원하지 않는 시스템에서 실행되는 경우.
    WBINVD다르다WBNOINVD그 점에서WBINVD쓰기백 후 모든 캐시 라인이 무효화됩니다.

기타 Intel 특정 확장 기능 추가

명령어 집합 확장 설명
기억법
옵코드 지침설명 울리다 추가됨
SGX
소프트웨어 가드 확장.
손상되거나 악의적인 호스트가 검사하거나 조작할 수 없는 코드를 게스트가 실행할 수 있는 암호화된 엔클레이브를 설정합니다.
ENCLS NP 0F 01 CF SGX Supervisor 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[a] 0
SGX1
스카이레이크,[b]
골드몬트 플러스
SGX2
골드몬트 플러스,
아이스레이크-SP[98]
OVERSUB[95]
아이스 레이크-SP,
트레몽
ENCLU NP 0F 01 D7 SGX User 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[c] 3[d]
ENCLV NP 0F 01 C0 SGX 가상화 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[e] 0[f]
PTWRITE
프로세서 추적 패킷에 데이터 쓰기.
PTWRITE r/m32
PTWRITE r/m64
F3 0F AE /4
F3 REX.W 0F AE /4
레지스터 또는 메모리에서 데이터를 읽어 PTW 패킷으로 인코딩합니다.[g] 3 케이비 레이크,
골드몬트 플러스
MOVDIRI
Direct Store(직접 저장)로 메모리로 이동합니다.
MOVDIRI m32,r32
MOVDIRI m64,r64
NP 0F 38 F9 /r
NP REX.W 0F 38 F9 /r
Direct Store(캐시되지 않거나 다른 스토어와 쓰기 결합되지 않은 메모리 스토어)를 사용하여 메모리에 저장합니다. 3 타이거 레이크,
트레몽
MOVDIR64B
64바이트를 Direct Store로 이동합니다.
MOVDIR64B reg,m512 66 0F 38 F8 /r 64바이트의 데이터를 m512에서 ES:reg에서 지정한 주소로 이동합니다.64바이트 쓰기는 Direct Store를 통해 원자적으로 수행됩니다.[h] 3 타이거 레이크,
트레몽
PCONFIG
TME-MK("Total Memory Encryption – Multi-Key") 및 TSE("Total Storage Encryption")를 포함한 플랫폼 구성.
PCONFIG NP 0F 01 C5 플랫폼 피쳐 구성 기능을 수행합니다.수행할[i] 기능은 EAX에 명시되어 있습니다 - 기능에 따라 RBX, RCX 및 RDX는 추가 입력 정보를 제공할 수 있습니다.

명령어가 실패하면 EFLAGS를 설정합니다.ZF=1이며 EAX의 오류 코드를 반환합니다.성공하면 EFLAGS를 설정합니다.ZF=0 및 EAX=0.

0 아이스레이크-SP
CLDEMOTE
캐시 라인 강등 힌트.
CLDEMOTE m8 NP 0F 1C /0 m8이 포함된 캐시 라인을 CPU L1 캐시에서 캐시 계층의 더 먼 수준으로 이동합니다.[j] 3 (트레몽),
(올더 호수),
사파이어 래피즈[k]
WAITPKG
사용자 모드 메모리 모니터링 및 대기.
UMONITOR r16/32/64 F3 0F AE /6 메모리 쓰기를 위해 메모리 위치 모니터링을 시작합니다.모니터링할 메모리 주소는 register 인수로 지정됩니다.[l] 3 트레몬트,
올더 호
UMWAIT r32
UMWAIT r32,EDX,EAX
F2 0F AE /6 이전에 지정한 모니터링된 메모리 위치에 대한 쓰기 대기 시간UMONITOR. 메모리 쓰기가 없을 경우 TSC가 EDX에서 지정한 값에 도달하면 대기가 종료됩니다.EAX 또는 대기가 OS에서 제어하는 최대 시간 동안 계속되고 있습니다.[m] 보통 3개[n]
TPAUSE r32
TPAUSE r32,EDX,EAX
66 0F AE /6 Time Stamp Counter가 EDX에 지정된 값에 도달할 때까지 기다립니다.EAX.
명령어에 대한 register 인수는 명령어의 동작을 제어하기 위한 추가 플래그를 지정합니다.
SERIALIZE
명령어 실행 직렬화.
SERIALIZE NP 0F 01 E8 명령어 가져오기 및 실행을 직렬화합니다.[o] 3 올더 호
HRESET
프로세서 기록 재설정.
HRESET imm8 F3 0F 3A F0 C0 ib 프로세서가 하드웨어 유지 관리 예측 기록의 선택된 구성 요소를 재설정하도록 요청합니다.CPU 예측 이력의 구성 요소를 리셋할 비트맵이 EAX에 지정됩니다(imm8 인수는 무시됨).[p] 0 올더 호
UINTR
사용자 인터프로세서 인터럽트입니다.
64비트 모드에서만 사용할 수 있습니다.
SENDUIPI reg F3 0F C7 /6 프로세서 간 사용자 인터럽트를 보냅니다.[q] 3 사파이어 래피즈
UIRET F3 0F 01 EC 사용자 인터럽트 반환.
TESTUI F3 0F 01 ED 사용자 인터럽트 플래그를 테스트합니다.
UIF를 EFLAGS.CF에 복사합니다.
CLUI F3 0F 01 EE 사용자 인터럽트 플래그를 지웁니다.
STUI F3 0F 01 EF 사용자 인터럽트 플래그를 설정합니다.
ENQCMD
상점 대기열입니다.
ENQCMD r32/64,m512 F2 0F 38 F8 /r 대기열 명령입니다.메모리에서 64바이트 "명령 데이터" 구조를 읽고(m512 인수), 메모리 매핑된 Enqueue Store 장치에 원자적으로 씁니다(register 인수는 ES 세그먼트를 사용하고 64바이트 정렬이 필요한 이 장치의 메모리 주소를 제공합니다).장치가 명령을 수락했음을 나타내도록 ZF=0을 설정하거나, 명령을 수락하지 않았음을 나타내도록 ZF=1을 설정합니다(예: 대기열이 가득 찼거나 메모리 위치가 Enqueue Store 장치가 아님). 3 사파이어 래피즈
ENQCMDS r32/64,m512 F3 0F 38 F8 /r 대기열 명령 감독관입니다.다르다ENQCMD임의의 PASID(프로세스 주소 공간 식별자)와 권한 비트를 "명령 데이터"에 입력하여 대기열에 넣을 수 있습니다. 0
  1. ^ 다음에 대해 정의된 리프 함수ENCLS(EAX에 의해 선택됨)은 다음과 같습니다.
    EAX 기능.
    0(생성) 엔클레이브 만들기
    1 (EADD) 페이지 추가
    2 (EINIT) 엔클레이브 초기화
    3(탈거) EPC(페이지 캐시 포함)에서 페이지 제거
    4(EDBGRD) 디버거로 데이터 읽기
    5(EDBGWR) 디버거로 데이터 쓰기
    6(EEXTEND) EPC 페이지 측정 확장
    7(ELDB) EPC 페이지를 차단된 상태로 로드
    8(ELDU) EPC 페이지를 차단 해제됨으로 로드
    9(EBLOCK) EPC 페이지 차단
    A (EPA) 버전 배열 추가
    B (EWB) EPC 페이지 쓰기/잘못됨
    C(ETRACK) EBLOCK 검사 활성화
    SGX2 추가
    DAUG (EAUG) 초기화된 엔클레이브에 페이지 추가
    E (EMODPTR) EPC 페이지 권한 제한
    F(EMODT) EPC 페이지 유형 변경
    OVERSUB[95] 추가
    10 (ERDINFO) EPC 페이지 유형/상태 정보 읽기
    11 (ETRACKC) EBLOCK 검사 활성화
    12 (ELDBC) EPC 페이지를 향상된 오류 보고와 함께 차단된 것으로 로드
    13 (ELDUC) EPC 페이지를 차단 해제된 상태로 로드(향상된 오류 보고)
    다른.
    18 (EUP DATESVN) 라이브 마이크로코드 업데이트[96] 후 SVN(보안 버전 번호) 업데이트

    EAX에서 지원되지 않는 값은 #GP 예외를 발생시킵니다.

  2. ^ SGX는 11세대(Rocket Lake, Tiger Lake) 이후부터는 데스크톱/노트북 프로세서에서 더 이상 사용되지 않지만 Xeon 브랜드 서버 부품에서는 계속 사용할 수 있습니다.[97]
  3. ^ 다음에 대해 정의된 리프 함수ENCLU(EAX에 의해 선택됨)은 다음과 같습니다.
    EAX 기능.
    0 (EREPORT) 암호화 보고서 만들기
    1(EGETKEY) 암호화 키 만들기
    2 (ENTER) 엔클레이브 입력
    3(ESUME) 엔클레이브 재진입
    4(EEXIT) 엔클레이브 종료
    SGX2 추가
    5 (EACCEPT) EPC 페이지의 변경사항 수락
    6(EMODPE) EPC 페이지 권한 확장
    7 (EACCEPCOPY) 보류 중인 페이지 초기화
    TDX[99] 추가
    8 (에버리파이 리포트2) 신뢰 도메인의 암호화 보고서 확인
    AEX-Notify와 함께 추가됨
    9(EDECSSA) 감소 TCS.CSSA

    EAX에서 지원되지 않는 값은 #GP 예외를 발생시킵니다.
    EENTER 및 ERESUME 기능은 SGX 엔클레이브 내에서 실행할 수 없으며, 다른 기능은 엔클레이브 내에서만 실행할 수 있습니다.

  4. ^ ENCLU링 0/1/2이 아닌 링 3에서만 실행할 수 있습니다.
  5. ^ 다음에 대해 정의된 리프 함수ENCLV(EAX에 의해 선택됨)은 다음과 같습니다.
    EAX 기능.
    OVERSUB[95] 추가
    0(EDECVIRT 차일드) SECS의 감소 VIRCHILDCNT
    1(EINCVIRTHILD) SECS에서 VIRCHILDCNT 증가
    2 (ESETCONTEXT) SECS에서 ENCLAVECONTEXT 필드 설정

    EAX에서 지원되지 않는 값은 #GP 예외를 발생시킵니다.
    ENCLV지침은 EPC Oversubscription Extensions to SGX("OVERSUB")를 지원하는 시스템에서만 제공됩니다.

  6. ^ ENCLVIntel VMX 작업을 사용하도록 설정한 경우에만 사용할 수 있습니다.VMXON, 그렇지 않으면 #UD를 생성할 것입니다.
  7. ^ 위해서PTWRITE, 프로세서 트레이스 패킷에 대한 쓰기는 활성화 비트 집합("TriggerEn", "ContextEn", "FilterEn" 비트)의 경우에만 수행됩니다.RTIT_STATUSMSR 및 "PTWEn" 비트RTIT_CTLMSR)은 모두 1로 설정됩니다.
    PTWRITE66h 명령 접두사를 사용하는 경우, 다른 접두사에 관계없이 #UD 예외를 발생시키도록 SDM에 명령이 표시됩니다.
  8. ^ 위해서MOVDIR64, ES:reg에서 지정한 대상 주소는 64바이트 정렬되어야 합니다.
    register 인수의 피연산자 크기는 주소 크기에 의해 지정되며, 이는 에 의해 재정의될 수 있습니다.67h접두사를 붙입니다
    64바이트 메모리 소스 인수는 64바이트를 정렬할 필요가 없으며, 원자적으로 읽을 수 있는 것도 보장되지 않습니다.
  9. ^ 다음에 대해 정의된 리프 함수PCONFIG(EAX에 의해 선택됨)은 다음과 같습니다.
    EAX 기능.
    0 MKTME_KEY_PROGRAM:
    TME-MK Key ID와 함께 사용할 프로그램 키 및 암호화 모드입니다.
    TSE 추가
    1 TSE_KEY_PROGRAM:
    TSE를 위한 직접 키 프로그래밍.
    2 TSE_KEY_PROGRAM_Wrapped:
    TSE용 랩핑 키 프로그래밍.

    EAX에서 지원되지 않는 값은 #GP(0) 예외를 발생시킵니다.

  10. ^ 위해서CLDEMOTE, 캐시 라인을 강등할 캐시 레벨은 구현에 따라 달라집니다.
    명령어는 힌트로 간주되기 때문에 제공된 메모리 주소가 올바르지 않거나 L1 캐시에 없는 경우에는 예외 없이 NOP로 실행됩니다.또한 구현에 의존하는 다른 상황에서도 NOP로 실행될 수 있습니다.
    CLDMOTE 확장을 지원하지 않는 시스템에서는 NOP로 실행됩니다.
  11. ^ 인텔 문서에는 CLDMOTE가 도입된 프로세서로 트레몬트(Tremont)와 올더(Alder) 호수(Lake)가 나와 있습니다.그러나 2022년 5월 현재 CLDMOTE에 대한 CPUID 피쳐 비트가 설정된 트레몬트 또는 앨더 레이크 모델은 관찰되지 않았으며, 그 중 일부 모델은 CPUID 비트가 삭제되었습니다.[100]
    2023년 4월 현재 CLDMOTE의 CPUID 피쳐 비트는 사파이어 래피드에 설정된 것으로 확인되었습니다.[101]
  12. ^ 위해서UMONITOR, 주소 인수의 피연산자 크기는 주소 크기에 의해 주어지는데, 이것은 에 의해 무시될 수 있습니다.67h접두사를 붙입니다사용되는 기본 세그먼트는 DS:이며, 세그먼트 접두사로 재정의할 수 있습니다.
  13. ^ 위해서UMWAIT, 운영 체제는 사용할 수 있습니다.IA32_UMWAIT_CONTROLMSR을 사용하여 단일 시스템의 최대 시간을 제한합니다.UMWAIT호출은 기다리는 것이 허용됩니다.UMWAIT명령어가 설정됩니다.RFLAGS.CF그것이 1에 도달합니다.IA32_UMWAIT_CONTROL- 시간 제한을 정의하고 그렇지 않으면 0으로 설정합니다.
  14. ^ TPAUSE그리고.UMWAIT다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0.
  15. ^ 시리얼라이제이션은 예를 들어 이전의 명령으로 수행할 수 있습니다.CPUID그리고.IRET, 이러한 명령어는 추가적인 기능을 수행하여 독립 실행형 명령어 직렬화가 필요한 경우 측면의 effects 및 성능 저하를 초래합니다. (CPUID또한 가상화 환경에서 실행할 때 필수 #VMEXIT(VMEXIT)가 발생하여 오버헤드가 매우 크다는 문제점이 있습니다.SERIALIZE명령어는 직렬화만 수행하므로 추가 비용을 피할 수 있습니다.
  16. ^ 를 통해 재설정할 수 있는 CPU 기록 구성 요소 비트맵HRESETCPUID에서 제공합니다. (EAX=20h,ECX=0):EBX.
    2023년 7월 기준으로 정의된 비트는 다음과 같습니다.
    조금 사용.
    0 인텔 스레드 디렉터 히스토리
    31:1 (예약)
  17. ^ register 인수 대상SENDUIPI는 UITT(User-Interrupt Target Table)에서 항목을 선택하기 위한 인덱스로, 새 테이블에 의해 지정됩니다.UINTR_TT그리고.UINT_MISC MSRs.)

다른 AMD별 확장 기능 추가

명령어 집합 확장 설명
기억법
옵코드 지침설명 울리다 추가됨
AltMovCr8
CR8 제어 레지스터에 액세스하는 대체 메커니즘입니다.[a]
MOV reg,CR8 F0 0F 20 /0[b] CR8 레지스터를 읽습니다. 0 K8[c]
MOV CR8,reg F0 0F 22 /0[b] CR8 레지스터에 기록합니다.
MONITORX
사용자 모드에서 쓰기를 위해 메모리 위치를 모니터링합니다.
MONITORX NP 0F 01 FA 메모리 쓰기를 위해 메모리 위치 모니터링을 시작합니다.오래된 것과 유사함MONITOR, 사용자 모드에서 사용할 수 있는 경우를 제외합니다. 3 굴삭기
MWAITX NP 0F 01 FB 이전에 지정한 모니터링된 메모리 위치에 쓰기를 기다립니다.MONITORX.
MWAITX형들과 다른MWAIT주로 사용자 모드에서 실행되며 EBX(ECX의 비트[1]를 1로 설정하여 활성화됨)에서 선택적 타임아웃 인수(TSC 시간 단위로 제공됨)를 허용할 수 있다는 점에서 명령어.
CLZERO
캐시 라인 전체를 제로 아웃합니다.
CLZERO rAX NP 0F 01 FC CPU 캐시 라인의 크기와 정렬이 있고 DS:rAX로 지정된 바이트를 포함하는 메모리 영역의 모든 바이트에 0을 기록합니다.[d] 3 젠1
RDPRU
사용자 모드에서 프로세서 레지스터를 읽습니다.
RDPRU NP 0F 01 FD 사용자 모드에서 선택한 MSR(주로 성능 카운터)을 읽습니다.ECX는 읽을 레지스터를 지정합니다.[e]

MSR의 값은 EDX로 반환됩니다.EAX.

보통 3개[f] 선2
MCOMMIT
저장소를 메모리에 커밋합니다.
MCOMMIT F3 0F 01 FA 스레드의 모든 이전 저장소가 메모리에 커밋되었는지, 이러한 저장소에서 발생한 오류가 관련 오류 로깅 리소스에 시그널링되었는지 확인합니다.보고할 수 있는 오류 집합과 로깅 메커니즘은 플랫폼별로 다릅니다.
놓다EFLAGS.CF오류가 발생하면 0으로, 발생하지 않으면 1로 바꿉니다.
3 선2
INVLPGB
브로드캐스트가 있는 TLB 항목을 무효화합니다.
INVLPGB NP 0F 01 FE 브로드캐스트가 있는 페이지 범위에 대해 TLB 항목을 무효화합니다.무효화는 명령을 실행하는 프로세서에서 수행되며 시스템의 다른 모든 프로세서로 브로드캐스트됩니다.
rAX는 가상 주소를 무효화하고 일부 추가 플래그를 사용하며 ECX는 무효화할 페이지 수를 사용하며 EDX는 TLB 무효화를 수행할 ASID 및 PCID를 지정합니다.
0 선3
TLBSYNC NP 0F 01 FF TLB 무효화를 동기화합니다.
의 이전 호출에 의해 모든 TLB 무효화가 신호화될 때까지 기다립니다.INVLPGB동일한 논리 프로세서에 대한 명령은 시스템의 모든 프로세서에 의해 응답되었습니다.명령을 직렬화하고 있습니다.
  1. ^ CR8 레지스터에 액세스하는 표준 방법은 다음을 사용하는 인코딩을 사용하는 것입니다.REX.R접두사().MOV RDI,CR8하지만, 그REX.R접두사는 64비트 모드에서만 사용할 수 있습니다.
    AltMovCr8 확장은 CR8에 액세스하기 위한 추가적인 방법을 추가합니다.F0(LOCK) 대신 접두사REX.R– 이를 통해 CR8 외부 64비트 모드에 액세스할 수 있습니다.
  2. ^ a b CRx 레지스터에 연결/연결되는 MOV의 다른 변형과 마찬가지로 AltMovCr8 인코딩은 명령어의 ModR/M 바이트의 상위 2비트를 무시하고 항상 이 두 비트가 다음과 같이 설정된 것처럼 실행됩니다.11b.
    AltMovCr8 인코딩은 64비트 모드에서 사용할 수 있습니다.하지만, 이를 합하면.LOCK접두어에 을 붙입니다.REX.R접두사는 허용되지 않으므로 #UD 예외를 발생시킵니다.
  3. ^ AMD K8의 F 단계에서 AltMovCR8 지원이 추가되었으며 이전 단계에서는 사용할 수 없습니다.
  4. ^ 위해서CLZERO, 주소 크기 및 67h 접두사는 AX, EAX 또는 RAX를 주소로 사용할지 여부를 제어합니다.기본 세그먼트 DS:는 세그먼트 재정의 접두사로 재정의될 수 있습니다.제공된 주소는 정렬할 필요가 없습니다. 하드웨어는 필요에 따라 주소를 정렬합니다.
    CLZERO지침은 치명적인 기계 점검 오류를 복구하기 위한 것입니다.캐시할 수 없고, 메모리 액세스 없이 캐시 라인을 할당하는 데 사용할 수 없으며, 빠른 메모리 삭제에 사용해서는 안 됩니다.[102]
  5. ^ 에서 사용하는 레지스터 번호.RDPRU반드시 다음과 일치하지는 않습니다.RDMSR/WRMSR.
    에서 지원하는 레지스터RDPRU2022년 12월 기준으로 다음과 같습니다.
    ECX 등록하세요
    0 MPERF (MSR 0E7h: 최대 성능 주파수 클럭 수)
    1 APERF (MSR 0E8h: 실제 성능 주파수 클럭 수)

    ECX에서 지원되지 않는 값이 0을 반환합니다.

  6. ^ 한다면CR4.TSD=1, 그 다음에RDPRU명령어는 링 0에서만 실행할 수 있습니다.

x87 부동 소수점 명령어

x87 코프로세서가 있다면 부동 소수점 연산을 지원합니다.코프로세서는 8개의 데이터 레지스터를 제공하며, 각 레지스터는 80비트 부동 소수점 값(1개의 부호 비트, 15개의 지수 비트, 64개의 가수 비트)을 보유합니다. 이 레지스터들은 스택으로 구성되며, 최상위 레지스터는 "st" 또는 "st(0)"로, 다른 레지스터는 st(1), st(2),...st(7)로 표시됩니다.또한 "PC"(precision control, 부동 소수점 연산을 24비트, 53비트, 64비트로 반올림해야 하는지 제어) 및 "RC"(반올림 제어, 반올림 모드 선택: 반올림-0, 반올림-양-무한, 반올림-음-무한, 반올림-이븐) 및 4를 포함한 다수의 제어 및 상태 레지스터를 제공합니다.-비트 상태 코드 레지스터 "CC", 4비트가 개별적으로 C0, C1, C2 및 C3으로 지칭됨).x87에서 제공하는 모든 산술 명령이 PC와 RC를 따르는 것은 아닙니다.

원본 8087 지침

지침설명 니모닉 옵코드 추가항목
x87 대기 중이[a] 아닌 FPU 제어 지침 웨이팅
기억력이[b] 있는
x87 FPU 초기화 FNINIT DB E3 FINIT
로드 x87 컨트롤 워드 FLDCW m16 D9 /5 (none)
x87 컨트롤 워드 저장 FNSTCW m16 D9 /7 FSTCW
x87 상태 워드 저장 FNSTSW m16 DD /7 FSTSW
x87 예외 플래그 지우기 FNCLEX DB E2 FCLEX
로드 x87 FPU 환경 FLDENV m112/m224[c] D9 /4 (none)
x87 FPU 환경 저장 FNSTENV m112/m224[c] D9 /6 FSTENV
x87 FPU 상태 저장 후 x87 FPU 초기화 FNSAVE m752/m864[c] DD /6 FSAVE
x87 FPU 상태 복원 FRSTOR m752/m864[c] DD /4 (none)
인터럽트 사용(8087만 해당)[d] FNENI DB E0 FENI
인터럽트 사용 안 함(8087만 해당)[d] FNDISI DB E1 FDISI
x87 부동 소수점 적재/저장/이동 지침 정확
통제
라운딩
통제
부동 소수점 값을 스택에 로드 FLD m32 D9 /0 아니요.
FLD m64 DD /0
FLD m80 DB /5
FLD st(i) D9 C0+i
최고의 부동 소수점 값을 메모리 또는 스택 레지스터에 저장 FST m32 D9 /2 아니요. 네.
FST m64 DD /2
FST st(i)[e] DD D0+i 아니요.
최고급 부동 소수점 값을 메모리 또는 스택 레지스터에 저장한 다음 팝업 표시 FSTP m32 D9 /3 아니요. 네.
FSTP m64 DD /3
FSTP m80[e] DB /7 아니요.
FSTP st(i)[e][f] DD D8+i
DFD0+i[g]
DFD8+i[g]
+0.0을 스택에 밀어 넣습니다. FLDZ D9 EE 아니요.
+1.0을 스택에 밀어 넣습니다. FLD1 D9 E8
π(약 3.14159)을 스택에 밀어 넣습니다. FLDPI D9 EB 아니요. 387[h]
약 3.32193)을 스택에 푸시합니다. FLDL2T D9 E9
약 1.44269)을 스택에 푸시합니다. FLDL2E D9 EA
약 0.30103)을 스택에 푸시합니다. FLDLG2 D9 EC
\(2약 0.69315)를 스택에 밀어 넣습니다. FLDLN2 D9 ED
Top-of-Stack 레지스터를 다른 스택 레지스터와 교환 FXCH st(i)[i][j] D9 C8+i 아니요.
DD C8+i[g]
DFC8+i[g]
x87 정수 로드/저장 지침 정확
통제
라운딩
통제
부동 소수점으로 변환하여 서명된 정수 값을 메모리에서 스택에 로드 FILD m16 DF /0 아니요.
FILD m32 DB /0
FILD m64 DF /5
최상위 스택 값을 메모리에 저장하고 서명된 정수로 변환 FIST m16 DF /2 아니요. 네.
FIST m32 DB /2
최상위 스택 값을 메모리에 저장하고 서명된 정수로 변환한 다음 pop stack FISTP m16 DF /3 아니요. 네.
FISTP m32 DB /3
FISTP m64 DF /7
부동 소수점으로 변환하여 메모리에서 스택에 18자리 이진 부호화 10진수 정수 값 로드 FBLD m80[k] DF /4 아니요.
최상위 스택 값을 메모리에 저장하고, 18자리 이진 코드 10진수 정수로 변환한 다음, 팝업 스택 FBSTP m80 DF /6 아니요. 387[h]
x87 기본 산술 명령어 정확
통제
라운딩
통제
부동 소수점 추가
dst <- dst + src
FADD m32 D8 /0 네. 네.
FADD m64 DC /0
FADD st,st(i) D8 C0+i
FADD st(i),st DC C0+i
부동 소수점 곱셈
dst <- dst * src
FMUL m32 D8 /1 네. 네.
FMUL m64 DC /1
FMUL st,st(i) D8 C8+i
FMUL st(i),st DC C8+i
부동 소수점 차감
dst <- dst – src
FSUB m32 D8 /4 네. 네.
FSUB m64 DC /4
FSUB st,st(i) D8 E0+i
FSUB st(i),st DC E8+i
부동 소수점 역감산
dst <- src – dst
FSUBR m32 D8 /5 네. 네.
FSUBR m64 DC /5
FSUBR st,st(i) D8 E8+i
FSUBR st(i),st DC E0+i
부동 소수점차[l]
dst <- dst / src
FDIV m32 D8 /6 네. 네.
FDIV m64 DC /6
FDIV st,st(i) D8 F0+i
FDIV st(i),st DC F8+i
부동소수점 역분할
dst <- src / dst
FDIVR m32 D8 /7 네. 네.
FDIVR m64 DC /7
FDIVR st,st(i) D8 F8+i
FDIVR st(i),st DC F0+i
부동 소수점 비교
CC <- result_of( st(0) – src )
감산과 동일한 작업이지만, FPU 스택 레지스터 대신 x87 CC 상태 레지스터를 업데이트한다는 점은 제외합니다.
FCOM m32 D8 /2 아니요.
FCOM m64 DC /2
FCOM st(i)[i] D8 D0+i
DCD0+i[g]
x87 스택 팝을 사용한 기본 산술 명령 정확
통제
라운딩
통제
부동 소수점 추가 및 팝 FADDP st(i),st[i] DE C0+i 네. 네.
부동 소수점 곱하기 및 팝 FMULP st(i),st[i] DE C8+i 네. 네.
부동 소수점 빼기 및 팝 FSUBP st(i),st[i] DE E8+i 네. 네.
부동 소수점 역감산 및 팝 FSUBRP st(i),st[i] DE E0+i 네. 네.
부동 소수점 분할 및 팝 FDIVP st(i),st[i] DE F8+i 네. 네.
부동 소수점 역분할 및 팝 FDIVRP st(i),st[i] DE F0+i 네. 네.
부동 소수점 비교 및 팝 FCOMP m32 D8 /3 아니요.
FCOMP m64 DC /3
FCOMP st(i)[i] D8 D8+i
DCD8+i[g]
DED0+i[g]
부동 소수점을 st(1)와 비교한 다음 두 번 팝 FCOMPP DE D9 아니요.
x87 정수 소스 인수를 사용하는 기본 산술 명령 정확
통제
라운딩
통제
부동 소수점 덧셈 정수 FIADD m16 DA /0 네. 네.
FIADD m32 DE /0
부동 소수점에 정수를 곱하기 FIMUL m16 DA /1 네. 네.
FIMUL m32 DE /1
부동 소수점 차감 정수 FISUB m16 DA /4 네. 네.
FISUB m32 DE /4
부동 소수점을 정수 단위로 역감산법 FISUBR m16 DA /5 네. 네.
FISUBR m32 DE /5
부동 소수점을 정수로 나눈 값 FIDIV m16 DA /6 네. 네.
FIDIV m32 DE /6
부동 소수점을 정수로 역분할 FIDIVR m16 DA /7 네. 네.
FIDIVR m32 DE /7
부동 소수점과 정수 비교 FICOM m16 DA /2 아니요.
FICOM m32 DE /2
부동 소수점을 정수와 비교하고 스택 팝 FICOMP m16 DA /3 아니요.
FICOMP m32 DE /3
x87 추가 산술 지침 정확
통제
라운딩
통제
부동 소수점 변경 기호 FCHS D9 E0 아니요.
부동 소수점 절댓값 FABS D9 E1 아니요.
부동 소수점은 최상위 값을 0과 비교합니다. FTST D9 E4 아니요.
탑오브스택 st(0) 레지스터 값을 분류합니다.
분류결과는 x87 CC 레지스터에 저장됩니다.[m]
FXAM D9 E5 아니요.
st(0) 값을 st(0)의 지수와 가수를 나타내는 두 개의 값 EM으로 나눕니다.
분할은 ∗ 2 = } = 가 되도록 수행되며 여기서 E는 정수이고 M이 1< 2{\ M< 범위 내에 있는 숫자입니다
그런 다음 st(0)는 E로 대체되고, 그 후 M은 스택에 푸시됩니다.
FXTRACT D9 F4 아니요.
부동 소수점 부분 나머지[o](IEEE 754 호환은 아님):
FPREM D9 F8 아니요. [p]
부동 소수점 제곱근 FSQRT D9 FA 네. 네.
부동 소수점을 정수로 반올림 FRNDINT D9 FC 아니요. 네.
부동 소수점 2중 전력 스케일링.st(1)의 값을 반올림하고 반올림하여 0으로 정수를 지정한 다음 st(0)의 척도 인자로 사용합니다.[q]
FSCALE D9 FD 아니요. [r]
x87 초월 명령어[s] 소스 피연산자
범위 제한
기준-2 지수 - 1, st(0)에 대한 추가 정밀도는 0에 가깝습니다.
F2XM1 D9 F0 8087: )
80387: -
기준-2 로그:
이어 스택 팝
FYL2X[t] D9 F1 제한 없음
부분 탄젠트: 다음과 같이 st(0)로부터 값 X와 Y의 쌍을 계산합니다.
Y 값은 최상위 스택 값을 대체한 다음 X를 스택에 푸시합니다.
80387 이상의 x87에서는 원래의 8087이 아니지만 X는 항상 1.0입니다.
FPTAN D9 F2 8087: (0 ) π
80387 : ()<
사분면 조정이 포함된 2개의 논항 아크탄젠트:[u]
이어 스택 팝
FPATAN D9 F3 8087: ( < ∞
80387: 제한 없음
0에 가까운 st(0)에 대한 추가 정밀도와 함께, Base-2 로그에 1을 더한 값:
이어 스택 팝
FYL2XP1[t] D9 F9 Intel: (< ( )
AMD:(- )< ()< (- 1) st
기타 x87 지침
작업없음[v] FNOP D9 D0
축소 x87 FPU 레지스터 스택 포인터 FDECSTP D9 F6
증분 x87 FPU 레지스터 스택 포인터 FINCSTP D9 F7
무료 x87 FPU 레지스터 FFREE st(i) DD C0+i
보류 중인 마스크 해제 x87 FPU 예외 확인 및 처리 WAIT,
FWAIT
9B
스택 언더플로우 예외 없이 부동 소수점 스토어 및 팝 FSTPNCE st(i) D9 D8+i[g]
무료 x87 레지스터, 스택 팝 FREEP st(i) DFC0+i[g]
  1. ^ x87 코프로세서(8087 이외)는 예외를 상당히 이례적인 방식으로 처리합니다.x87 명령이 마스킹되지 않은 산술 예외를 생성해도 CPU 오류가 발생하지 않고 완료됩니다. - 오류가 발생하는 대신 예외 처리에 필요한 보조 프로세서 정보(명령 포인터, opcode,명령에 메모리 피연산자)가 있는 경우 data pointer(데이터 포인터), 보류 중인 예외가 있음을 나타내는 FPU status-word 플래그를 설정합니다.그러면 다음 x87, MMX 또는 다음 x87에서 CPU 오류가 발생합니다.WAIT명령이 실행됩니다.
    이에 대한 예외는 x87의 "대기 금지" 지침으로, 보류 중인 예외가 존재하더라도 이러한 오류가 발생하지 않고 실행됩니다(일부 주의 사항이 있는 경우 애플리케이션 노트 AP-578[103] 참조).이러한 지침은 대부분 x87 FPU의 보류 예외 상태를 검사 및/또는 수정할 수 있는 제어 지침입니다.
  2. ^ 메모리가 다음으로 시작되는 대기하지 않는 각 x87 명령에 대해FN, N이 없는 경우를 제외하고 동일한 니모닉을 갖는 의사 명령이 존재합니다.이 유사 명령들은 다음과 같이 구성됩니다.WAIT명령어(opcode)9B)에 해당하는 비 waiting x87 지침이 뒤따릅니다.예를 들어,
    • FNCLEXopcode가 있는 명령어입니다.이에 해당하는 유사 명령어는FCLEX로 인코딩됩니다.
    • FNSAVE ES:[BX+6] opcode가 있는 명령어입니다.해당 의사 명령어는 다음과 같이 인코딩됩니다.
    x87 코프로세서를 탑재한 모든 x86 CPU가 두 명령어의 시퀀스로 실행하더라도, 이러한 의사 명령어는 x86 어셈블러와 디셈블러에 의해 일반적으로 인식되고 단일 명령어로 취급됩니다.
  3. ^ a b c d 80387 이상 x87 FPU에서는FLDENV,F(N)STENV,FRSTOR그리고.F(N)SAVE16비트 및 32비트 변종으로 존재합니다.16비트 변형은 메모리에 14바이트 부동 소수점 환경 데이터 구조를 로드/저장합니다. 32비트 변형은 대신 28바이트 데이터 구조를 로드/저장합니다.F(N)SAVE/FRSTOR는 FPU 환경 이후에 80바이트의 FPU 데이터 레지스터 컨텐츠를 추가로 로드/저장합니다. 총 94바이트 또는 108바이트입니다.16비트 및 32비트 변종 간의 선택은CS.D비트와 존재.66h명령 접두사8087 및 80287에서는 16비트 버전만 사용할 수 있습니다.
    64비트 버전의 명령어는 존재하지 않음 - 사용REX.Wx86-64에서 32비트 변형이 사용됩니다.FIP 및 FDP의 하위 32비트만 로드/저장할 수 있으므로 를 사용하는 것이 좋습니다.FXSAVE64/FXRSTOR64대신 64비트 작업이 필요한 경우.
  4. ^ a b 마스크를 쓰지 않은 FPU 예외를 생성하는 x87 명령의 경우, 8087 FPU는 명령이 발행된 후 일정 시간이 지나면 IRQ 신호를 보냅니다.이를 항상 처리할 수 있는 것은 아닐 수 있으며,[104] 따라서 FPU는 다음을 제공합니다.F(N)DISI그리고.F(N)ENI인터럽트를 제어하기 위해 [105]x87 Control Word의 Interrupt Mask 비트(비트 7)를 설정/지우기 위한 지침.
    이후 x87 FPU는 80287 이후부터 다음 x87 명령에서 CPU 예외를 생성하도록 FPU 예외 메커니즘을 변경했습니다.이로 인해 Interrupt [106]Mask가 불필요하게 되어 제거되었습니다.이후 인텔 x87 FPU에서는F(N)ENI그리고.F(N)DISIx87 상태를 수정하지 않는 NOP로 실행하여 하위 호환성을 위해 명령이 유지되었습니다.
  5. ^ a b c FST/FSTP80비트 대상(m80 또는 st(i)) 및 sNaN 소스 값을 사용하면 AMD에서는 예외가 발생하지만 Intel FPU에서는 예외가 발생하지 않습니다.
  6. ^ FSTP ST(0)는 x87 레지스터 스택에서 하나의 레지스터를 터뜨리는 데 일반적으로 사용되는 관용구입니다.
  7. ^ a b c d e f g h i Intel x87 별칭 opcode.이 opcode는 사용하지 않는 것이 좋습니다.
    인텔 8087 코프로세서에서는 여러 개의 예약된 opcode가 기존의 정의된 x87 명령어와 유사한 동작을 수행합니다.이러한 opcode는 8087[107] 및 80287용으로 문서화되었지만,[108] 이후의 매뉴얼에서는 Intel SDM의 2017년 10월 업데이트까지 생략되었습니다.[109]
    알려진 모든 Intel x87 FPU에는 존재하지만 AMD Geode GX/LX, DM&P Vortex86[110] 및 NexGen 586PF와 같은 일부 오래된 비 Intel FPU에서는 사용할 수 없습니다.[111]
  8. ^ a b 8087호와 80287호에FBSTP그리고 부하 constant 지침은 항상 라운드 투 nearest 라운딩 모드를 사용합니다.80387 이상 x87 FPU에서는 x87 RC 레지스터에 지정된 라운딩 모드를 사용합니다.
  9. ^ a b c d e f g h i 를 위해FADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMP그리고.FXCH명령어, x86 어셈블러/어셈블러는 인수 없이 명령어의 변형을 인식할 수 있습니다.이러한 변형은 st(1)을 첫 번째 인수로 사용하는 변형과 동일합니다.
  10. ^ 인텔 펜티엄 이후 프로세서에서는FXCH는 실제 데이터 이동이 아닌 레지스터 이름 변경으로 구현됩니다.이것은 의미론적인 효과는 없지만 제로 사이클 레이턴시 작동을 가능하게 합니다.또한 명령어를 사용하여 x87 탑 오브 스택 값에 대한 데이터 의존성을 해소할 수 있으며, 이러한 프로세서에 최적화된 코드에 대한 달성 가능한 성능을 개선할 수 있습니다.
  11. ^ 를 실행한 결과.FBLDBCD가 아닌 데이터에 대한 명령이 정의되지 않았습니다.
  12. ^ 초기 인텔 펜티엄 프로세서에서는 부동 소수점 분할이 펜티엄 FDIV 버그의 대상이었습니다.이것은 또한 그들의 작업의 일부분으로서 분할을 수행하는 지시에도 영향을 미쳤습니다. 예를 들어 다음과 같이 말입니다.FPREM그리고.FPATAN.[112]
  13. ^ FXAM명령어는 st(0)의 값 유형을 기준으로 C0, C2 및 C3을 다음과 같이 설정합니다.
    C3 C2 C0 분류
    0 0 0 지원되지 않음(비정상 또는 유사 NaN)
    0 0 1 NaN
    0 1 0 정상유한수
    0 1 1 Infinity
    1 0 0
    1 0 1
    1 1 0 정상수
    1 1 1 비어 있음(8087/80287에서만 발생할 수 있음)

    C1은 st(0)가 비어 있는지 여부에 관계없이 st(0)의 부호 비트로 설정됩니다.

  14. ^ 위해서FXTRACT, st(0)가 0 또는 ± ∞이면 M은 st(0)와 같게 설정됩니다.st(0)가 0이면 8087/80287에서는 E가 0으로 설정되지만 80387 이상에서는 - ∞로 설정됩니다.st(0)가 ± ∞이면 E는 + ∞로 설정됩니다.
  15. ^ 위해서FPREM, 몫 Q 보다클 경우, 나머지 계산은 부분적으로만 수행되었을 수 있습니다 – 이 경우,FPREM나머지 계산을 완료하려면 명령을 다시 실행해야 합니다.이는 지침 설정에 의해 표시됩니다.C21 대 1.
    명령어가 나머지 계산을 완료한 경우 설정됩니다.C20으로 설정하고 3비트를 설정합니다.{C0,C3,C1}계수 Q의 하위 세 부분까지
    80387 이상에서 명령어가 나머지 계산을 완료하지 않은 경우 인수 감소에 사용되는 계산된 나머지 Q는 8의 배수(또는 2의 거듭제곱)로 반올림되어 나머지 계산을 완료하는 나중의 패스에서 몫의 하위 3비트를 여전히 올바르게 검색할 수 있습니다.
  16. ^ 에 의해 수행된 나머지 계산.FPREM명령은 항상 정확하고 반올림 오류가 없습니다.
  17. ^ 를 위해FSCALE8087 및 80287에서 명령어 st(1)는 < 범위여야 합니다 또한 절대값은 0 또는 적어도 1이어야 합니다.이러한 요구 사항이 충족되지 않으면 결과가 정의되지 않습니다.
    이러한 제한은 80387년에 제거되었습니다.
  18. ^ 위해서FSCALE, 반올림은 오버플로우, 언더플로우 또는 정상 이하의 결과인 경우에만 적용됩니다.
  19. ^ x87 초월 명령어는 PC나 RC를 따르지 않고 대신 전체 80비트 결과를 계산합니다.이러한 결과는 반드시 정확하게 반올림된 것은 아닙니다(표 제조업체의 딜레마 참조). 펜티엄 이상에서는 최대 ±1 ulp의 오차를 갖거나 이전 x87 보조 프로세서에서는 최대 ±1.5 ulp의 오차를 가질 수 있습니다.
  20. ^ a b 를 위해FYL2X그리고.FYL2XP1명령, ±1 ulp의 최대 오차 한계는 st(1)=1.0에 대해서만 유지됩니다. – st(1)의 다른 값의 경우 오차 한계는 ±1.35 ulp로 증가됩니다.
  21. ^ 위해서FPATAN, 비율 (1 의 하나의 argument 아크탄젠트를 계산하는 것과 비교하여 다음과 같은 조정이 수행됩니다
    • st(0)와 st(1)가 모두 ± ∞이면 아크탄젠트는 st(0)와 st(1)가 같은 부호의 ±1로 교체된 것처럼 계산됩니다.결과는 π 4 {\의 홀수 배입니다
    • st(0)와 st(1)가 모두 ±0인 경우, 아크탄젠트는 st(0)가 아닌 st(1)가 동일한 부호의 ±1로 대체된 것처럼 계산되어 ±0또는 ± π 의 결과가 생성됩니다
    • st(0)가 음수이면(부호 비트가 설정됨), st(1)와 동일한 부호를가진 ± π{\의 덧셈이 결과에 추가됩니다.
  22. ^ 하는 동안에FNOPx87 FPU 레지스터 스택을 수정하지 않고 그대로 둘 수 있으며, FIP 및 CC를 수정할 수 있으며 보류 중인 x87 FPU 예외가 있으면 오류가 발생할 수 있습니다.

x87 명령어가 이후 프로세서에 추가됨

지침설명 니모닉 옵코드 추가항목
80287에 추가된 x87 비대기 제어 지침 웨이팅
기억력이 있는
FPU에 보호 모드[a] 진입 알림 FNSETPM DB E4 FSETPM
x87 상태 Word to AX 저장 FNSTSW AX DF E0 FSTSW AX
x87 지침이 80387[b] 추가됨 소스 피연산자
범위 제한
부동 소수점 순서가 없는 비교입니다.
일반 부동 소수점 비교 명령어와 유사합니다.FCOM, 예외는 qNaN 피연산자에 대한 응답으로 예외를 생성하지 않습니다.
FUCOM st(i)[c] DD E0+i 제한 없음
부동 소수점 순서 없는 비교 및 팝업 FUCOMP st(i)[c] DD E8+i
st(1)에 비해 부동 소수점 순서가 없는 다음 두 번 팝 FUCOMPP DA E9
IEEE 754 준수 부동 소수점 부분 나머지.[d] FPREM1 D9 F5
부동 소수점 사인 및 코사인.
값 S = ( 0 {\S =\ C = ({\ C = \st))\을 계산합니다.
스택 최상위 st(0)는 S로 대체되고, 그 후 C는 스택에 푸시됩니다.
FSINCOS D9 FB
부동 소수점 사인.[e]
FSIN D9 FE
부동 소수점 코사인.[e]
FCOS D9 FF
Pentium Pro에 추가된 x87 지침 조건
조건부 동작
EFLAGS에 기초한 st(0)로의 부동 소수점 조건부 이동 FCMOVB st(0),st(i) DA C0+i 아래 (CF=1)
FCMOVE st(0),st(i) DA C8+i 같음 (ZF=1)
FCMOVBE st(0),st(i) DA D0+i 이하의
(CF=1 또는 ZF=1)
FCMOVU st(0),st(i) DA D8+i 순서 없음(PF=1)
FCMOVNB st(0),st(i) DB C0+i 이하(CF=0)
FCMOVNE st(0),st(i) DB C8+i 같지 않음 (ZF=0)
FCMOVNBE st(0),st(i) DB D0+i 작거나 같지 않은
(CF=0 및 ZF=0)
FCMOVNU st(0),st(i) DB D8+i 순서 없음(PF=0)
부동 소수점 비교 및 설정EFLAGS.
오래된 것과 다른 점FCOM결과를 정수에 넣었다는 점에서 부동 소수점 비교 명령EFLAGSx87 CC 레지스터가 아닌 레지스터.[f]
FCOMI st(0),st(i) DB F0+i
부동 소수점 비교 및 설정EFLAGS, 그다음에 FCOMIP st(0),st(i) DF F0+i
부동 소수점 순서에 따라 비교 및 집합EFLAGS FUCOMI st(0),st(i) DB E8+i
부동 소수점 순서에 따라 비교 및 집합EFLAGS, 그다음에 FUCOMIP st(0),st(i) DF E8+i
Pentium II, AMD K7SSE[g] 추가된 x87 대기 금지 명령어 64비트 니모닉
(REX.W접두사)
x87, MMX 및 SSE 상태를 512바이트 데이터 구조에[h][i][j] 저장 FXSAVE m512byte NP 0F AE /0 FXSAVE64 m512byte
512바이트 데이터 구조에서[h][i] x87, MMX 및 SSE 상태 복원 FXRSTOR m512byte NP 0F AE /1 FXRSTOR64 m512byte
x87 SSE3의 일부로 추가된 지침
부동 소수점 스토어 정수 및 팝(원형에서 0까지) FISTTP m16 DF /1
FISTTP m32 DB /1
FISTTP m64 DD /1
  1. ^ x87 FPU는 실제 모드에서 작동하는지 보호 모드에서 작동하는지 알아야 하는데, 이는 부동 소수점 환경이 에 의해 액세스되기 때문입니다.F(N)SAVE,FRSTOR,FLDENV그리고.F(N)STENV명령어는 Real Mode와 Protected Mode에서 서로 다른 형식을 가집니다.80287번에.F(N)SETPM실제-보호 모드 전환을 FPU에 전달하기 위한 지침이 필요합니다. 80387 이상의 x87 FPU에서는 전용 지침 없이도 실제↔보호 모드 전환이 FPU에 자동으로 전달됩니다.FNSETPM는 어떤 FPU 상태도 수정하지 않는 NOP로 실행됩니다.
  2. ^ 특정 80387 호환 FPU 모델과 관련된 중단된 지침은 포함되지 않습니다.
  3. ^ a b 를 위해FUCOM그리고.FUCOMP명령어, x86 어셈블러/어셈블러는 인수 없이 명령어의 변형을 인식할 수 있습니다.이러한 변형은 st(1)을 첫 번째 인수로 사용하는 변형과 동일합니다.
  4. ^ 더 80387FPREM1오래된 것과 다른 지시.FPREM(D9 F8)에서 사용하는 반올림이 아닌 반올림에서 반올림에 가까운 짝수 반올림으로 Q를 정수로 반올림하는 명령FPREM.맘에 들다FPREM,FPREM1는 항상 반올림 오류 없이 정확한 결과를 계산합니다.맘에 들다FPREM, 또한 몫이 너무 크면 부분 연산을 수행할 수 있으며, 이 경우 다시 실행해야 합니다.
  5. ^ a b c x87 FPU는 정밀도 약 68비트로 sin/cos에 대한 인수 감소를 수행하기 때문에, 계산에 사용되는 k의 값은FSIN,FCOS그리고.FSINCOS정확하게 1.0이 아니라, 대신에[113][114] 에 의해 주어집니다.
    이 논쟁 감소 부정확성은 또한 영향을 미칩니다.FPTAN설명.
  6. ^ FCOMI,FCOMIP,FUCOMI그리고.FUCOMIP명령어들은 그들의 결과들을 그들에게 적습니다.ZF,CF그리고.PF아주 조금EFLAGS등록하세요.AMD 프로세서가 아닌 인텔에서,SF,AF그리고.OF몇 개의EFLAGS또한 이 지침에 의해 0이 됩니다.
  7. ^ FXSAVE그리고.FXRSTOR명령어는 펜티엄 II의 Deschutes 개정판에 추가되었으며 이전의 Klamath 개정판에는 없습니다.
    AMD K7에도 존재합니다.
    또한 SSE의 필수적인 부분으로 간주되므로 SSE를 사용하는 모든 프로세서에 존재합니다.
  8. ^ a b FXSAVE그리고.FXRSTOR명령어는 SSE를 지원하는 프로세서에만 SSE 상태를 저장/복원합니다.그렇지 않으면 x87 및 MMX 상태만 저장/복원됩니다.
    저장/복원된 상태의 x87 섹션FXSAVE/FXRSTOR기존의 데이터 구조와 완전히 다른 레이아웃을 갖습니다.F(N)SAVE/FRSTOR명령어를 사용하여 잘못 정렬된 로드 및 저장소를 방지하여 보다 빠른 저장/복원을 가능하게 합니다.
  9. ^ a b 부동 소수점 에뮬레이션이 사용 가능한 경우CR0.EM=1,FXSAVE(64)그리고.FXRSTOR(64)는 x87 명령으로 간주되며 따라서 #NM(device-not-available) 예외가 발생합니다.이외에WAIT, 이것들은 그 밖에 있는 유일한 옵코드입니다.D8..DF이 동작을 나타내는 ESCopcode 공간(모든 opcode inD8..DF만약에 #NM을 생성할 것입니다.CR0.EM=1, 그렇지 않으면 #UD를 생성할 정의되지 않은 opcode에 대해서도.)
  10. ^ 형들과는 다르게F(N)SAVE설명,FXSAVE는 상태를 메모리에 저장한 후 FPU를 초기화하지 않고 대신 x87 코프로세서 상태를 수정하지 않은 상태로 유지합니다.

SIMD 지침

MMX 지침

MMX 명령은 64비트 너비의 mm 레지스터에서 작동합니다.이들은 FPU 레지스터와 공유됩니다.

오리지널 MMX 지침

펜티엄 MMX 추가

설명 옵코드 의미. 메모들
EMS 0F77 빈 MMX 기술 상태 FPU에서 사용할 수 있도록 모든 x87 FPU 레지스터에 표시
MOVD mm, r/m32 0F 6E/r 이중단어이동
MOVDr/m32,mm 0F 7E/r 이중단어이동
MOVQ mm/m64,mm 0F 7F/r 쿼드워드 이동
MOVQ mm, mm/m64 0F 6F/r 쿼드워드 이동
MOVQ mm, r/m64 REX.W + 0F 6E/r 쿼드워드 이동
MOVQr/m64,mm REX.W + 0F 7E/r 쿼드워드 이동
PACKSSDWmm1,mm2/m64 0F 6B/r 단어에 이중 단어 포장(포화 상태로 서명됨)
PAKSSWBmm1,mm2/m64 0F 63/r 단어를 바이트로 팩하기(포화 상태로 서명됨)
PACKUSWBmm,mm/m64 0F67/r 단어를 바이트로 팩하기(포화 상태로 서명되지 않음)
PADDB mm, mm/m64 0F FC/r 포장된 바이트 정수 추가
PADDWmm,mm/m64 0F FD/r 포장된 단어 정수 추가
PADDD mm, mm/m64 0FFE/r 포장된 이중 단어 정수 추가
PADDQmm,mm/m64 0F D4/r 포장된 쿼드워드 정수 추가
PADDSBmm,mm/m64 0F EC/r packed signed byte 정수를 추가하고 saturate
PADDSWmm,mm/m64 0FED/r 포장된 부호어 정수를 추가하고 포화시킵니다.
PADDSUSB mm, mm/m64 0F DC/r 포장된 서명되지 않은 바이트 정수를 추가하고 포화시킵니다.
PADDUSWmm,mm/m64 0F DD/r 포장된 비부호 단어 정수 추가 및 포화
PAND mm, mm/m64 0F DB/r 비트와이즈 AND
PANDNmm,mm/m64 0FDF/r 비트 와이즈 앤 낫
POR mm, mm/m64 0FEB/r 비트와이즈 OR
PXOR mm, mm/m64 0FF EF/r 비트와이즈 XOR
PCMPEQBmm,mm/m64 0F74/r 포장된 바이트의 동일성 비교
PCMPEQWmm,mm/m64 0F75/r 포장된 단어의 동일성 비교
PCMPEQDmm,mm/m64 0F76/r 포장된 이중 단어의 동일성 비교
PCMPGTBmm,mm/m64 0F64/r packed signed byte 정수를 다음 값보다 큰 값으로 비교합니다.
PCMPGTWmm,mm/m64 0F65/r 다음 값보다 큰 값에 대한 포장된 부호어 정수 비교
PCMPGTDmm,mm/m64 0F66/r packed signed 이중 단어 정수를 다음보다 큰 값으로 비교합니다.
PMADDWDmm,mm/m64 0F F5/r 포장된 단어 곱하기, 인접한 이중 단어 결과 추가
PMULHW mm, mm/m64 0FE5/r 포장된 부호어 정수 곱하기, 높은 16비트의 결과 저장
PMUL W mm, mm/m64 0F D5/r 패킹된 부호어 정수 곱하기, 16비트의 결과를 낮게 저장
PSLLW mm1, imm8 0F 71/6ib 왼쪽 단어 이동, 0 단위 이동
PSLLWmm,mm/m64 0F F1/r 왼쪽 단어 이동, 0 단위 이동
PSLLD mm, im8 0F 72/6ib 왼쪽 이중 단어 시프트, 0 단위 시프트
PSLLD mm, mm/m64 0F F2/r 왼쪽 이중 단어 시프트, 0 단위 시프트
PSLLQ mm, im8 0F 73/6ib 왼쪽 쿼드워드 시프트, 0 단위 시프트
PSLLQ mm, mm/m64 0F F3/r 왼쪽 쿼드워드 시프트, 0 단위 시프트
PSRAD mm, im8 0F 72/4ib 오른쪽 이중 단어 시프트, 부호 비트 시프트
PSRAD mm, mm/m64 0FE2/r 오른쪽 이중 단어 시프트, 부호 비트 시프트
PSRAW mm, im8 0F 71/4ib 오른쪽 단어 이동, 부호 비트 이동
PSRAW mm, mm/m64 0FE1/r 오른쪽 단어 이동, 부호 비트 이동
PSRLWmm, im8 0F 71/2ib 오른쪽 단어 이동, 0 단위 이동
PSRLWmm,mm/m64 0F D1/r 오른쪽 단어 이동, 0 단위 이동
PSRLD mm, im8 0F 72/2ib 오른쪽 이중 단어 시프트, 0 단위 시프트
PSRLD mm, mm/m64 0F D2/r 오른쪽 이중 단어 시프트, 0 단위 시프트
PSRLQ mm, im8 0F 73/2ib 오른쪽 쿼드어 시프트, 0 단위 시프트
PSRLQmm,mm/m64 0F D3/r 오른쪽 쿼드어 시프트, 0 단위 시프트
PSUBB mm, mm/m64 0F F8/r 포장된 바이트 정수 빼기
PSUBWmm,mm/m64 0F F9/r 포장된 단어 정수 빼기
PSUBD mm, mm/m64 0F FA/r 포장된 이중 단어 정수 빼기
PSUBSB mm, mm/m64 0FE8/r 포화 상태에서 서명된 포장 바이트 차감
PSUBSW mm, mm/m64 0FE9/r 채도가 있는 부호가 있는 포장된 단어 빼기
PSU USB mm, mm/m64 0F D8/r 포화 상태에서 서명되지 않은 포장 바이트 차감
PSUBUSWmm,mm/m64 0F D9/r 채도가 있는 비부호 포장 단어 빼기
PUNPCKHBWmm,mm/m64 0F 68/r 고차 바이트 포장 및 인터리브
PUNPCKHWDmm,mm/m64 0F69/r 높은 순서의 단어를 풀고 서로 바꿉니다.
PUNPCKHDQmm,mm/m64 0F 6A/r 고차 이중 단어 포장 및 인터리브
PUNPCCKLBWmm,mm/m32 0F 60/r 하위 바이트의 포장을 풀고 인터리브
PUNPCCKLWDmm,mm/m32 0F 61/r 낮은 순서의 단어를 풀고 서로 바꿉니다.
PUNPCCKLDQmm,mm/m32 0F 62/r 낮은 차수의 이중 단어를 풀고 상호 보관합니다.

특정 프로세서에 추가된 MMX 명령어

MMX+ 및 SSE와 함께 추가된 MMX 지침

SSE와 함께 다음 MMX 명령이 추가되었습니다.MMX+라는 이름으로 애슬론에서도 이용할 수 있습니다.

설명 옵코드 의미.
MASKMOVQ mm1, mm2 0F F7/r 쿼드워드의 마스크드 무브
MOVNTQ m64,mm 0FE7/r 비일시적 힌트를 사용하여 쿼드워드 이동
PSHUFWmm1,mm2/m64,im8 0F 70/립 포장된 단어 셔플
핀스RW mm, r32/m16, imm8 0FC4/r 단어 삽입
PEXTRW reg,mm,im8 0FC5/r 단어 추출
PMOVMSKB reg, mm 0F D7/r 바이트 마스크 이동
PMINUB mm1,mm2/m64 0F DA/r 포장된 비부호 바이트 정수의 최소값
PMAXUBmm1,mm2/m64 0F DE /r 포장된 비부호 바이트 정수의 최대값
PAVGBmm1,mm2/m64 0FE0/r 채워진 평균 정수
PAVGWmm1,mm2/m64 0FE3/r 채워진 평균 정수
PMULHUWmm1,mm2/m64 0FE4/r 포장된 비부호 정수 곱하기 및 높은 결과 저장
PMINSW mm1,mm2/m64 0FEA/r 포장된 부호어 정수의 최소값
PMAXSWmm1,mm2/m64 0FEE/r 포장된 부호어 정수의 최대값
PSADBWmm1,mm2/m64 0F F6/r 절대적 차이의 합 계산
SSE2와 함께 추가된 MMX 지침

SSE2와 함께 추가된 MMX 지침은 다음과 같습니다.

설명 옵코드 의미.
PSUBQ mm1,mm2/m64 0F FB/r 쿼드워드 정수 빼기
PMULUDQmm1,mm2/m64 0F F4/r 부호 없는 이중 단어 정수 곱하기
SSSE3에 추가된 MMX 지침
설명 옵코드 의미.
PSIGNB mm1, mm2/m64 0F 3808/r 해당 부호에 따라 negate/zero/packed byte 정수 보존
PSIGNWmm1,mm2/m64 0F 3809/r 해당 부호에 따라 negate/zero/packed word 정수 보존
PSIGND mm1, mm2/m64 0F 380A/r 해당 기호에 따라 negate/zero/packed 이중 단어 정수 유지
PSHUFBmm1,mm2/m64 0F 3800/r 바이트 셔플
PMULHRSWmm1,mm2/m64 0F 380B/r 16비트 부호어 곱하기, 축척 및 둥근 부호어 이중 단어, 팩 하이 16비트
PMADDUBSWmm1,mm2/m64 0F 380 04/r 서명된 바이트와 서명되지 않은 바이트 곱하기, 서명된 단어의 수평 쌍 추가, 포화된 서명된 단어 팩
PHSUBWmm1,mm2/m64 0F 3805/r 16비트 부호 정수를 뺀 후 가로로 포장
PHSUBSW mm1,mm2/m64 0F 3807/r 16비트 부호 정수를 빼서 채도로 수평으로 포장
PHSUBD mm1, mm2/m64 0F 380 06/r 32비트 부호 정수를 뺀 후 가로로 포장
PADDSWmm1,mm2/m64 0F 3803/r 16비트 부호 정수를 수평으로 추가하여 포장하고 포화 정수를 mm1로 포장합니다.
PADDWmm1,mm2/m64 0F 3801/r 16비트 정수를 가로로 추가하고 포장합니다.
PHADDD mm1, mm2/m64 0F 3802/r 32비트 정수를 가로로 추가하고 포장합니다.
PALIGNRmm1,mm2/m64,im8 0F 3A 0F/립 대상 및 소스 피연산자 연결, 오른쪽으로 이동된 바이트 정렬 결과 추출
PABSB mm1,mm2/m64 0F 38 1C/r 바이트의 절대값 계산 및 서명되지 않은 결과 저장
PABSW mm1,mm2/m64 0F 38 1D/r 16비트 정수의 절대값 계산 및 서명되지 않은 결과 저장
PABSDmm1,mm2/m64 0F 38 1E/r 32비트 정수의 절대값 계산 및 서명되지 않은 결과 저장

SSE 지침

펜티엄 III 추가

SSE 명령은 128비트 너비의 xmm 레지스터에서 작동합니다.

SSE는 다음과 같은 SSE SIMD 부동 소수점 명령으로 구성됩니다.

설명 옵코드 의미.
ANDPS* xmm1, xmm2/m128 0F 54/r Packed single-precision 부동 소수점 값의 비트 와이즈 논리 AND
ANDNPS* xmm1, xmm2/m128 0F 55/r Packed single-precision 부동 소수점 값이 아닌 비트 와이즈 논리
ORPS* xmm1, xmm2/m128 0F56/r 단일정밀 부동 소수점 값의 비트 와이즈 논리곱
XORPS* xmm1, xmm2/m128 0F57/r 단일-정밀 부동 소수점 값을 위한 비트와이즈 논리 XOR
MOVUPS xmm1, xmm2/m128 0F 10/r 정렬되지 않은 포장된 단일 정밀도 부동 소수점 값 이동
MOVSS xmm1, xmm2/m32 F30F 10/r 스칼라 단일 정밀 부동 소수점 값 이동
MOVUPS xmm2/m128, xmm1 0F 11/r 정렬되지 않은 포장된 단일 정밀도 부동 소수점 값 이동
MOVSS xmm2/m32, xmm1 F30F 11/r 스칼라 단일 정밀 부동 소수점 값 이동
MOVLPS xmm, m64 0F 12/r 낮은 패킹된 단일 정밀도 부동 소수점 값 이동
MOVHLPS xmm1, xmm2 0F 12/r 패킹된 단일 정밀도 부동 소수점 값을 높음에서 낮음으로 이동
MOVLPS m64, xmm 0F 13/r 낮은 패킹된 단일 정밀도 부동 소수점 값 이동
UNPCKLPS xmm1, xmm2/m128 0F 14/r 포장해제 및 인터리브 Low Packed Single-Precision 부동 소수점 값
UNPCKHPS xmm1, xmm2/m128 0F 15/r 포장해제 및 인터리브 하이패킹 단일정밀 부동 소수점값
MOVHPS xmm, m64 0F 16/r 높은 패킹된 단일 정밀도 부동 소수점 값 이동
MOVLHPS xmm1, xmm2 0F 16/r 패킹된 단일 정밀 부동 소수점 값을 낮음에서 높음으로 이동
MOVHPS m64, xmm 0F17/r 높은 패킹된 단일 정밀도 부동 소수점 값 이동
MOVAPS xmm1, xmm2/m128 0F 28/r 정렬된 포장된 단일 정밀 부동 소수점 값 이동
MOVAPS xmm2/m128, xmm1 0F29/r 정렬된 포장된 단일 정밀 부동 소수점 값 이동
MOVNTPS m128, xmm1 0F 2B/r 정렬된 4개의 포장된 단일 FP 비시간 이동
MOVMSKPS reg, xmm 0F 50/r 포장된 단일 정밀 부동 소수점 4비트 부호 마스크를 추출합니다.레지스터의 위쪽 비트가 0으로 채워집니다.
CVTPI2PS xmm, mm/m64 0F2A/r 패킹된 Dword 정수를 패킹된 단일 정밀도 FP 값으로 변환
CVTSI2SS xmm, r/m32 F30F2A/r Dword 정수를 스칼라 단일 정밀도 FP 값으로 변환
CVTSI2SS xmm, r/m64 F3REX.W0F2A/r Qword 정수를 스칼라 단일 정밀도 FP 값으로 변환
CVTTPS2PImm, xmm/m64 0F 2C/r 잘라내기 팩킹된 단일 정밀도 FP 값을 팩킹된 Dword 정수로 변환
CVTTSS2SIr32, xmm/m32 F30F 2C/r 절단 스칼라 단일 정밀도 FP 값을 Dword 정수로 변환
CVTTSS2SIr64, xmm1/m32 F3REX.W0F2C/r 잘라내기 스칼라 단일 정밀도 FP 값을 Qword 정수로 변환
CVTPS2PImm, xmm/m64 0F 2D/r 패킹된 단일 정밀도 FP 값을 패킹된 Dword 정수로 변환
CVTSS2SIr32, xmm/m32 F30F 2D/r 스칼라 단일 정밀도 FP 값을 Dword 정수로 변환
CVTSS2SIr64, xmm1/m32 F3 REX.W 0F 2D/r 스칼라 단일 정밀도 FP 값을 Qword 정수로 변환
유코미스 xmm1, xmm2/m32 0F 2E/r 스칼라 단일정밀 부동 소수점 값과 EFLAGS 집합의 순서에 상관없이 비교
COMISS xmm1, xmm2/m32 0F 2F/r 스칼라 순서의 단일-정밀 부동 소수점 값 비교 및 EFLAGS 설정
SQRTPS xmm1, xmm2/m128 0F51/r 충전된 단일정밀 부동 소수점값의 제곱근 계산에 관한 연구
SQRTSS xmm1, xmm2/m32 F30F51/r 스칼라 단일정밀 부동소수점 값의 제곱근 계산
RSQRTPS xmm1, xmm2/m128 0F52/r 충전된 단일정밀 부동소수점 값의 제곱근 역수 계산
RSQRTSS xmm1, xmm2/m32 F30F52/r 스칼라 단일정밀 부동소수점 값의 제곱근 역수 계산
RCPPS xmm1, xmm2/m128 0F53/r 충전된 단일정밀 부동소수점 값의 역수 계산법
RCPSS xmm1, xmm2/m32 F30F53/r 스칼라 단일정밀 부동소수점 값의 역수 계산법
ADDPS xmm1, xmm2/m128 0F58/r 패킹된 단일 정밀도 부동 소수점 값 추가
ADSS xmm1, xmm2/m32 F30F58/r 스칼라 단일 정밀 부동 소수점 값 추가
MULPS xmm1, xmm2/m128 0F59/r 패킹된 단일정밀 부동 소수점 값 곱하기
MULSS xmm1, xmm2/m32 F30F59/r 스칼라 단일정밀 부동 소수점 값 곱하기
SUBPS xmm1, xmm2/m128 0F 5C/r 채워진 단일 정밀 부동 소수점 값 빼기
SUBS xmm1, xmm2/m32 F30F 5C/r 스칼라 단일 정밀 부동 소수점 값 빼기
MINPS xmm1, xmm2/m128 0F 5D/r 최소 패킹된 단일 정밀 부동 소수점 값 반환
MINSS xmm1, xmm2/m32 F30F 5D/r 최소 스칼라 단일 정밀 부동 소수점 값 반환
DIVPS xmm1, xmm2/m128 0F 5E/r 패킹된 단일 정밀 부동 소수점 값 분할
DIBSS xmm1, xmm2/m32 F30F 5E/r 스칼라 단일 정밀 부동 소수점 값 분할
MAXPS xmm1, xmm2/m128 0F 5F/r 최대 패킹된 단일 정밀도 부동 소수점 값 반환
MAXSS xmm1, xmm2/m32 F30F 5F/r 최대 스칼라 단일 정밀 부동 소수점 값 반환
LDMXCSR m32 0FAE/2 MXCSR 레지스터 상태 로드
STMXCSR m32 0FAE/3 MXCSR 레지스터 상태 저장
CMPPS xmm1, xmm2/m128, imm8 0FC2/립 충전된 단일-정밀 부동 소수점 값 비교
CMPSS xmm1, xmm2/m32, imm8 F30FC2/립 스칼라 단일 정밀 부동 소수점 값 비교
SHUFPS xmm1, xmm2/m128, imm8 0FC6/립 Shuffle Packed 단일 정밀 부동 소수점 값
  • 부동 소수점 단일 비트 와이즈 연산 ANDPS, ANDNPS, ORPS 및 XORPS는 SSE2 정수(PAND, PANDN, POR, PXOR) 및 이중 정수(ANDPD, ANDNPD, ORPD, XORPD)와 동일한 결과를 생성하지만 잘못된 유형의 값을 적용하면 도메인 변경에 추가 지연 시간을 제공할 수 있습니다.[115]

SSE2 명령어

펜티엄 4 추가

IMT2000 3GPP - SSE2 SIMD 부동 소수점 명령어

SSE2 데이터 이동 지침
설명 옵코드 의미.
MOVAPD xmm1, xmm2/m128 660F 28/r 정렬된 포장된 이중 정밀 부동 소수점 값 이동
MOVAPD xmm2/m128, xmm1 660F 29/r 정렬된 포장된 이중 정밀 부동 소수점 값 이동
MOVNTPD m128, xmm1 660F 2B/r Non-Temporal Hint를 사용하여 패킹된 이중정밀 부동 소수점 값 저장
MOVHPD xmm1, m64 660F 16/r 고포장 이중정밀 부동 소수점 값 이동
MOVHPD m64, xmm1 660F 17/r 고포장 이중정밀 부동 소수점 값 이동
MOVLPD xmm1, m64 660F 12/r 낮은 패킹된 이중 정밀 부동 소수점 값 이동
MOVLPD m64, xmm1 660F 13/r 낮은 패킹된 이중 정밀 부동 소수점 값 이동
MOVUPD xmm1, xmm2/m128 660F 10/r 정렬되지 않은 포장된 이중 정밀 부동 소수점 값 이동
MOVUPD xmm2/m128, xmm1 660F 11/r 정렬되지 않은 포장된 이중 정밀 부동 소수점 값 이동
MOVMSKPD reg, xmm 660F 50/r 포장된 이중 정밀 부동 소수점 기호 마스크 추출
MOVSD* xmm1, xmm2/m64 F20F 10/r 스칼라 이중 정밀 부동 소수점 값 이동 또는 병합
MOVSD xmm1/m64, xmm2 F20F 11/r 스칼라 이중 정밀 부동 소수점 값 이동 또는 병합
SSE2 packed 산술 명령어
설명 옵코드 의미.
ADDPD xmm1, xmm2/m128 660F58/r 패킹된 이중 정밀 부동 소수점 값 추가
ADDSD xmm1, xmm2/m64 F20F58/r 낮은 이중 정밀도 부동 소수점 값 추가
DIVPD xmm1, xmm2/m128 660F 5E/r 패킹된 이중 정밀 부동 소수점 값 분할
DIBSD xmm1, xmm2/m64 F20F 5E/r 스칼라 이중정밀 부동 소수점 값 분할
MAXPD xmm1, xmm2/m128 660F 5F/r 충전된 이중정밀 부동 소수점 값의 최대치
MAXSD xmm1, xmm2/m64 F20F 5F/r 최대 스칼라 이중 정밀 부동 소수점 값 반환
MINPD xmm1, xmm2/m128 660F 5D/r 패킹된 이중정밀 부동 소수점값
MINSD xmm1, xmm2/m64 F20F 5D/r 최소 스칼라 이중 정밀 부동 소수점 값 반환
MULPD xmm1, xmm2/m128 660F 59/r 패킹된 이중정밀 부동 소수점 값 곱하기
MULSD xmm1,xmm2/m64 F20F59/r 스칼라 이중정밀 부동 소수점 값 곱하기
SQRTPD xmm1, xmm2/m128 660F51/r 이중정밀 부동소수점 값의 제곱근
SQRTSD xmm1,xmm2/m64 F20F51/r 스칼라 이중정밀 부동소수점 값의 제곱근 계산
SUBPD xmm1, xmm2/m128 660F 5C/r 패킹된 이중 정밀 부동 소수점 값 빼기
SUBSD xmm1, xmm2/m64 F20F 5C/r 스칼라 이중 정밀 부동 소수점 값 빼기
SSE2 논리 명령어
설명 옵코드 의미.
ANDPD xmm1, xmm2/m128 660F 54/r Packed Double Precision 부동 소수점 값의 비트와이즈 논리 AND
ANDNPD xmm1, xmm2/m128 660F55/r 패킹된 이중 정밀도 부동 소수점 값의 비트와이즈 논리
ORPD xmm1, xmm2/m128 660F56/r Packed Double Precision 부동 소수점 값의 비트 와이즈 논리적 논리합
XORPD xmm1, xmm2/m128 660F57/r Packed Double Precision 부동 소수점 값의 비트 와이즈 논리 XOR
SSE2 비교 지침
설명 옵코드 의미.
CMPPD xmm1, xmm2/m128, imm8 660FC2/립 패킹된 이중정밀 부동 소수점 값 비교
CMPSD* xmm1, xmm2/m64, imm8 F20FC2/립 낮은 이중정밀 부동 소수점 값 비교
COMISD xmm1, xmm2/m64 660F 2F/r 스칼라 순서 이중정밀 부동 소수점 값 비교 및 EFLAGS 설정
UCOMISD xmm1, xmm2/m64 660F 2E/r 스칼라 이중정밀 부동 소수점 값과 EFLAGS 집합의 순서에 상관없이 비교
SSE2 셔플 및 언팩 지침
설명 옵코드 의미.
SHUFPD xmm1, xmm2/m128, imm8 660FC6/립 이중정밀 부동소수점 값 쌍의 포장된 인터리브 셔플
UNPCKHPD xmm1, xmm2/m128 660F 15/r 포장된 고밀집 이중정밀 부동 소수점 값의 언팩 및 인터리브
UNPCKLPD xmm1, xmm2/m128 660F 14/r 포장된 저포장 이중정밀 부동 소수점 값의 언팩 및 인터리브
SSE2 변환 명령어
설명 옵코드 의미.
CVTDQ2PD xmm1, xmm2/m64 F30FE6/r 패킹된 이중 단어 정수를 패킹된 이중 정밀 부동 소수점 값으로 변환
CVTDQ2PS xmm1, xmm2/m128 0F 5B/r 패킹된 이중 단어 정수를 패킹된 단일 정밀도 부동 소수점 값으로 변환
CVTPD2DQ xmm1, xmm2/m128 F20FE6/r 패킹된 이중 정밀 부동 소수점 값을 패킹된 이중 단어 정수로 변환
CVTPD2PI mm, xmm/m128 660F 2D/r 패킹된 이중 정밀도 FP 값을 패킹된 Dword 정수로 변환
CVTPD2PS xmm1, xmm2/m128 660F 5A/r 충전된 이중정밀 부동점값을 충전된 단일정밀 부동점값으로 변환
CVTPI2PD xmm, mm/m64 660F 2A/r 패킹된 Dword 정수를 패킹된 이중 정밀도 FP 값으로 변환
CVTPS2DQ xmm1, xmm2/m128 660F 5B/r Packed single-precision 부동 소수점 값을 Packed signed double word integer 값으로 변환
CVTPS2PD xmm1, xmm2/m64 0F 5A/r 충전된 단일-정밀 부동 소수점 값을 충전된 이중-정밀 부동 소수점 값으로 변환
CVTSD2SIr32, xmm1/m64 F20F 2D/r 스칼라 이중 정밀 부동 소수점 값을 이중 단어 정수로 변환
CVTSD2SIr64, xmm1/m64 F2REX.W 0F 2D/r 스칼라 이중 정밀 부동 소수점 값을 부호 확장이 있는 쿼드워드 정수로 변환
CVTSD2SS xmm1, xmm2/m64 F20F 5A/r 스칼라 이중정밀 부동 소수점 값을 스칼라 단일정밀 부동 소수점 값으로 변환
CVTSI2SD xmm1, r32/m32 F20F2A/r 이중 단어 정수를 스칼라 이중 정밀 부동 소수점 값으로 변환
CVTSI2SD xmm1, r/m64 F2REX.W0F2A/r 쿼드워드 정수를 스칼라 이중 정밀 부동 소수점 값으로 변환
CVTSS2SD xmm1, xmm2/m32 F30F 5A/r 스칼라 단일정밀 부동점값을 스칼라 이중정밀 부동점값으로 변환
CVTTPD2DQ xmm1, xmm2/m128 660FE6/r 잘라내기 팩킹된 이중 정밀 부동 소수점 값을 팩킹된 이중 단어 정수로 변환
CVTTPD2PImm, xmm/m128 660F 2C/r 잘라내기 팩킹된 이중 정밀도 FP 값을 팩킹된 Dword 정수로 변환
CVTTPS2DQ xmm1, xmm2/m128 F30F 5B/r 잘라내기 팩킹된 단일 정밀 부동 소수점 값을 팩킹된 부호가 있는 이중 단어 정수 값으로 변환
CVTTSD2SI r32, xmm1/m64 F20F 2C/r 절단 스칼라 이중 정밀 부동 소수점 값을 부호화된 Dword 정수로 변환
CVTTSD2SIr64, xmm1/m64 F2REX.W0F2C/r 자르기 스칼라 이중 정밀 부동 소수점 값을 부호 있는 Qword 정수로 변환
  • CMPSD MOVSD는 문자열 명령어 니모닉스 CMPSD(CMPS) MOVSD(MOVS)와 동일한 이름갖지만, 전자는 스칼라 이중 정밀 부동 소수점(skalar double-precision floating-point)의미하고 후자는 이중 단어 문자열을 의미합니다. 어셈블러는 피연산자의 유무에 따라 그들을 명확하게 구분합니다.

SSE2 SIMD 정수 명령어

SSE 레지스터에 확장된 SSE2 MMX와 유사한 명령어

SSE2를 사용하면 SSE 레지스터에 MMX 명령을 실행할 수 있으며, 데이터 양의 두 배를 한 번에 처리할 수 있습니다.

설명 옵코드 의미.
MOVD xmm, r/m32 660F 6E/r 이중단어이동
MOVDr/m32, xmm 660F 7E/r 이중단어이동
MOVQ xmm1, xmm2/m64 F30F 7E/r 쿼드워드 이동
MOVQ xmm2/m64, xmm1 660F D6/r 쿼드워드 이동
MOVQr/m64, xmm 66REX.W0F 7E/r 쿼드워드 이동
MOVQ xmm, r/m64 66REX.W0F 6E/r 쿼드워드 이동
PMOVMSKB reg, xmm 660F D7/r 레지스터의 상위 비트를 영점화하여 바이트 마스크 이동
PEXTRW reg,xmm,im8 660FC5/립 지정된 단어를 추출하고 reg로 이동하여 비트 15-0을 설정하고 나머지를 영점화합니다.
핀스RW xmm, r32/m16, imm8 660FC4/립 지정한 워드 위치에서 낮은 워드 이동
PACKSSDWxmm1,xmm2/m128 660F 6B/r 4개의 포장된 서명 이중 단어 정수를 채도가 있는 8개의 포장된 서명 단어 정수로 변환합니다.
PAKSSWBxmm1,xmm2/m128 660F63/r 8개의 포장된 서명 단어 정수를 채도가 있는 16개의 포장된 서명 바이트 정수로 변환합니다.
PACKUSWB xmm1, xmm2/m128 660F67/r 8개의 부호가 있는 단어 정수를 채도가 있는 16개의 부호가 없는 바이트 정수로 변환합니다.
PADDB xmm1, xmm2/m128 660F FC/r 포장된 바이트 정수 추가
PADDWxmm1,xmm2/m128 660F FD/r 포장된 단어 정수 추가
PADDD xmm1, xmm2/m128 660F FE/r 포장된 이중 단어 정수 추가
PADDQ xmm1, xmm2/m128 660F D4/r 포장된 쿼드워드 정수를 추가합니다.
PADDSB xmm1, xmm2/m128 660 FEC/r 채도가 있는 포장된 부호 있는 바이트 정수 추가
PADDSWxmm1,xmm2/m128 660FED/r 채도가 있는 포장된 부호어 정수 추가
PADDUSB xmm1, xmm2/m128 660F DC/r 채도가 있는 포장된 서명되지 않은 바이트 정수 추가
PADDUSWxmm1,xmm2/m128 660F DD/r 채도가 있는 포장된 부호 없는 단어 정수 추가
PAND xmm1, xmm2/m128 660F DB/r 비트와이즈 AND
PANDN xmm1, xmm2/m128 660F DF/r 비트 와이즈 앤 낫
POR xmm1, xmm2/m128 660FEB/r 비트와이즈 OR
PXOR xmm1, xmm2/m128 660F EF/r 비트와이즈 XOR
PCMPEQB xmm1, xmm2/m128 660F74/r 포장된 바이트와 동일성을 비교합니다.
PCMPEQWxmm1,xmm2/m128 660F75/r 포장된 단어를 동등성과 비교합니다.
PCMPEQD xmm1, xmm2/m128 660F76/r 포장된 이중 단어를 비교하여 동일성을 확인합니다.
PCMPGTB xmm1, xmm2/m128 660F64/r packed signed byte 정수를 다음 값보다 큰 값으로 비교합니다.
PCMPGTWxmm1,xmm2/m128 660F65/r 다음 값보다 큰 값에 대한 포장된 부호어 정수 비교
PCMPGTD xmm1, xmm2/m128 660F66/r packed signed 이중 단어 정수를 다음보다 큰 값으로 비교합니다.
PMULWxmm1,xmm2/m128 660F D5/r 포장된 부호어 정수에 채도를 곱합니다.
PMULHW xmm1, xmm2/m128 660FE5/r 압축된 부호어 정수를 곱하고 결과의 높은 16비트를 저장합니다.
PMULHUWxmm1,xmm2/m128 660FE4/r 포장된 부호 없는 단어 정수를 곱하고 결과의 높은 16비트를 저장합니다.
PMULUDQ xmm1, xmm2/m128 660F F4/r 포장된 부호 없는 이중 단어 정수 곱하기
PSLLW xmm1, xmm2/m128 660F F1/r 0초 단위로 변속하는 동안 단어를 왼쪽으로 이동
PSLLW xmm1, im8 660F 71/6ib 0초 단위로 변속하는 동안 단어를 왼쪽으로 이동
PSLLD xmm1, xmm2/m128 660F F2/r 0초 단위로 변속하는 동안 이중 단어를 왼쪽으로 변속
PSLLD xmm1, im8 660F 72/6ib 0초 단위로 변속하는 동안 이중 단어를 왼쪽으로 변속
PSLLQ xmm1, xmm2/m128 660F F3/r 0초 안에 쿼드워드를 시프트하면서 왼쪽으로 이동
PSLLQ xmm1, im8 660F 73/6ib 0초 안에 쿼드워드를 시프트하면서 왼쪽으로 이동
PSRAD xmm1, xmm2/m128 660FE2/r 부호 비트를 이동하는 동안 두 단어를 오른쪽으로 이동
PSRAD xmm1, im8 660F 72/4ib 부호 비트를 이동하는 동안 두 단어를 오른쪽으로 이동
PSRAW xmm1, xmm2/m128 660FE1/r 부호 비트를 이동하면서 단어를 오른쪽으로 이동
PSRAW xmm1, imm8 660F 71/4ib 부호 비트를 이동하면서 단어를 오른쪽으로 이동
PSRLW xmm1, xmm2/m128 660F D1/r 0초 단위로 이동하면서 단어를 오른쪽으로 이동
PSRLWxmm1, im8 660F 71/2ib 0초 단위로 이동하면서 단어를 오른쪽으로 이동
PSRLD xmm1, xmm2/m128 660F D2/r 0초 단위로 이동하면서 두 단어를 오른쪽으로 이동
PSRLD xmm1, im8 660F 72/2ib 0초 단위로 이동하면서 두 단어를 오른쪽으로 이동
PSRLQ xmm1, xmm2/m128 660F D3/r 0초 안에 쿼드어를 오른쪽으로 시프트
PSRLQ xmm1, im8 660F 73/2ib 0초 안에 쿼드어를 오른쪽으로 시프트
PSUBB xmm1, xmm2/m128 660F F8/r 포장된 바이트 정수 빼기
PSUBW xmm1, xmm2/m128 660F F9/r 포장된 단어 정수 빼기
PSUBD xmm1, xmm2/m128 660F FA/r 포장된 이중 단어 정수 빼기
PSUBQ xmm1, xmm2/m128 660F FB/r 포장된 쿼드워드 정수를 풉니다.
PSUBSB xmm1, xmm2/m128 660FE8/r 채도가 있는 포장된 부호 있는 바이트 정수 빼기
PSUBSW xmm1, xmm2/m128 660FE9/r 채도가 있는 포장된 부호어 정수 빼기
PMADDWD xmm1, xmm2/m128 660F F5/r 채워진 단어 정수를 곱하고 인접한 이중 단어 결과를 추가합니다.
PSUBUSB xmm1, xmm2/m128 660F D8/r 채도가 있는 포장된 부호 없는 바이트 정수 빼기
PSUBUSWxmm1,xmm2/m128 660F D9/r 채도가 있는 포장된 부호 없는 단어 정수 빼기
PUNPCKHBWxmm1,xmm2/m128 660F68/r 고차 바이트 포장 및 인터리브
PUNPCKHWDxmm1,xmm2/m128 660F69/r 높은 순서의 단어를 풀고 서로 바꿉니다.
PUNPCKHDQ xmm1, xmm2/m128 660F 6A/r 고차 이중 단어 포장 및 인터리브
PUNPCCKLBWxmm1,xmm2/m128 660F 60/r 하위 바이트 인터리브
PUNPCCKLWD xmm1, xmm2/m128 660F 61/r 하위 단어 인터리브
PUNPCCKLDQ xmm1, xmm2/m128 660F62/r 저차 이중 단어 인터리브
PAVGB xmm1, xmm2/m128 660FE0, /r 반올림한 평균 포장된 부호 없는 바이트 정수
PAVGW xmm1, xmm2/m128 660FE3/r 반올림이 있는 평균 포장된 부호 없는 단어 정수
PMINUB xmm1, xmm2/m128 660F DA/r 포장된 비부호 바이트 정수 비교 및 포장된 최소값 저장
PMINSW xmm1, xmm2/m128 660FEA/r 포장된 부호어 정수 비교 및 포장된 최소값 저장
PMAXSW xmm1, xmm2/m128 660 FEE/r 포장된 부호어 정수 비교 및 포장된 최대 값 저장
PMAXUB xmm1, xmm2/m128 660F DE/r 포장된 부호 없는 바이트 정수 비교 및 포장된 최대값 저장
PSADBW xmm1, xmm2/m128 660F F6/r 포장된 부호 없는 바이트 정수의 절대 차이를 계산합니다. 그런 다음 8개의 낮은 차이와 8개의 높은 차이를 각각 합산하여 부호 없는 단어 정수 결과를 생성합니다.
SSE 레지스터 전용 SSE2 정수 명령

다음 지침은 본질적으로 MMX 레지스터에서 작동하지 않으므로 SSE 레지스터에서만 사용할 수 있습니다.

설명 옵코드 의미.
MASKMOVDQU xmm1, xmm2 660F F7/r XMM 레지스터에서 메모리로 선택한 바이트의 비일시적 저장
MOVDQ2Qmm, xmm F20F D6/r 낮은 쿼드워드를 XMM에서 MMX 레지스터로 이동합니다.
MOVDQA xmm1, xmm2/m128 660F 6F/r 정렬된 이중 쿼드어 이동
MOVDQA xmm2/m128, xmm1 660F 7F/r 정렬된 이중 쿼드어 이동
MOVDQU xmm1, xmm2/m128 F30F 6F/r 정렬되지 않은 이중 쿼드어 이동
MOVDQU xmm2/m128, xmm1 F30F 7F/r 정렬되지 않은 이중 쿼드어 이동
MOVQ2DQ xmm,mm F30F D6/r 쿼드워드를 MMX 레지스터에서 XMM 레지스터의 로우 쿼드워드로 이동합니다.
MOVNTDQ m128, xmm1 660FE7/r 비일시적 힌트를 사용하여 채워진 정수 저장
PSHUFHW xmm1, xmm2/m128, imm8 F30F70/립 격조 높은 말들을 섞습니다.
PSHUFLW xmm1, xmm2/m128, imm8 F20F70/립 포장된 낮은 단어들을 섞습니다.
PSHUFD xmm1, xmm2/m128, imm8 660F70/립 포장된 이중 단어를 섞습니다.
PSLLDQ xmm1, im8 660F 73/7ib 이동 왼쪽 논리 이중 쿼드어가 가득 찼습니다.
PSRLDQ xmm1, im8 660F 73/3ib 이동 오른쪽 논리 이중 쿼드어가 가득 찼습니다.
PUNPCKHQDQxmm1,xmm2/m128 660F 6D/r 고차 쿼드어를 풀고 인터리브합니다.
PUNPCCKLQDQxmm1,xmm2/m128 660F 6C/r 낮은 쿼드워드를 인터리브하고,

SSE3 명령어

SSE3를 지원하는 Pentium 4 추가

IMT2000 3GPP - SSE3 SIMD 부동 소수점 명령어

설명 옵코드 의미. 메모들
ADDSUBPS xmm1, xmm2/m128 F20F D0/r 단일 정밀 부동 소수점 값 추가/감산출 복소산의 경우
ADDSUBPD xmm1, xmm2/m128 660F D0/r 두 배 정밀 부동 소수점 값 추가/감산
MOVDDUP xmm1, xmm2/m64 F20F 12/r 이중 정밀 부동 소수점 값 이동 및 중복
MOVSLDUP xmm1, xmm2/m128 F30F 12/r 짝수 인덱스 단일 정밀 부동 소수점 값 이동 및 복제
MOBSHDUP xmm1, xmm2/m128 F30F16/r 홀수 인덱스 단일 정밀 부동 소수점 값 이동 및 복제
HADDPS xmm1, xmm2/m128 F20F 7C/r 포장된 단일 정밀 부동 소수점 값을 수평으로 추가합니다. 그래픽용
HADDPD xmm1, xmm2/m128 660F 7C/r 포장된 이중 정밀 부동 소수점 값을 수평으로 추가합니다.
HSUBPS xmm1, xmm2/m128 F20F 7D/r 수평 빼기 포장된 단일 정밀 부동 소수점 값
HSUBPD xmm1, xmm2/m128 660F 7D/r 수평 빼기 패킹된 이중 정밀 부동 소수점 값

IMT2000 3GPP - SSE3 SIMD 정수 명령어

설명 옵코드 의미. 메모들
LDDQU xmm1, 멤 F20FF0/r 정렬되지 않은 데이터 로드 및 이중 쿼드워드 반환 MOVDQU와 명령적으로 동등합니다. 비디오 인코딩의 경우

SSSE3 명령어

Xeon 5100 시리즈 및 초기 Core 2 추가

SSE 레지스터로 확장된 다음 MMX와 같은 명령어가 SSSE3에 추가되었습니다.

설명 옵코드 의미.
PSIGNB xmm1, xmm2/m128 660F 3808/r 해당 부호에 따라 negate/zero/packed byte 정수 보존
PSIGNW xmm1, xmm2/m128 660F 3809/r 해당 부호에 따라 negate/zero/packed word 정수 보존
PSIGND xmm1, xmm2/m128 660F 380A/r 대응하는 경우에 따라 negate/zero/packed 이중 단어 정수 유지
PSHUFB xmm1, xmm2/m128 660F 3800/r 바이트 셔플
PMULHRSWxmm1,xmm2/m128 660F 380B/r 16비트 부호어 곱하기, 축척 및 둥근 부호어 이중 단어, 팩 하이 16비트
PMADDUBSWxmm1,xmm2/m128 660F 3804/r 서명된 바이트와 서명되지 않은 바이트 곱하기, 서명된 단어의 수평 쌍 추가, 포화된 서명된 단어 팩
PHSUBW xmm1, xmm2/m128 660F 3805/r 16비트 부호 정수를 뺀 후 가로로 포장
PHSUBSW xmm1, xmm2/m128 660F 3807/r 16비트 부호 정수를 빼서 채도로 수평으로 포장
PHSUBD xmm1, xmm2/m128 660F 3806/r 32비트 부호 정수를 뺀 후 가로로 포장
PADDSW xmm1, xmm2/m128 660F 3803/r 16비트 부호 정수를 채도와 함께 수평으로 추가 및 포장
PADDW xmm1, xmm2/m128 660F 3801/r 16비트 정수를 가로로 추가하고 포장합니다.
PHADDD xmm1, xmm2/m128 660F 3802/r 32비트 정수를 가로로 추가하고 포장합니다.
PALIGNR xmm1, xmm2/m128, im8 660F 3A 0F/립 대상 및 소스 피연산자 연결, 오른쪽으로 이동된 바이트 정렬 결과 추출
PABSB xmm1, xmm2/m128 660F 38 1C/r 바이트의 절대값 계산 및 서명되지 않은 결과 저장
PABSW xmm1, xmm2/m128 660F 38 1D/r 16비트 정수의 절대값 계산 및 서명되지 않은 결과 저장
PABSD xmm1, xmm2/m128 660F 38 1E/r 32비트 정수의 절대값 계산 및 서명되지 않은 결과 저장

SSE4 명령어

SSE 4.1

45nm로 제작된 Core 2 추가

SSE 4.1 SIMD 부동 소수점 지시사항
설명 옵코드 의미.
DPPS xmm1, xmm2/m128, imm8 660F 3A 40/립 패킹된 SP 부동 소수점 값을 선택적으로 곱하여 추가 및 선택적으로 저장
DPPD xmm1, xmm2/m128, im8 660F 3A41/립 패킹된 DP 부동 소수점 값을 선택적으로 곱하여 추가 및 선택적으로 저장
BLENDS xmm1, xmm2/m128, imm8 660F 3A 0C/립 지정된 마스크에서 포장된 단일 정밀 부동 소수점 값 선택
BLENDVPS xmm1, xmm2/m128, <XMM0> 660F 38 14/r 지정된 마스크에서 포장된 단일 정밀 부동 소수점 값 선택
BLANDPD xmm1, xmm2/m128, imm8 660F 3A 0D/립 지정된 마스크에서 포장된 DP-FP 값 선택
BLENDVPD xmm1, xmm2/m128, <XMM0> 660F 38 15/r 지정된 마스크에서 포장된 DP FP 값 선택
ROUNDPS xmm1, xmm2/m128, imm8 660F 3A 08/립 둥글게 포장된 단일 정밀 부동 소수점 값
ROUNDSS xmm1, xmm2/m32, imm8 660F 3A 0A/립 저포장된 단일 정밀 부동 소수점 값 반올림
ROUNDPD xmm1, xmm2/m128, imm8 660F 3A09/립 라운드 포장된 이중 정밀 부동 소수점 값
RAUNDSD xmm1, xmm2/m64, imm8 660F 3A 0B/립 낮은 포장된 이중 정밀도 부동 소수점 값 반올림
INSERPS xmm1, xmm2/m32, imm8 660F 3A21/립 지정된 대상 요소 및 제로 아웃 대상 요소에 선택된 단일 정밀 부동 소수점 값 삽입
EXCTRPS reg/m32, xmm1, imm8 660F 3A 17/립 지정된 오프셋에서 단일 정밀 부동 소수점 값을 하나 추출하고 결과를 저장합니다(해당하는 경우 0-확장).
SSE 4.1 SIMD 정수 명령어
설명 옵코드 의미.
MPSADBW xmm1, xmm2/m128, imm8 660F 3A42/립 시작 오프셋을 사용하여 4바이트 정수의 인접 그룹의 절대 8비트 정수 차이를 합합니다.
PHMINPOSUWxmm1,xmm2/m128 660F 38 41/r 부호 없는 최소 단어 찾기
PMULLD xmm1, xmm2/m128 660F 38 40/r packed dword signed 정수를 곱하고 low 32 bits를 저장합니다.
PMULDQ xmm1, xmm2/m128 660F 38 28/r 포장된 부호 이중 단어 정수 곱하기 및 쿼드 단어 결과 저장
PBLENDVB xmm1, xmm2/m128, <XMM0> 660F 38 10/r 지정된 마스크에서 바이트 값 선택
PBLENDWxmm1,xmm2/m128, imm8 660F 3A 0E/립 지정된 마스크에서 단어 선택
PMINSB xmm1, xmm2/m128 660F3838/r 포장된 부호 있는 바이트 정수 비교
PMINUWxmm1,xmm2/m128 660F 38 3A/r 포장된 비부호 단어 정수 비교
PMINSD xmm1, xmm2/m128 660F 38 39/r packed signed dword 정수 비교
PMINUD xmm1, xmm2/m128 660F 38 3B/r 포장된 비부호 단어 정수 비교
PMAXSB xmm1, xmm2/m128 660F 38 3C/r 포장된 부호 있는 바이트 정수 비교
PMAXUWxmm1,xmm2/m128 660F 38 3E/r 포장된 비부호 단어 정수 비교
PMAXSD xmm1, xmm2/m128 660F 38 3D/r packed signed dword 정수 비교
PMAXUD xmm1, xmm2/m128 660F 38 3F/r 포장된 비부호 단어 정수 비교
핀스RB xmm1, r32/m8, imm8 660F 3A 20/립 지정한 대상 요소에 바이트 정수 값 삽입
PINSRD xmm1, r/m32, imm8 660F 3A22/립 지정한 대상 요소에 정수 값을 삽입합니다.
핀스RQ xmm1, r/m64, imm8 66REX.W0F3A22/립 지정한 대상 요소에 qword 정수 값 삽입
PEXTRB reg/m8,xmm2,im8 660F 3A 14/립 소스 바이트 오프셋에서 바이트 정수 값을 추출하면 상위 비트가 0이 됩니다.
PEXTRW reg/m16,xmm,im8 660F 3A 15/립 워드를 추출하여 최소 16비트로 복사, 0-확장
PEXTRD r/m32, xmm2, imm8 660F 3A 16/립 source dword offset에서 dword 정수 값 추출
PEXTRQ r/m64, xmm2, imm8 66REX.W0F3A16/립 소스 qword 오프셋에서 qword 정수 값 추출
PMOVSXBWxmm1,xmm2/m64 660f 38 20/r 부호는 8개의 패킹된 8비트 정수를 8개의 패킹된 16비트 정수로 확장합니다.
PMOVZXBWxmm1,xmm2/m64 660f 38 30/r 8비트 정수를 8비트 정수로 확장하여 16비트 정수 8개로 확장
PMOVSXBD xmm1, xmm2/m32 660f 38 21/r 부호는 4개의 패킹된 8비트 정수를 4개의 패킹된 32비트 정수로 확장합니다.
PMOVZXBD xmm1, xmm2/m32 660f 38 31/r 4개의 패킹된 8비트 정수에서 4개의 패킹된 32비트 정수로 0 확장
PMOVSXBQ xmm1, xmm2/m16 660f 38 22/r 부호는 2개의 패킹된 8비트 정수를 2개의 패킹된 64비트 정수로 확장합니다.
PMOVZXBQ xmm1, xmm2/m16 660f 38 32/r 8비트 정수 2개를 64비트 정수 2개로 확장 0
PMOVSXWD xmm1, xmm2/m64 660f 38 23/r 부호는 16비트 정수 4개를 32비트 정수 4개로 확장합니다.
PMOVZXWD xmm1, xmm2/m64 660f 38 33/r 16비트 정수 4개를 32비트 정수 4개로 확장 0
PMOVSXWQ xmm1, xmm2/m32 660f 38 24/r 부호는 16비트 정수 2개를 64비트 정수 2개로 확장합니다.
PMOVZXWQ xmm1, xmm2/m32 660f 38 34/r 16비트 정수 2개를 64비트 정수 2개로 확장 0
PMOVSXDQ xmm1, xmm2/m64 660f 38 25/r 부호는 32비트 정수 2개를 64비트 정수 2개로 확장합니다.
PMOVZXDQ xmm1, xmm2/m64 660f 3835/r 32비트 정수 2개를 64비트 정수 2개로 확장 0
PTEST xmm1, xmm2/m128 660F 3817/r 결과가 모두 0이면 ZF를 설정하고 결과가 모두 0이면 CF를 설정하고 결과가 모두 0이면 CF를 설정합니다.
PCMPEQQ xmm1, xmm2/m128 660F 38 29/r packed qwords의 동일성 비교
PACKUSDWxmm1,xmm2/m128 660F 38 2B/r 2×4 포장된 부호 이중 단어 정수를 채도가 있는 8개의 포장된 부호 없는 단어 정수로 변환
MOVNTDQA xmm1, m128 660F 382A/r WC 메모리 유형인 경우 시간적 힌트를 사용하여 이중 쿼드워드 이동

SSE4a

페놈 프로세서 추가

설명 옵코드 의미.
엑스트라큐 660F 78/0ibib 레지스터에서 필드 추출
660F79/r
INSERTQ F20F78/립 필드 삽입
F20F79/r
MOVNTSD F20F 2B/r 비일시 스칼라 이중 정밀 부동 소수점 이동
MOVNTSS F30F2B/r 비일시 스칼라 단일 정밀 부동 소수점 이동

SSE 4.2

Nehalem 프로세서 추가

설명 옵코드 의미.
PCMPESTRI xmm1, xmm2/m128, imm8 660F 3A 61/림8 명시적인 길이를 가진 문자열 데이터의 팩된 비교, 인덱스 생성
PCMPESTRM xmm1, xmm2/m128, imm8 660F 3A 60/림8 명시적인 길이를 가진 문자열 데이터의 팩식 비교, 마스크 생성
PCMPISTRI xmm1, xmm2/m128, imm8 660F 3A63/림8 암시적 길이를 가진 문자열 데이터의 팩된 비교, 인덱스 생성
PCMPISTRM xmm1, xmm2/m128, imm8 660F 3A 62/림8 암시적 길이를 가진 문자열 데이터의 팩식 비교, 마스크 생성
PCMPGTQ xmm1,xmm2/m128 660F3837/r packed signed qwords의 값이 다음보다 큰지 비교합니다.

F16C

반정밀 부동 소수점 변환입니다.

설명 의미.
VCVTPH2PS xmmreg, xmmrm64 메모리에 있는 4개의 반정밀 부동 소수점 값 또는 XMM 레지스터의 하단 절반을 XMM 레지스터에 있는 4개의 단일 정밀 부동 소수점 값으로 변환
VCVTPH2P symreg, xmmrm128 메모리 또는 XMM 레지스터(YMM 레지스터의 하단 절반)에 있는 8개의 반정밀 부동 소수점 값을 YMM 레지스터에 있는 8개의 단일 정밀 부동 소수점 값으로 변환
VCVTPS2PH xmmrm64,xmmreg,im8 XMM 레지스터의 4개의 단일 정밀 부동 소수점 값을 메모리의 반정밀 부동 소수점 값 또는 XMM 레지스터의 하단 반정밀 부동 소수점 값으로 변환
VCVTPS2PH xmmrm128,ymmreg,im8 YMM 레지스터의 8개의 단일 정밀 부동 소수점 값을 메모리 또는 XMM 레지스터의 반정밀 부동 소수점 값으로 변환

AVX

AVX는 Sandy Bridge를 사용하는 Intel과 Buldozer를 사용하는 AMD에 의해 처음 지원되었습니다.

256비트 레지스터의 벡터 연산.

설명 묘사
VBROADCSS 32비트, 64비트 또는 128비트 메모리 피연산자를 XMM 또는 YMM 벡터 레지스터의 모든 요소에 복사합니다.
VBROADCSD
VBROADCASTF128
VINSERTF128 256비트 YMM 레지스터의 하위 절반 또는 상위 절반을 128비트 소스 피연산자 값으로 바꿉니다.목적지의 나머지 절반은 변경되지 않습니다.
VEXTRACTF128 256비트 YMM 레지스터의 절반 또는 절반 이상을 추출하고 128비트 대상 피연산자에 값을 복사합니다.
VMASKMOVPS SIMD 벡터 메모리 피연산자에서 대상 레지스터로 임의 수의 요소를 조건부로 읽어 들이고 나머지 벡터 요소는 읽지 않은 채로 두고 대상 레지스터에 있는 해당 요소를 0으로 설정합니다.또는 조건부로 SIMD 벡터 레지스터 피연산자에서 벡터 메모리 피연산자에 임의 수의 요소를 기록하고 메모리 피연산자의 나머지 요소는 변경되지 않습니다.AMD Jaguar 프로세서 아키텍처에서 메모리 소스 피연산자를 사용하는 이 명령어는 마스크가 0일 때 300번 이상의 클럭 사이클이 소요되며, 이 경우 명령어는 아무런 조치도 취하지 않습니다.이는 설계상의 결함으로 보입니다.[116]
VMASKMOVPD
VPERMILPS 차선 내 순열입니다.한 입력 피연산자의 32비트 또는 64비트 벡터 요소를 섞습니다.이 명령어들은 레인 내 256비트 명령어들로, 두 개의 개별 128비트 셔플이 있는 모든 256비트에서 작동하므로 128비트 레인에서 셔플할 수 없습니다.[117]
VPERMILPD
VPERM2F128 즉시 상수를 선택기로 사용하여 두 개의 256비트 소스 피연산자 중 네 개의 128비트 벡터 요소를 256비트 대상 피연산자로 섞습니다.
VZEROALL 모든 YMM 레지스터를 0으로 설정하고 미사용으로 태그를 지정합니다.128비트 사용과 256비트 사용을 전환할 때 사용합니다.
VZEROUPER 모든 YMM 레지스터의 위쪽 절반을 0으로 설정합니다.128비트 사용과 256비트 사용을 전환할 때 사용합니다.

AVX2

인텔의 하스웰 마이크로아키텍처와 AMD의 굴삭기에 소개되었습니다.

대부분의 벡터 정수 SSE 및 AVX 명령어를 256비트로 확장

설명 묘사
VBROADCSS 32비트 또는 64비트 레지스터 피연산자를 XMM 또는 YMM 벡터 레지스터의 모든 요소에 복사합니다.AVX1의 동일한 지침의 레지스터 버전입니다.128비트 버전은 없지만 VINSERTF128을 사용하면 동일한 효과를 얻을 수 있습니다.
VBROADCSD
VPBROADCASTB 8, 16, 32 또는 64비트 정수 레지스터 또는 메모리 피연산자를 XMM 또는 YMM 벡터 레지스터의 모든 요소에 복사합니다.
VP BroadcastW
VP Broadcastd
VPBROADCASTQ
VBROADCASTI128 128비트 메모리 피연산자를 YMM 벡터 레지스터의 모든 요소에 복사합니다.
VINSERTI128 256비트 YMM 레지스터의 하위 절반 또는 상위 절반을 128비트 소스 피연산자 값으로 바꿉니다.목적지의 나머지 절반은 변경되지 않습니다.
VEXTRACTI128 256비트 YMM 레지스터의 절반 또는 절반 이상을 추출하고 128비트 대상 피연산자에 값을 복사합니다.
VGATHERDPD 32비트 또는 64비트 인덱스와 축척을 사용하여 단일 또는 이중 정밀 부동 소수점 값을 수집합니다.
VGATHERQPD
VGATERDPS
VGATHERQPS
VPGATHERDD 32비트 또는 64비트 인덱스와 스케일을 사용하여 32비트 또는 64비트 정수 값을 수집합니다.
VPGATHERDQ
VPGATHERQD
VPGATHERQQ
VPMASKMOVD SIMD 벡터 메모리 피연산자에서 대상 레지스터로 임의 수의 요소를 조건부로 읽어 들이고 나머지 벡터 요소는 읽지 않은 채로 두고 대상 레지스터에 있는 해당 요소를 0으로 설정합니다.또는 조건부로 SIMD 벡터 레지스터 피연산자에서 벡터 메모리 피연산자에 임의 수의 요소를 기록하고 메모리 피연산자의 나머지 요소는 변경되지 않습니다.
VPMASKMOVQ
VPERMPS 레지스터 또는 메모리 피연산자를 선택기로 사용하여 하나의 256비트 소스 피연산자의 32비트 벡터 요소 8개를 256비트 대상 피연산자로 섞습니다.
VPERMD
VPERMPD 레지스터 또는 메모리 피연산자를 선택기로 사용하여 하나의 256비트 소스 피연산자의 64비트 벡터 요소 4개를 256비트 대상 피연산자로 섞습니다.
VPERMQ
VPERM2I128 2개의 256비트 소스 피연산자의 128비트 벡터 요소 4개를 즉시 상수를 선택기로 사용하여 256비트 대상 피연산자로 셔플(2개)합니다.
VPBLENDD SSE4의 PBLEND 지침을 즉시 이중 단어로 표현합니다.
VPSLLVD 왼쪽 논리 전환.각 요소가 채워진 입력에 따라 이동되는 가변 이동을 허용합니다.
VPSLLVQ
VPSRLVD 우측 논리 전환.각 요소가 채워진 입력에 따라 이동되는 가변 이동을 허용합니다.
VPSRLVQ
VPSRAVD 산술적으로 오른쪽으로 이동합니다.각 요소가 채워진 입력에 따라 이동되는 가변 이동을 허용합니다.

FMA3 및 FMA4 지침

부동 소수점 융합 다중 덧셈 명령어는 x86에서 두 개의 명령어 세트 확장인 "FMA3"와 "FMA4"로 도입되었으며, 둘 다 AVX 위에 구축되어 xmm/ymm/zmm 벡터 레지스터를 사용하여 일련의 스칼라/벡터 명령어를 제공합니다.FMA3는 3개의 입력 피연산자를 사용하고 그 결과를 그들 중 첫 번째 피연산자에 다시 쓰는 3-oper 및 fused-multiple-add 명령어 세트를 정의합니다.FMA4는 4개의 입력 피연산자(대상 피연산자와 3개의 소스 피연산자)를 사용하는 4개의 피연산자 및 융합 다중 가산 명령어 세트를 정의합니다.

FMA3는 Haswell부터 시작하는 Intel CPU, Liledriver부터 시작하는 AMD CPU, YongFeng부터 시작하는 Zhaoxin CPU에서 지원됩니다.FMA4는 AMD 제품군 15h(Buldozer) CPU에서만 지원되었으며 AMD Zen 이후로는 지원되지 않습니다.FMA3/FMA4 확장은 AVX 또는 AVX2의 본질적인 부분으로 간주되지 않지만 AVX2를 지원하는 모든 Intel 및 AMD(Zhaoxin은 제외) 프로세서도 FMA3를 지원합니다. 그러나 FMA3 명령어(EVX 인코딩 형태)는 AVX-512 기초 명령어입니다.
FMA3 및 FMA4 명령 세트는 모두 FP32 및 FP64 변형으로 제공되는 10개의 융합-다중 추가 작업 세트를 정의합니다.이러한 각 변형에 대해 FMA3는 3개의 피연산자 순서를 정의하고 FMA4는 2개를 정의합니다.
FMA3 인코딩
FMA3 명령어는 VEX 또는 EVEX 접두사를 사용하여 인코딩됩니다 – 형식 상에서VEX.66.0F38 xy /r아니면EVEX.66.0F38 xy /r. VEX.EVEX와 함께.W 비트는 부동 소수점 형식을 선택합니다(W=0은 FP32, W=1은 FP64).opcode 바이트xy두 개의 니블로 구성되어 있으며, 상단 니블로 구성되어 있습니다.x피연산자 순서를 선택합니다(9='132',A='213',B='231') 및 아래쪽 니블y(값 6..F) 는 10개의 Fused-multiply 추가 작업 중 수행할 작업을 선택합니다. (x그리고.y주어진 범위를 벗어나면 FMA3 명령이 아닌 것이 발생합니다.)
어셈블리 언어 수준에서 피연산자 순서는 명령어의 기억법으로 지정됩니다.

  • vfmadd132sd xmm1,xmm2,xmm3공연할 것입니다.xmm1 ← (xmm1*xmm3)+xmm2
  • vfmadd213sd xmm1,xmm2,xmm3공연할 것입니다.xmm1 ← (xmm2*xmm1)+xmm3
  • vfmadd231sd xmm1,xmm2,xmm3공연할 것입니다.xmm1 ← (xmm2*xmm3)+xmm1

모든 FMA3 변형의 경우 처음 두 인수는 xmm/ymm/zmm 벡터 레지스터 인수여야 하며 마지막 인수는 벡터 레지스터 또는 메모리 인수일 수 있습니다.AVX-512 하에서, EVEX 인코딩 변형은 EVEX 프리픽스 인코딩 방송, 옵마스크 및 라운딩 제어를 지원합니다.
사파이어 Rapids에 도입된 AVX512-FP16 확장 기능은 FMA3 지침의 FP16 변형을 추가한 것으로, 이들은 모두 다음과 같은 형태를 띠고 있습니다.EVEX.66.MAP6.W0 xy /ropcode 바이트는 FP32/FP64 변형과 동일한 방식으로 작동합니다. (FMA4 지침의 경우 FP16 변형은 정의되지 않습니다.)
FMA4 인코딩
FMA4 명령어는 VEX 접두사를 사용하여 인코딩됩니다.VEX.66.0F3A xx /r ib(EVEX 인코딩은 정의되지 않음).opcode 바이트xx는 하단 비트를 사용하여 부동 소수점 형식(0=FP32, 1=FP64)을 선택하고 나머지 비트는 수행할 10개의 융합 multiply 추가 작업 중 하나를 선택합니다.

FMA4의 경우, 피연산자 주문은 VEX에 의해 제어됩니다.W bit. 만약 VEX.W=0이면 세 번째 피연산자는 명령의 ModR/M 바이트로 지정된 r/m 피연산자이고 네 번째 피연산자는 명령의 ib(8비트 즉시) 부분의 비트 7:4로 지정된 레지스터 피연산자입니다.VEX라면.W=1이면 이 두 피연산자가 스왑됩니다.예를 들어,

  • vfmaddsd xmm1,xmm2,[mem],xmm3공연할 것입니다.xmm1 ← (xmm2*[mem])+xmm3W=0 인코딩이 필요합니다.
  • vfmaddsd xmm1,xmm2,xmm3,[mem]공연할 것입니다.xmm1 ← (xmm2*xmm3)+[mem]W=1 인코딩이 필요합니다.
  • vfmaddsd xmm1,xmm2,xmm3,xmm4공연할 것입니다.xmm1 ← (xmm2*xmm3)+xmm4W=0 또는 W=1로 인코딩할 수 있습니다.


Opcode 테이블
FMA4 명령어는 * 및 노란색 셀 색상으로 강조 표시되고 FMA3 명령어는 강조 표시되지 않은 FMA3 명령어와 함께 10개의 융합-다중 덧셈 연산과 110개의 명령어 변형은 다음 표와 같습니다.

기본동작 Opcode FP32 지침 FP64 지침 FP16 지침
포장된 교대 곱셈/감산
  • 짝수 차선에서 (A*B[a])-C
  • 홀수 차선에서 (A*B)+C
96 VFMADDSUB132PS VFMADDSUB132PD VFMADDSUB132PH
A6 VFMADDSUB213PS VFMADDSUB213PD VFMADDSUB213PH
B6 VFMADDSUB231PS VFMADDSUB231PD VFMADDSUB231PH
5C/5D* VFMADDSUBPS* VFMADDSUBPD*
포장된 교대 다중 뺄셈/추가
  • 짝수차선에서 (A*B)+C
  • 홀수 차선에서 (A*B)-C
97 VFMSUBADD132PS VFMSUBADD132PD VFMSUBADD132PH
A7 VFMSUBADD213PS VFMSUBADD213PD VFMSUBADD213PH
B7 VFMSUBADD231PS VFMSUBADD231PD VFMSUBADD231PH
5E/5F* VFMSUBADDPS* VFMSUBADDPD*
포장 곱하기
(A*B)+C
98 VFMADD132PS VFMADD132PD VFMADD132PH
A8 VFMADD213PS VFMADD213PD VFMADD213PH
B8 VFMADD231PS VFMADD231PD VFMADD231PH
68/69* VFMADDPS* VFMADDPD*
스칼라 곱셈
(A*B)+C
99 VFMADD132SS VFMADD132SD VFMADD132SH
A9 VFMADD213SS VFMADD213SD VFMADD213SH
B9 VFMADD231SS VFMADD231SD VFMADD231SH
6A/6B* VFMADDSS* VFMADDSD*
포장다중감산
(A*B)-C
9A VFMSUB132PS VFMSUB132PD VFMSUB132PH
AA VFMSUB213PS VFMSUB213PD VFMSUB213PH
BA VFMSUB231PS VFMSUB231PD VFMSUB231PH
6C/6D* VFMSUBPS* VFMSUBPD*
스칼라 곱셈 뺄셈
(A*B)-C
9B VFMSUB132SS VFMSUB132SD VFMSUB132SH
AB VFMSUB213SS VFMSUB213SD VFMSUB213SH
BB VFMSUB231SS VFMSUB231SD VFMSUB231SH
6E/6F* VFMSUBSS* VFMSUBSD*
포장된 음-승수-추가
(-A*B)+C
9C VFNMADD132PS VFNMADD132PD VFNMADD132PH
AC VFNMADD213PS VFNMADD213PD VFNMADD213PH
BC VFNMADD231PS VFNMADD231PD VFNMADD231PH
78/79* VFMADDPS* VFMADDPD*
스칼라 음-승수-추가
(-A*B)+C
9D VFMADD132SS VFMADD132SD VFMADD132SH
AD VFMADD213SS VFMADD213SD VFMADD213SH
BD VFMADD231SS VFMADD231SD VFMADD231SH
7A/7B* VFMADDSS* VFMADDSD*
포장된 음-승수-감산기
(-A*B)-C
9E VFNMSUB132PS VFNMSUB132PD VFNMSUB132PH
AE VFNMSUB213PS VFNMSUB213PD VFNMSUB213PH
BE VFNMSUB231PS VFNMSUB231PD VFNMSUB231PH
7C/7D* VFNMSUBPS* VFNMSUBPD*
스칼라 음-다중-감산
(-A*B)-C
9F VFNMSUB132SS VFNMSUB132SD VFNMSUB132SH
AF VFNMSUB213SS VFNMSUB213SD VFNMSUB213SH
BF VFNMSUB231SS VFNMSUB231SD VFNMSUB231SH
7E/7F* VFNMSUBSS* VFNMSUBSD*
  1. ^ 벡터 레지스터 레인은 0에서 부터 작은 엔디안 방식으로 계산됩니다. 벡터의 첫 번째 바이트를 포함하는 레인은 짝수로 간주됩니다.

AVX-512

2014년에 소개된 AVX-512는 512비트 와이드 벡터 레지스터(256비트 레지스터를 확장하여 새로운 레지스터의 하위 절반이 됨)를 추가하고 카운트를 32로 두 배로 늘렸습니다. 따라서 새로운 레지스터의 이름은 zmm0 ~ zmm31입니다.벡터 레지스터의 특정 부분에 대한 동작을 제한하기 위해 사용될 수 있는 k0 ~ k7이라는 이름의 8개의 마스크 레지스터를 추가합니다.이전 명령어 세트 확장과 달리 AVX-512는 여러 그룹으로 구현되며, 기초("AVX-512F") 확장만 필수입니다.[118]추가된 대부분의 명령어는 256비트와 128비트 레지스터에서도 사용할 수 있습니다.

AMX

인텔 AMX, 타일 레지스터 8개 추가tmm0-tmm7, 각각은 타일 레지스터 당 64바이트의 최대 용량인 16행의 매트릭스를 보유하고 있습니다.또한 추가됩니다.TILECFG각각의 8개의 타일 registers에 보유된 실제 행렬의 크기를 구성하기 위한 레지스터 및 이 레지스터에 행렬 곱셈을 수행하기 위한 명령어 세트.

AMX 부분 집합 명령어 기억법 옵코드 지침설명 추가됨
AMX-TILE
AMX제어 및 타일관리
LDTILECFG m512 VEX.128.NP.0F38.W0 49 /0 메모리에서 AMX 타일 구성 데이터 구조를 64바이트 데이터 구조로 로드합니다. 사파이어 래피즈
STTILECFG m512 VEX.128.66.0F38 W0 49 /0 AMX 타일 구성 데이터 구조를 메모리에 저장합니다.
TILERELEASE VEX.128.NP.0F38.W0 49 C0 초기화TILECFG타일 데이터 레지스터()tmm0로.tmm7INIT 상태(all-zeroes)로 이동합니다.
TILEZERO tmm VEX.128.F2.0F38.W0 49 /r[a] 타일 레지스터 하나의 내용을 제로 아웃합니다.
TILELOADD tmm, sibmem VEX.128.F2.0F38.W0 4B /r[b] 메모리에서 AMX 타일 레지스터로 데이터 타일을 로드합니다.
TILELOADDT1 tmm, sibmem VEX.128.66.0F38.W0 4B /r[b] 데이터 타일을 메모리에서 AMX 타일 레지스터로 로드하고, 데이터를 가장 가까운 캐시 레벨에 보관해서는 안 된다는 힌트를 줍니다.
TILESTORED mem, sibtmm VEX.128.F3.0F38.W0 4B /r[b] AMX 타일 레지스터의 메모리에 데이터 타일을 저장합니다.
AMX-INT8
원본 데이터를 8비트 정수로 해석하고 대상 데이터를 32비트 정수로 누적하여 타일의 행렬 곱셈
TDPBSSD tmm1,tmm2,tmm3 VEX.128.F2.0F38.W0 5E /r 행렬은 tmm2에서 signed 바이트를 곱하고 tmm3에서 signed 바이트를 곱하여 tmm1의 결과를 누적합니다.
TDPBSUD tmm1,tmm2,tmm3 VEX.128.F3.0F38.W0 5E /r 행렬은 tmm2에서 signed 바이트를 곱하고 tmm3에서 signed 바이트를 곱하여 tmm1의 결과를 누적합니다.
TDPBUSD tmm1,tmm2,tmm3 VEX.128.F2.0F38.W0 5E /r 행렬은 tmm2에서 서명되지 않은 바이트를 tmm3에서 서명된 바이트를 곱하여 tmm1의 결과를 누적합니다.
TDPBUUD tmm1,tmm2,tmm3 VEX.128.F3.0F38.W0 5E /r 행렬은 tmm2에서 비부호 바이트를 곱하고 tmm3에서 비부호 바이트를 곱하여 tmm1의 결과를 누적합니다.
AMX-BF16
소스 데이터를 bfloat16 값으로 해석하고, 목적지 데이터를 FP32 부동 소수점 값으로 누적하는 타일의 행렬 곱셈
TDPBF16PS tmm1,tmm2,tmm3 VEX.128.F3.0F38.W0 5C /r 행렬은 tmm2에서 BF16 값을 tmm3에서 BF16 값을 곱하여 tmm1을 누적합니다.
AMX-FP16
FP16 값으로 해석되는 소스 데이터와 FP32 부동 소수점 값으로 누적되는 목적 데이터를 갖는 타일의 행렬 곱셈
TDPFP16PS tmm1,tmm2,tmm3 VEX.128.F2.0F38.W0 5C /r 행렬은 tmm2의 FP16 값과 tmm3의 FP16 값을 곱하여 tmm1을 누적합니다. (그래파이트 급류)
AMX-COMPLEX
소스 데이터는 FP16 값의 쌍으로 표현되는 복소수로 해석되고, 목적지 데이터는 FP32 부동 소수점 값으로 누적되는 타일의 행렬 곱셈
TCMMRLFP16PS tmm1,tmm2,tmm3 VEX.128.NP.0F38.W0 6C /r 행렬은 tmm2에서 복소수를 곱하고 tmm3에서 복소수를 곱하여 tmm1로 결과의 실제 부분을 축적합니다. (그래파이트 급류 D)
TCMMILFP16PS tmm1,tmm2,tmm3 VEX.128.66.0F38.W0 6C /r 행렬은 tmm2에서 복소수를 곱하고 tmm3에서 복소수를 곱하여 tmm1로 결과의 허수 부분을 누적합니다.
  1. ^ 위해서TILEZERO, 삭제할 타일 레지스터는 명령어의 ModR/M 바이트의 비트 5:3으로 지정됩니다.비트 7.6은 11b로 설정해야 하며 비트 2:0은 000b로 설정해야 합니다.
  2. ^ a b c 를 위해TILELOADD,TILELOADDT1그리고.TILESTORED명령어, 메모리 인수는 SIB 바이트와 함께 메모리 주소 지정 모드를 사용해야 합니다.이 어드레싱 모드에서 기본 레지스터와 변위는 타일의 첫 번째 행을 로드/저장할 시작 주소를 지정하는 데 사용되며, 스케일과 인덱스는 행당 스트라이드를 지정하는 데 사용됩니다.
    이러한 지침은 모두 중단될 수 있습니다. 이러한 지침 중간에 중단 또는 메모리 예외가 발생하면 진행 상황 추적 정보가 다음에 기록됩니다.TILECFG.start_row, 중단 후 부분적으로 로드된/stored 타일에서 명령을 계속 수행할 수 있도록 합니다.

암호화 명령어

인텔 AES 명령어

새 지침서 6개.

설명 인코딩 묘사
AESENC xmm1,xmm2/m128 66 0F 38 DC /r AES 암호화 흐름 한 라운드 수행
AESENCLAST xmm1,xmm2/m128 66 0F 38 DD /r AES 암호화 흐름의 마지막 라운드 수행
AESDEC xmm1,xmm2/m128 66 0F 38 DE /r AES 암호 해독 흐름 한 라운드 수행
AESDECLAST xmm1,xmm2/m128 66 0F 38 DF /r AES 암호 해독 흐름의 마지막 라운드 수행
AESKEYGENASSIST xmm1,xmm2/m128,imm8 66 0F 3A DF /r ib AES 라운드 키 생성 지원
AESIMC xmm1,xmm2/m128 66 0F 38 DB /r AES 역혼합 열에서 도움

CLMUL 지침

설명 옵코드 묘사
PCLMULQDQ xmm1,xmm2,imm8 66 0F 3A 44 /r ib 유한장 GF(2k)에 걸쳐 두 개의 64비트 다항식의 운반 없는 곱셈을 수행합니다.
PCLMULLQLQDQ xmm1,xmm2/m128 66 0F 3A 44 /r 00 128비트 피연산자 두 개의 낮은 반값을 곱합니다.
PCLMULHQLQDQ xmm1,xmm2/m128 66 0F 3A 44 /r 01 대상 레지스터의 상위 절반에 소스 피연산자의 하위 절반을 곱합니다.
PCLMULLQHQDQ xmm1,xmm2/m128 66 0F 3A 44 /r 10 대상 레지스터의 낮은 절반에 소스 피연산자의 높은 절반을 곱합니다.
PCLMULHQHQDQ xmm1,xmm2/m128 66 0F 3A 44 /r 11 128비트 피연산자 두 개의 절반을 곱합니다.

RDRAND 및 RDSE

설명 인코딩 묘사 추가됨
RDRAND r16
RDRAND r32
NFx 0F C7 /6 NIST SP 800-90A를 준수하는 CSPRNG(Cryptographic Secure Pseudo-Random Number Generator)로 생성된 난수를 반환합니다.[a] 아이비 브릿지,
굴삭기,
퓨마,
장장,
나이트 랜딩,
그레이스몬트
RDRAND r64 NFx REX.W 0F C7 /6
RDSEED r16
RDSEED r32
NFx 0F C7 /7 HRNG/TRNG로 생성된 난수를 반환합니다(하드웨어/"" 난수 발생기) NIST SP 800-90BC를 준수합니다.[a] 브로드웰,
장장,
나이트 랜딩,
젠1,
그레이스몬트
RDSEED r64 NFx REX.W 0F C7 /7
  1. ^ a b RDRAND그리고.RDSEED명령어는 CPU의 난수 생성기가 이러한 명령어의 발행을 따라가지 못할 경우 난수를 획득하고 반환하지 못할 수 있습니다. 만약 이런 일이 발생한다면 소프트웨어는 명령어를 재시도할 수 있습니다. (순진을[119] 보장하기 위해서는 재시도 횟수가 제한되어야 함에도 불구하고)명령어 세트EFLAGS.CF임의의 숫자를 성공적으로 얻으면 1로, 그렇지 않으면 0으로 바꿉니다.난수를 얻지 못하면 명령어의 목적지 레지스터도 0으로 설정됩니다.

인텔 SHA 명령어

7개의 새로운 지침.

설명 인코딩 묘사
SHA1RNDS4 xmm1,xmm2/m128,imm8 NP 0F 3A CC /r ib SHA1 작업 4회 수행
SHA1NEXTE xmm1,xmm2/m128 NP 0F 38 C8 /r 4라운드 후 SHA1 상태 변수 E 계산
SHA1MSG1 xmm1,xmm2/m128 NP 0F 38 C9 /r 다음 SHA1 메시지 Dword 4개에 대한 중간 계산 수행
SHA1MSG2 xmm1,xmm2/m128 NP 0F 38 CA /r 다음 SHA1 메시지 Dword 4개에 대한 최종 계산 수행
SHA256RNDS2 xmm1,xmm2/m128 NP 0F 38 CB /r SHA256 작동 2회 수행
SHA256MSG1 xmm1,xmm2/m128 NP 0F 38 CC /r 다음 SHA256 메시지 Dword 4개에 대한 중간 계산 수행
SHA256MSG2 xmm1,xmm2/m128 NP 0F 38 CD /r 다음 SHA256 메시지 Dword 4개에 대한 최종 계산 수행

Intel AES Key Locker 지침

Tiger Lake 이후의 Intel 프로세서에서 제공되는 이러한 지침은 실제 암호화/복호화 과정에서 키의 암호화되지 않은 복사본에 액세스하지 않고도 AES 키로 암호화/복호화를 가능하게 하도록 설계되었습니다.

설명 인코딩 묘사 메모들
LOADIWKEY xmm1,xmm2 F3 0F 38 DC /r xmm1, xmm2 및 XMM0에서 내부 래핑 키("IWKey")를 로드합니다. 두 개의 명시적 피연산자(레지스터 피연산자여야 함)는 256비트 암호화 키를 지정합니다.에 있는 암시적 피연산자.XMM0128비트 무결성 키를 지정합니다.EAX는 명령의 작동을 제어하는 플래그를 포함합니다.

로드된 후 IWKey는 소프트웨어에서 직접 읽을 수는 없지만 다음과 같이 수행되는 키 랩핑에 의해 사용됩니다.ENCODEKEY128/256키락커 인코딩/디코딩 지침에 의해 확인됩니다.

LOADIWKEY는 권한이 있으며 Ring 0에서만 실행할 수 있습니다.

ENCODEKEY128 r32,r32 F3 0F 38 FA /r XMM0-2에서 128비트 AES 키를 384비트 키 핸들과 출력 핸들에 포장합니다. 소스 피연산자는 핸들에 내장할 핸들 제한을 지정합니다.

대상 피연산자는 키의 소스 및 속성에 대한 정보로 초기화됩니다.

이러한 지침은 XMM4-6을 수정할 수도 있습니다(기존 구현에서는 제로화되었지만 이를 신뢰해서는 안 됩니다).

ENCODEKEY256 r32,r32 F3 0F 3A FB /r XMM0-3에서 XMM1:XMM0의 256비트 AES 키를 512비트 키 핸들과 출력 핸들에 래핑합니다.
AESENC128KL xmm,m384 F3 0F 38 DC /r m384에서 핸들로 표시된 128비트 AES 키를 사용하여 xmm를 암호화하고 결과를 xmm로 저장합니다. 모든 Key Locker 인코딩/디코딩 지침은 핸들이 현재 IWKey에 대해 유효한지 확인하고 핸들이 유효한 경우에만 데이터를 인코딩/디코딩합니다.

제공된 핸들이 유효한지(ZF=0) 또는 유효하지 않은지(ZF=1)를 나타내도록 ZF 플래그를 설정합니다.

AESDEC128KL xmm,m384 F3 0F 38 DD /r m384에서 핸들로 표시된 128비트 AES 키를 사용하여 xmm를 해독하고 결과를 xmm로 저장합니다.
AESENC256KL xmm,m512 F3 0F 38 DE /r m512에서 핸들로 표시된 256비트 AES 키를 사용하여 xmm를 암호화하고 결과를 xmm로 저장합니다.
AESDEC256KL xmm,m512 F3 0F 38 DF /r m512에서 핸들로 표시된 256비트 AES 키를 사용하여 xmm를 해독하고 결과를 xmm로 저장합니다.
AESENCWIDE128KL m384 F3 0F 38 D8 /0 m384에서 핸들로 표시된 128비트 AES 키를 사용하여 XMM0-7을 암호화하고 각 결과 블록을 해당 레지스터에 다시 저장합니다.
AESDECWIDE128KL m384 F3 0F 38 D8 /1 m384에서 핸들로 표시된 128비트 AES 키를 사용하여 XMM0-7을 해독하고 각 결과 블록을 해당 레지스터에 다시 저장합니다.
AESENCWIDE256KL m512 F3 0F 38 D8 /2 m512에서 핸들로 표시된 256비트 AES 키를 사용하여 XMM0-7을 암호화하고 각 결과 블록을 해당 레지스터에 다시 저장합니다.
AESDECWIDE256KL m512 F3 0F 38 D8 /3 m512에서 핸들로 표시된 256비트 AES 키를 사용하여 XMM0-7의 암호를 해독하고 각 결과 블록을 해당 레지스터에 다시 저장합니다.

VIA PadLock 지침

VIA/Zhaoxin PadLock 명령어는 8086 반복 문자열 명령어와 유사하게 암호화 프리미티브를 대량으로 적용하도록 설계된 명령어입니다.따라서 별도로 지정하지 않는 한 ES:rSI의 소스 데이터와 ES:rDI의 대상 데이터에 대한 포인터를 사용하고 rCX의 데이터 크기 또는 카운트를 사용합니다.기존의 문자열 지침처럼 모두 중단 가능하도록 설계되어 있습니다.

패들락 부분집합 설명 인코딩 묘사 추가됨
RNG
난수 생성.
XSTORE NFx 0F A7 C0 랜덤 바이트를 ES:[rDI]에 저장하고 그에 따라 ES:rDI를 증가시킵니다.XSTORE는 현재 사용 가능한 바이트(0 ~ 8바이트)를 저장합니다.REP XSTORE는 rCX에서 지정한 난수 바이트 수를 기록하며, 필요할 때 난수 생성기를 기다립니다.EDX는 "품질 요인"을 지정합니다. 느헤미아
(stepping 3)
REP XSTORE F3 0F A7 C0
ACE
고급 암호화 엔진입니다.
REP XCRYPTECB F3 0F A7 C8 다양한 블록 모드(ECB, CBC, CFB, OFB, CTR)에서 AES 암호를 사용하여 데이터를 암호화/복호화합니다.rCX에는 암호화/복호화할 16바이트 블록 수가 포함되어 있고, rBX에는 암호화 키에 대한 포인터가 포함되어 있으며, rX에는 암호화 키에 대한 포인터가 포함되어 있으며, rX에는 암호화 키에 대한 포인터가 필요한 블록 모드의 초기화 벡터에 대한 포인터가 포함되어 있으며, rDX에는 제어 단어에 대한 포인터가 포함되어 있습니다.[a] 느헤미아
(stepping 8)
REP XCRYPTCBC F3 0F A7 D0
REP XCRYPTCFB F3 0F A7 E0
REP XCRYPTOFB F3 0F A7 E8
ACE2[b]
REP XCRYPTCTR F3 0F A7 D8 C7 "에스더"[120]
PHE
해시 엔진.
REP XSHA1 F3 0F A6 C8 (SHA-1 함수와 SHA-256 함수를 각각 사용하여) 암호 해시를 계산합니다.ES:rSI는 해시를 계산할 데이터를 가리키고, ES:rDI는 메시지 다이제스트를 가리키며 rCX는 바이트 수를 지정합니다. rAX는 계산을 시작할 때 0으로 설정해야 합니다.[c] 에스더
REP XSHA256 F3 0F A6 D0
PMM
몽고메리 곱셈기.
REP MONTMUL F3 0F A6 C0 몽고메리 곱셈을 수행합니다.ECX에서 피연산자 폭(비트 수로 제공됨)을 취합니다. 범위는 256이어야 합니다.32768과 128로 나뉠 수 있음) 및 ES:ESI의 데이터 구조에 대한 포인터.[d] 에스더
GMI[122][123]
중국 국가 암호 알고리즘.(자오신만 해당)
CCS_HASH F3 0F A6 E8 SM3 해시를 계산합니다.REP XSHA*지침들.rBX 레지스터는 해시 함수()를 지정하는 데 사용됩니다.20hSM3가 유일하게 문서화된 값입니다. 장장
CCS_ENCRYPT F3 0F A7 F0 다양한 블록 모드에서 SM4 암호를 사용하여 데이터를 암호화/복호화합니다. rCX는 암호화/복호화할 16바이트 블록 수를 포함하고, rBX는 암호화 키를 가리키는 포인터를 포함하고, rDX는 암호화 키를 필요로 하는 블록 모드의 초기화 벡터를 가리키는 포인터를 포함하고, rAX는 제어어를 포함합니다.[e]
  1. ^ 제어어:REP XCRYPT*는 128비트 데이터 구조이며 다음과 같은 레이아웃을 갖습니다.
    비트 사용.
    3:0 AES 라운드 수
    4 다이제스트 모드 사용(ACE2만 해당)
    5 1=16바이트 정렬되지 않은 데이터 허용(ACE2만 해당)
    6 암호: 0=aes, 1=정의되지 않음
    7 키 스케줄: 0=compute(128비트 키만 해당), 1=메모리에서 로드
    8 0=보통, 1=intermedi-
    9 0=encrypt, 1=
    11:10 키 사이즈 : 00=128비트, 01=192비트, 10=256비트, 11=
    127:12 예약, 0으로 설정
  2. ^ ACE2는 또한 다른 기능에 추가 기능을 추가합니다.REP XCRYPT명령어: CBC 및 CFB 명령어에 대한 다이제스트 모드 및 비ECB 명령어에 대해 16바이트 정렬되지 않은 입출력 데이터를 사용할 수 있는 기능.
  3. ^ VIA Nano 이상의 프로세서에서는 rAX를 다음과 같이 all-1s 값으로 설정합니다.REP XSHA*명령어는 대체 작동 모드를 활성화합니다. 여기서 rCX는 64바이트 블록의 수를 지정하고 해시 계산이 끝날 때 표준 FIPS-180-2 길이 확장 절차를 생략합니다.따라서 원래 EAX=0 모델보다 데이터 스트리밍에 더 적합한 모델이 됩니다.이 기능은 다음에 대해서도 존재합니다.CCS_HASH.
  4. ^ 데이터 구조는 다음과 같습니다.REP MONTMUL는 6개의 32비트 요소를 포함하고 있는데, 첫 번째 요소는 모듈러스의 하위 32비트의 네거티브 모듈러 역이고 나머지 5개는 다양한 메모리 버퍼에 대한 포인터입니다.
    간격띄우기 자료항목
    0 음의 모듈러 역수
    4 첫번째 곱셈기에 대한 포인터
    8 두번째 곱셈기 포인터
    12 결과 버퍼의 포인터
    16 계수에 대한 포인터
    20 32바이트 스크래치 패드 포인터
  5. ^ CCS_ENCRYPTrAX의 control word는 다음과 같은 형식을 갖습니다.
    비트 사용.
    0 0=encrypt, 1=decrypt
    5:1 SM4의 경우 10000b여야 합니다.
    6 ECB 블록 모드
    7 CBC 블록 모드
    8 CFB 블록 모드
    9 OFB 블록 모드
    10 CTR 블록 모드
    11 다이제스트 활성화

    rAX의 나머지 비트는 all-0으로 설정해야 합니다.

    rAX(block mode selection)의 비트 10:6 중에서 정확히 한 비트를 설정하지 않으면 동작이 정의되지 않습니다.

기타 지시사항

x86에는 인텔과 AMD가 더 이상 지원하지 않는 중단된 명령어 세트와 실행되지만 공식적으로 문서화되지 않은 문서화되지 않은 명령어도 포함되어 있습니다.

가상화 지침

AMD-V 명령어

설명 옵코드 지침 설명 사용자 추가됨
기본 SVM(Secure Virtual Machine) 지침[124]
INVLPGA rAX,ECX[a] 0F 01 DF rAX에 지정된 가상 페이지와 ECX에 지정된 ASID(Address Space IDentifier)에 대한 TLB 매핑을 무효화합니다. VMM K8[b]
VMRUN rAX[a] 0F 01 D8 rAX에서 물리적 주소로 지정된 VMCB(Virtual Machine Control Block)에서 관리하는 가상 시스템을 실행합니다.
VMLOAD rAX[a] 0F 01 DA rAX 레지스터의 물리적 주소로 지정된 VMCB에서 특정 프로세서 상태의 하위 집합을 로드합니다.[c] 일반적으로 VMM[d]
VMSAVE rAX[a] 0F 01 DB 프로세서 상태의 특정 부분 집합을 rAX 레지스터의 물리적 주소로 지정된 VMCB에 저장합니다.[c]
STGI 0F 01 DC GIF(Global Interrupt Flag)를 설정합니다. 일반적으로 VMM[e]
CLGI 0F 01 DD GIF 지우기.
VMMCALL NFx 0F 01 D9 VMEXIT를 발생시켜 게스트에서 VM 모니터를 호출합니다. 손님
SKINIT EAX 0F 01 DE 안전한 초기화 및 증명과 함께 점프합니다.
CPU를 알려진 상태로 초기화하고, EAX에 의해 지정된 64 Kbyte 메모리 영역을 SLB("Secure Loader Block")로 지정한 다음, 디지털 서명을 사용하여 유효성을 확인하기 위해 메모리 영역의 복사본을 시스템 TPM에 제출한 다음 SLB로 점프합니다.
VMM 투리온 "사자",[125]
옵테론 상하이
페놈 2세
보안 암호화 가상화(SEV): 암호화 상태(SEV-ES) 지침
VMGEXIT F2/F3 0F 01 D9 VMM으로 가는 SEV-ES 출구입니다.
SEV-ES VM용 VMM과의 명시적 통신.[f]
손님 젠1
IMT2000 3GPP - 보안 중첩 페이징 : RMP 지침
PSMASH F3 0F 01 FF Page Smash: 2MB 페이지 RMP 항목을 해당하는 연속 4KB 페이지 RMP 항목 집합으로 확장합니다.2MB 페이지의 시스템 물리적 주소는 RAX 레지스터에 지정되어 있습니다. VMM 선3
RMPUPDATE F2 0F 01 FE RMP 항목을 새로 작성합니다.RMP 엔트리가 수정된 페이지의 시스템 물리 주소는 RAX 레지스터에 지정됩니다.RCX 레지스터는 새로운 RMP 상태를 포함하는 16바이트 데이터 구조의 유효 주소를 제공합니다.
PVALIDATE F2 0F 01 FF 게스트 페이지의 RMP 항목에 대한 유효성을 검사하거나 다시 검사합니다.게스트 가상 주소가 레지스터 피연산자 rAX에 지정되어 있습니다. 손님
RMPADJUST F3 0F 01 FE 게스트 페이지에 대한 RMP 권한을 조정합니다.게스트 가상 주소가 RAX 레지스터에 지정되어 있습니다.페이지 크기는 RCX[0]에 지정되어 있습니다.대상 VMPL(가상 시스템 권한 수준) 및 해당 사용 권한이 RDX 레지스터에 지정되어 있습니다.
RMPQUERY F3 0F 01 FD 게스트 페이지에 대한 RMP 권한 마스크를 읽습니다.게스트 가상 주소가 RAX 레지스터에 지정되어 있습니다.대상 VMPL은 RDX[7:0]에 지정되어 있습니다.지정된 VMPL에 대한 RMP 권한은 RDX[63:8] 및 RCX 레지스터에 반환됩니다. 손님 선4
  1. ^ a b c d RAX 인수의 경우VMRUN,VMLOAD,VMSAVE그리고.INVLPGA지침에 따라 AX/EAX/RAX의 선택은 주소 크기에 따라 달라지며, 67h 접두사를 사용하면 무시할 수 있습니다.
  2. ^ AMD-V 지원은 AMD K8의 F 단계에서 추가되었으며 이전 단계에서는 사용할 수 없습니다.
  3. ^ a b VMRUN명령어는 CPU 상태의 제한된 부분 집합만 로드합니다.VMLOAD실행 전에 실행해야 함VMRUN추가 상태를 로드합니다.
    마찬가지로 #VMEXIT는 VMCB에 제한된 양의 게스트 상태만 저장합니다.VMSAVE추가 상태를 저장하기 위해 필요합니다.
    VMM에서 처리하는 상태 항목을 사용할 필요가 없는 단순 가로채기 조건의 경우VMSAVE/VMLOAD, VMM은 수행을 포기함으로써 성능을 향상시킬 수 있습니다.VMSAVE/VMLOAD가상 시스템을 다시 entering하기 전에VMRUN.
  4. ^ VMLOAD/VMSAVE 가상화(Excavator 이상)를 지원하는 CPU의 경우VMLOAD그리고.VMSAVE게스트 모드에서도 명령을 실행할 수 있습니다.
  5. ^ 가상 GIF(굴착기 이상)를 지원하는 CPU의 경우STGI그리고.CLGI게스트 모드에서도 명령을 실행할 수 있습니다.
  6. ^ VMGEXIT다음과 같이 실행됩니다.VMMCALLSEV-ES 게스트가 실행하지 않는 경우.

인텔 VT-x 명령어

Intel 가상화 지침.VT-x는 VIA와 자오신의 일부 프로세서에서도 지원됩니다.

설명 옵코드 지침 설명 사용자[a] 추가됨
기본 VMX(가상 시스템 확장) 지침
VMXON m64[b] F3 0F C7 /6 Enter VMX Operation – 하드웨어 지원 가상화 환경을 입력합니다.[c] VMM 프레스콧 2M,
요나,
센터튼,
나노3000
VMXOFF NP 0F 01 C4 VMX 작업 종료 – 하드웨어에서 지원되는 가상화 환경을 중지합니다.
VMPTRLD m64[b] NP 0F C7 /6 메모리에서 VMCS(Virtual-Machine Control Structure)로 포인터를 로드하고 유효하다고 표시합니다.
VMPTRST m64[b] NP 0F C7 /7 메모리에 현재 VMCS의 포인터를 저장합니다.
VMCLEAR m64[b] 66 0F C7 /6 VMCS 데이터를 CPU에서 메모리의 VMCS 영역으로 플러시합니다.지정한 VMCS가 현재 VMCS이면 현재 VMCS가 유효하지 않은 것으로 표시됩니다.
VMLAUNCH NP 0F 01 C2 현재 VMCS에서 관리하는 가상 시스템을 시작합니다.
VMRESUME NP 0F 01 C3 현재 VMCS에서 관리하는 가상 시스템을 재개합니다.
VMREAD r/m,reg NP 0F 78 /r current-VMCS에서 지정된 필드를 읽습니다.reg인수는 읽을 필드를 지정합니다. – 결과가 저장됩니다.r/m. 일반적으로 VMM[d]
VMWRITE reg,r/m NP 0F 79 /r current-VMCS의 지정된 필드에 기록합니다.reg인수는 쓸 필드를 지정하고 r/m 인수는 필드에 쓸 데이터 항목을 제공합니다.
VMCALL NP 0F 01 C1 VMEXIT를 발생시켜 게스트에서 VM 모니터를 호출합니다. 보통 손님이[e]
확장 페이지 테이블(EPT) 지침
INVEPT reg,m128 66 0F 38 80 /r TLB 및 페이징 구조 캐시에서 EPT 파생 항목을 무효화합니다. VMM 네할렘,
센터튼,[126]
장장
INVVPID reg,m128 66 0F 38 81 /r VPID(가상 프로세서 ID)를 기준으로 TLB 및 페이징 구조 캐시의 항목을 무효화합니다.
VMFUNC NP 0F 01 D4 EAX에 지정된 VM 기능을 호출합니다.[f] 손님 해스웰,
실버몬트
IMT-2000 3GPP-신뢰 도메인 확장 : 보안 중재 모드[99] 지침
SEAMOPS 66 0F 01 CE SEAM 관련 작업을 호출합니다.수행할 작업은 RAX에 명시되어 있습니다.[g]
뿌리
사파이어 래피즈[127]
SEAMRET 66 0F 01 CD SEAM VMX 루트 작업에서 기존 VMX 루트 작업으로 돌아갑니다.
SEAMCALL 66 0F 01 CF 기존 VMX 루트 작업에서 SEAM VMX 루트 작업을 호출합니다. VMM
TDCALL 66 0F 01 CC VMEXIT를 발생시켜 TD 게스트에서 VM 모니터에 호출합니다. TD 게스트
  1. ^ VM 게스트 내에서 VT-x VMM 지침을 실행하면 VMXIT가 발생합니다.
    다음을 통해 VMX 작업을 입력하지 않은 경우VMXON, 모든 VT-x 명령(단, 제외)VMXON)이 #UD를 유발합니다.
  2. ^ a b c d m64 논법은 다음과 같습니다.VMPTRLD,VMPTRST,VMCLEAR그리고.VMXON는 64비트 물리 주소입니다.
  3. ^ m64 논법은 다음과 같습니다.VMXON는 "VMXON 영역"에 대한 64비트 물리 주소입니다. "VMXON 영역"은 4Kbyte가 정렬되어야 하는 4Kbyte 영역입니다.이 영역은 프로세서가 VMX 작업을 구현 종속적인 방식으로 지원하기 위해 사용할 수 있으며 프로세서가 VMX 작업을 종료할 때까지 소프트웨어에서 액세스할 수 없습니다.VMXOFF설명.
  4. ^ "VMCS Shadowing"(VMCS Shadowing)이 활성화된 경우(Haswell 이상에서 사용 가능),VMREAD그리고.VMWRITE명령은 게스트에 의해서도 실행될 수 있습니다.
  5. ^ VMCALLVMM에서도 명령을 실행할 수 있습니다. 이렇게 하면 SMM VM이 특별하게 종료됩니다.
  6. ^ 사용 가능한 기능은VMFUNCEAX 레지스터에는 다음이 있습니다.
    EAX 기능.
    0 EPTP 스위칭: 확장 페이지 테이블 포인터를 VM 호스트가 미리 준비한 최대 512개 테이블 포인터 중 하나로 전환합니다.
    ECX는 512개의 포인터 중에서 사용할 포인터를 지정합니다.
    1-63 (예약, VMEXIT 발생)
    ≥64 올바르지 않습니다. #UD를 발생시킵니다.
  7. ^ 사용 가능한 작업은SEAMOPSRAX 레지스터에는 다음이 있습니다.
    락스 작동
    0(기능) RAX에서 지원되는 SEAMOPS 잎의 비트맵 반환.
    1 (심 보고서) SEAMREPORT 구조를 생성합니다.

    RAX에서 지원되지 않는 값은 #GP(0) 예외를 발생시킵니다.

문서화되지 않은 지침

문서화되지 않은 x86 지침

x86 CPU에는 칩에 구현되어 있지만 일부 공식 문서에는 나열되어 있지 않은 문서화되지 않은 지침이 포함되어 있습니다.Ralf Brown의 Interrupt List sandpile.org 와 같은 인터넷의 다양한 출처에서 볼 수 있습니다.

이러한 지침 중 일부는 많은/대부분의 x86 CPU에서 광범위하게 사용할 수 있으며, 다른 지침은 좁은 범위의 CPU에서만 사용할 수 있습니다.

많은 x86 CPU에서 널리 사용할 수 있는 문서화되지 않은 명령어는 다음과 같습니다.

음모닉스 옵코드 묘사 상황
AAM im8 D4 im8 ASCII-애프터 멀티플라이 조정.8086에서, 이진 곱셈 결과를 BCD로 변환하는 데 사용되는 imm8=0Ah 전용으로 문서화되었습니다.

실제 작동은AH ← AL/imm8; AL ← AL mod imm8모든 imm8 값(0을 제외하고, 0으로 나누는 예외를 생성함).[128]

펜티엄(Pentium) 이후로 0Ah 이외의 imm8 값에 대해 문서화된 8086부터 사용 가능합니다(이전 문서에는 인수가 없음)
AAD im8 D5 im8 ASCII-Adjust-Before-Division.8086에서 imm8=0Ah에 대해서만 문서화되어 있으며, 이는 BCD 값을 다음 분할 명령을 위해 이진으로 변환하는 데 사용됩니다.

실제 작동은AL ← (AL+(AH*imm8)) & 0FFh; AH ← 0모든 imm8 값에 대해.

SALC,

세탈크

D6 Carry Flag(SBB AL, AL의 1바이트 대안) 값에 따라 AL 설정 8086부터 사용할 수 있지만 펜티엄 프로 이후로 문서화되어 있습니다.
시험 F6/1 imm8,

F7/1 imm16/32

TEST 지침의 문서화되지 않은 변형.[129]문서화된 F6/0 및 F7/0 변형과 동일한 작동을 수행합니다. 8086년부터 사용 가능합니다.

80486개의 계단에서는 이용할 수 없습니다.[130][131]

SHL,

SAL

(D0..D3) /6,

(C0..C1)/6 im8

SHL 지침의 문서화되지 않은 변형.[129]문서화된 작업과 동일한 작업을 수행합니다(D0..D3) /4 및 (C0..C1) /4개의 변형. 80186 이후 사용 가능(8086에서 다른 작동 수행)[132]
(복수) 82 /(0..7) im8 opcode 80의 별칭 - 8비트 즉시 인수를 사용하여 8비트 정수 명령어(ADD, OR, ADC, SBB, AND, SUB, XOR, CMP)의 변형을 제공합니다.[133] 8086년부터 사용 가능합니다.[133]64비트 모드에서는 명시적으로 사용할 수 없지만 호환성을 위해 유지 및 예약됩니다.[134]
OR,AND,XOR 83 /(1,4,6) im8 16비트 OR/AND/XOR, 부호 확장 8비트 즉시 사용 8086에서 사용할 수 있지만 80386 이후부터는 문서화되어 있습니다.[135][136]
REPNZ MOVES F2 (A4..A5) CMPS/SCAS 이외의 문자열 명령어와 함께 사용할 때 F2 접두사(REPNZ, REPNE)의 동작은 공식적으로 정의되지 않았지만 문서화된 F3(REP) 접두사와 동일한 방식으로 동작하기 위해 이를 사용하는 상용 소프트웨어(예: MS-DOS 버전 3.30~6.22로[137] 배포된 FDISK 버전)가 있습니다. 8086년부터 사용 가능합니다.
REPNZ STOS F2 (AA..AB)
REPRET F3 C3 RET 명령과 함께 REP 접두사를 사용하는 경우 Intel SDM 또는 AMD APM에서 지원되는 것으로 나열되지 않습니다.그러나 AMD-K8의 최적화 가이드에서는 F3 C3 인코딩을 2바이트 RET 명령을 인코딩하는 방법으로 설명합니다. 이 방법은 AMD-K8의 분기 예측기에서 일부 1바이트 RET 명령에 대해 분기 예측이 실패할 수 있는 문제에 대해 권장되는 해결 방법입니다.[138]적어도 일부 버전의 gcc는 이 인코딩을 사용하는 것으로 알려져 있습니다.[139] 알려진 모든 x86 CPU에서 RET로 실행됩니다.
NOP 67 90 주소 크기 재정의 접두사가 있는 NOP.메모리 피연산자가 없는 명령에 67 접두사를 사용하는 것은 Intel SDM(vol 2, 섹션 2.1.1)에서 "예약"으로 나열되지만 Microsoft Windows 95에서는 Intel 80386의 B1 단계에서 버그를 해결할 수 있는 방법으로 사용됩니다.[140][141] 80386 이상에서 NOP로 실행됩니다.
ICEBP,

INT1

F1 단일 바이트 단일 단계 예외 / ICE 호출 펜티엄 프로 이후 INT1로 문서화된 80386부터 사용 가능.8086 및 80286에서 문서화되지 않은 명령 접두사로 처리되었습니다.[142]
NOP r/m 0F 1F/0 공식 롱 NOP.

1995년에 펜티엄 프로에 소개되었지만 2006년 3월까지 문서화되지 않았습니다.[50][143][144]

펜티엄 프로 및 AMD K7[145] 이상에서 사용 가능.

Nehemiah를 통해 AMD K6, AMD Geode LX에서 사용할 수 없습니다.[146]

NOP r/m 0F 0D/r 예약-NOP.65 nm 펜티엄 4에 도입되었습니다.인텔 문서는 opcode 테이블에서 이 opcode를 NOP로 표시하지만 2005년 6월 이후의 명령어 목록은 표시하지 않습니다.[147][148]Broadwell 이후부터는 PREFETCHW로 문서화되어 있는 반면, 문서화되지 않은 프리페치 기능을 보이는 것으로 보고되었습니다.[93]

AMD CPU에서 메모리 인수는 K6-2 이후로 PREFETCH/PREFETCHW로 문서화되는데, 원래는 3dnow!의 일부였지만 나머지 3dnow!가 삭제된 후에도 이후 AMD CPU에 유지되고 있습니다.

65nm Pentium 4 이후 Intel CPU에서 사용 가능.

UD1 0F B9/r 의도적으로 정의되지 않은 명령이지만 UD2(0F 0B)와 달리 이 명령은 2016년 12월까지 게시되지 않은 채로 남아 있었습니다.[149][58]

Microsoft Windows 95 Setup은 유효하지[150][151] 않은 것으로 알려져 있으며 #UD 예외 처리기가 제대로 작동하는지 테스트하는 자체 검사로 사용됩니다.

상용 소프트웨어가 #UD 예외를 생성하기 위해 사용하는 다른 유효하지 않은 옵코드는 (DIF-2,[152] LaserLok[153]) 및 ("BOP")[154][155]를 포함하지만, 2022년 1월 현재 의도적으로 유효하지 않은 옵코드로 게시되지 않았습니다.

이러한 모든 opcode는 80186 이상에서 #UD 예외를 생성합니다(BRKEM 명령에 최소 0FFFF를 할당하는 NEC V20/V30은 제외).
UD0 0FFFF

x86 CPU의 제한된 하위 집합에만 나타나는 문서화되지 않은 명령은 다음과 같습니다.

음모닉스 옵코드 묘사 상황
REP MUL F3 F6 /4,F3 F7 /4 8086/8088에 aREP아니면REPNZa의 접두사MUL아니면IMUL명령은 결과를 부정하게 만듭니다.이는 결과의 부호를 저장하기 위해 "REP 접두사 존재" 비트를 사용하는 마이크로코드 때문입니다. 8086/8088만 해당.[156]
REP IMUL F3 F6 /5,F3 F7 /5
REP IDIV F3 F6 /7,F3 F7 /7 8086/8088에 aREP아니면REPNZ접두사를 붙입니다IDIV(그렇지는 않음)DIV) 명령을 사용하면 몫이 음수가 됩니다.이는 마이크로코드가 "REP 접두사 있음" 비트를 사용하여 몫의 부호를 저장하기 때문입니다. 8086/8088만 해당.[156]
SAVEALL,

STOREALL

0F 04 정확한 목적을 알 수 없으며, HCF(CPU 행)를 발생시킵니다.유일한 방법은 CPU 리셋입니다.[157]

일부 구현에서는 BIOS를 통해 중지 시퀀스로 에뮬레이트합니다.[158]

빈티지 컴퓨팅 연맹의 포럼 게시물에서 이 지침은 다음과 같이 설명됩니다.SAVEALL. ICE 모드와 상호 작용합니다.

80286에서만 이용 가능합니다.
LOADALL 0F 05 메모리 주소 0x000800H에서 모든 레지스터 로드 80286에서만 이용 가능합니다.

재사용된 OpcodeSYSCALLAMD K6 이상의 CPU에서.

LOADALLD 0F 07 메모리 주소 ES:EDI에서 모든 레지스터 로드 80386에서만 사용 가능합니다.

재사용된 OpcodeSYSRETAMD K6 이상의 CPU에서.

CL1INVMB 0F 0A[159] Intel SCC(Single-chip Cloud Computer)에서 모든 메시지 버퍼를 무효화합니다.인텔의 SCC 아키텍처 사양에는 명령어의 니모닉과 작동 방식이 설명되어 있지만 opcode는 설명되어 있지 않습니다.[160] SCC에서만 사용할 수 있습니다.
PATCH2 0F 0E AMD K6 이상의 경우FEMMS작동(MMX 상태에서 빠르게 삭제)하지만 인텔에서[161] uarch 데이터를 읽은 것으로 확인됨 빨간색 잠금 해제 상태에서만 사용 가능(0F 0F역시)
PATCH3 0F 0F Uarch 쓰기 Intel에서 마이크로코드의 RAM 부분을 변경할 수 있습니다.
UMOV r,r/m,
UMOV r/m,r
0F (10..13) /r ICE HALT 모드로 동작할 때 사용자 메모리로 데이터를 이동합니다.[162]규칙적으로 작동MOV그렇지않으면. 일부 386 및 486 프로세서에서만 사용할 수 있습니다.

이후 CPU에서 SSE 명령에 재사용되는 Opcode.

NXOP 0F 55 NexGen 하이퍼코드 인터페이스.[163] NexGen Nx586에서만 사용할 수 있습니다.
(복수) 0F (E0..FB)[164] NexGen Nx586 "hyper mode" 지침

넥스젠 Nx586 CPU는 대부분의 다른 x86 CPU에서 마이크로코드로 구현되는 많은 복잡한 작업을 위해 "하이퍼 코드"([165]부팅 시 언팩되고 특별한 "하이퍼 모드[166]" 동작 모드에서만 액세스할 수 있음)를 사용합니다.Nx586은 하이퍼 모드 작동을 지원하기 위해 많은 수의 문서화되지 않은 지침을 제공합니다.

Nx586 하이퍼 모드에서만 사용할 수 있습니다.
PSWAPW mm,mm/m64 0F 0F /r BB K6-2 및 K6-3에 문서화되지 않은 AMD 3DNow! 지침.64비트 MMX 레지스터 내의 16비트 워드를 스왑합니다.[167][168]

MASM 6.13 및 6.14에 의해 인식되는 것으로 알려진 지침.

K6-2 및 K6-3에서만 사용할 수 있습니다.

문서화를 위해 재사용된 OpcodePSWAPDAMD K7 이후의 명령.

­ 알 수 없는 기억력 64 D6 사용.64(FS: 세그먼트) 문서화되지 않은 접두사D6(SALC/SETALC) 지침에 따라 UMC CPU에서만 EAX가 다음과 같이 설정됩니다.0xAB6B1B07.[169][170] UMC Green CPU에서만 사용할 수 있습니다.다음으로 실행SALCUMC CPU가 아닌 경우.
FS: Jcc 64 (70..7F) rel8,

64 0F (80..8F) rel16/32

Intel NetBurst(Pentium 4) CPU의 경우 64h(FS: 세그먼트) 명령 접두사가 조건부 분기 명령과 함께 사용되면 분기가 taken과 not taken을 번갈아 표시하는 분기 힌트 역할을 합니다.[171]다른 NetBurst 분기 힌트(CS: 및 DS: 세그먼트 접두사)와 달리 이 힌트는 문서화되지 않습니다. NetBurst CPU에서만 사용할 수 있습니다.

조건부 분기의 세그먼트 접두사는 허용되지만 NetBurst가 아닌 CPU에서는 무시됩니다.

JMPAI 0F 3F 문서화되지 않은 대체 명령 집합에서 명령을 점프하여 실행합니다. VIA Technologies에서 만든 일부 x86 프로세서에서만 사용할 수 있습니다.
(FMA4) VEX.66.0F38 (5C..5F,68..6F,78..7F) /r imm8 AMD Zen1에서는 FMA4 지침이 있지만 문서화되지 않았습니다(CPUID 플래그 누락).기능을 문서화하지 않은 상태로 둔 이유는 버그 구현 때문일 수도 있고 그렇지 않을 수도 있습니다.[172] Zen2 이후로 제거되었습니다.
REP XSHA512 F3 0F A6 E0 SHA-512 해싱을 수행합니다.

VIA PadLock 지원의 일환으로 OpenSSL에서 지원하지만 VIA PadLock 프로그래밍 가이드에서는 문서화하지 않았습니다.

VIA TechnologiesZhaoxin이 만든 일부 x86 프로세서에서만 사용할 수 있습니다.
REP XMODEXP F3 0F A6 F8 모듈식 지수화난수 생성을 각각 수행하는 방법

VIA가 제공하는 패치에 나열되어 OpenSSL에 VIA Nano 관련 PadLock 명령 지원을 추가하지만 VIA PadLock 프로그래밍 가이드에 의해 문서화되지는 않았습니다.[174]

XRNG2 F3 0F A7 F8
­ 알 수 없는 기억력 0F A7 (C1..C7) SandSifter[175] 및 UISFuzz와[176] 같은 CPU 퍼지 툴에서 여러 VIA 및 Zhaoxin CPU에서 #UD를 유발하지 않고 실행되는 것으로 감지됨.

알 수 없는 작업, 문서화된 작업과 관련이 있을 수 있습니다.XSTORE(0F A7 C0) 지시.

(unknown, 배수) 0F 0F /r ?? SandSifter[175] 및 UISFuzz의[176] 백서에서는 여러 AMD CPU(적어도 Geode NXC-50)에서 3DNow! opcode 범위에서 문서화되지 않은 명령이 대량으로 탐지되었음을 보고합니다.그들의 작전은 알려지지 않았습니다.

적어도 AMD K6-2에서는 할당되지 않은 모든 3DNow! opcode(문서화되지 않은 것 제외)PF2IW,PI2FW그리고.PSWAPW명령)을 실행하는 것으로 보고됩니다.POR(MMX 비트와이즈-OR 지시).[168]

3DNow!가 있는 일부 AMD CPU에 표시됩니다.
­ 알 수 없는 기억력 F2 0F A6 C0 Zhaoxin SM2 명령 가능.OpenEuler용 Linux 커널 패치에 나열된 CPUID 플래그,[177] Zhaoxin 특허 애플리케이션에 제공된 설명 및 opcode(단, 명령어 니모닉은 없음).[178] 알 수 없는.일부 Zhaoxin CPU에는[179] 이러한 지침에 대한 CPUID 플래그가 설정되어 있습니다.
MONTMUL2 알 수 없는 ­ Zhaoxin RSA/"xmodx" 지침.Mnonemics 및 CPUID 플래그는 OpenEuler용 Linux 커널 패치에 나열되지만 [177]opcode 및 명령 설명을 사용할 수 없습니다.
MOVDB,

GP2MEM

알 수 없는 ­ 1997년 마이크로프로세서 보고서의 기사 "MediaGX가 저비용 PC를 대상으로 한다"에서는 Cyrix MediaGX 프로세서의 소개를 다루었는데, 이 프로세서에 새로운 "가상 시스템 아키텍처" 기능을 지원하기 위해 추가된 것으로 알려진 몇 가지 새로운 지침을 나열하고 있습니다.MOVDB그리고.GP2MEM– 또한 Cyrix가 이러한 지침에 대한 사양을 발표할 의도는 없었다고 언급했습니다.[180] 알 수 없는 ­.

게시된 사양이 없습니다.

문서화되지 않은 x87 지침

음모닉스 옵코드 묘사 상황
페니,

FENI8087_NOP

DB E0 FPU 인터럽트 활성화(8087) 인텔 80287용으로 문서화.[108]

80287 이후의 모든 Intel x87 FPU에 적용됩니다.에 소개된 FPU 이외의 FPU의 경우(FENI/FDISI의 경우 8087, FSETPM의 경우 80287), NOP 역할을 합니다.

이러한 명령어와 최신 CPU에 대한 동작은 나중의 Intel 설명서에서 일반적으로 언급되지만 opcode가 생략되고 opcode 테이블 항목이 공백으로 남아 있습니다(예: Intel SDM 325462-077, 2022년 4월에는 opcode 없이 두 번 언급됨).

그러나 opcode는 Intel XED에 의해 인식됩니다.[181]

FDISI,

FDISI8087_NOP

DB E1 FPU 인터럽트 비활성화(8087)
FSETPM,

FSETPM287_NOP

DB E4 FPU 보호 모드 설정(80287)
(기억상실증 없음) D9 D7, D9 E2,
D9 E7, DD FC,
DE8, DEDA
DDC, DEDD
DE DE, DF FC
"사이릭스에 의해 예약됨" opcode 이러한 opcode는 적어도 Cyrix 6x86,[182] 6x86MX, MII, MediaGX 및 AMD Geode GX/LX에서 예외를 생성하지 않고 "예측할 수 없는 결과"를 생성하는 예약 opcode로 나열됩니다. [183](이러한 CPU에 대한 설명서에는 모두 동일한 10개의 opcode가 나열되어 있습니다.)

이들의 실제 동작은 알려지지 않았으며, 이들 CPU 모두에서 동작이 동일한지 여부도 알 수 없습니다.

참고 항목

참고문헌

  1. ^ "Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
  2. ^ 마이클 네카섹, SGDT/SIDT 픽션과 현실
  3. ^ WikiChip, UMIP – x86
  4. ^ Oracle Corporation, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, 섹션 3.5: 소프트웨어 가상화에 대한 세부 정보
  5. ^ MBC 프로젝트, 가상 머신 탐지(영구 링크) 또는 가상 머신 탐지(영구 링크)
  6. ^ Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), 챕터 8, 페이지 249, 257
  7. ^ 미국 특허 4974159, "멀티태스킹 컴퓨터 시스템에서의 제어권 이전 방법"은 63h/ARPL을 언급하고 있습니다.
  8. ^ Intel, Pentium® 프로세서 제품군 개발자 설명서, 1995년 3권, 주문 번호 241430-004, 섹션 12.7, 페이지 323
  9. ^ Intel, 마이크로아키텍처 데이터 샘플링의 작동 방식, 완화 섹션 참조.2022년 4월 22일에 보관됨
  10. ^ 리눅스 커널 문서, 마이크로아키텍처 데이터 샘플링(MDS) 완화 Wayback Machine에서 2020-10-21 아카이브
  11. ^ 인텔, 문서화되지 않은 iAPX 286 테스트 지침
  12. ^ VCF 포럼, 2019년 6월 21일 SAVEALL opcode를 찾았습니다.
  13. ^ replodsb, Intel 286 Secret : ICE mode and F10F 04, 2022년 8월 12일
  14. ^ LKML, (PATCH) x86-64, espfix: 31:16 %의 비트를 16비트 스택으로 유출하지 마십시오, 2014년 4월 29일.2018년 1월 4일에 보관됨
  15. ^ Raymond Chen, 윈도우 95에서 MS-DOS 게임 실행하기: iredd 문제 해결하기, 2016년 4월 4일2019년 3월 15일 보관
  16. ^ sandpile.org , x86 아키텍처 FLAGs 레지스터, 참고 #7 참조
  17. ^ 2021년 3월 22일, 볼뤼크, 이 이상한 속임수로 x86-64 명령 세트 전체를 몇 초 안에 추측할 수 있을까요?2021년 3월 23일 보관.
  18. ^ a b Robert Collins, Undocumented OpCodes, 1995년 7월 29일.2001년 2월 21일 보관.
  19. ^ Michal Necasek, ICEBP 최종 문서화, OS/2 Museum, 2018년 5월 25일2018년 6월 6일 보관
  20. ^ Intel, AP-526: Intel의 32비트 프로세서에 대한 최적화, 주문 번호 242816-001, 1995년 10월 – 목록INT186쪽에
  21. ^ AMD, AMD 64비트 기술, vol 2: 시스템 프로그래밍, 주문번호 24593, rev 3.06, 2002년 8월 248페이지
  22. ^ "Intel 80386 CPU Information PCJS Machines".
  23. ^ Geoff Chapell, CPUID 이전의 CPU ID
  24. ^ 제프 파슨스, 구식 80386 명령어: IBTSXBTS, PCjs 머신2020년 9월 19일 보관.
  25. ^ 로버트 콜린스, LOADALL 지침서.1997년 6월 5일 원본에서 보관.
  26. ^ Toth, Ervin (1998-03-16). "BSWAP with 16-bit registers". Archived from the original on 1999-11-03. The instruction brings down the upper word of the doubleword register without affecting its upper 16 bits.
  27. ^ Coldwin, Gynvael (2009-12-29). "BSWAP + 66h prefix". Retrieved 2018-10-03. internal (zero-)extending the value of a smaller (16-bit) register … applying the bswap to a 32-bit value "00 00 AH AL", … truncated to lower 16-bits, which are "00 00". … Bochs … bswap reg16 acts just like the bswap reg32 … QEMU … ignores the 66h prefix
  28. ^ Intel "i486 Microprocessor" (1989년 4월, 주문번호 240440-001) p.142 listsCMPXCHG암호화된
  29. ^ Intel "i486 Microprocessor" (1989년 11월, 주문번호 240440-002) p.135 목록CMPXCHG암호화된
  30. ^ "Intel 486 & 486 POD CPUID, S-spec, & Steppings".
  31. ^ Intel, Software Guard Extensions Programming Reference, 주문 번호 3298-002, Oct 2014, 섹션 3.5 및 3.6.5
  32. ^ Frank van Gilluwe, "The Undocumented PC, Second Edition", 1997, ISBN 0-201-47950-8, 55페이지
  33. ^ 인텔, 소프트웨어 개발자 매뉴얼, vol 3A, 주문번호 253668-078, 2022년 12월 9.3, 299페이지
  34. ^ "RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
  35. ^ 마이크로프로세서 보고서, 시스템 관리 모드 설명 (vol 6, no. 8, 1992년 6월 17일)2022년 6월 29일 보관.
  36. ^ Cyrix 486SLC/e 데이터 시트(1992), 섹션 2.6.4
  37. ^ Linux 6.3 커널 소스, /arch/x86/포함/asm/cpuid.h, 라인 69
  38. ^ gcc-patch 메일링 리스트, IDT Winchip용 CPUID Patch, 2019년 5월 21일
  39. ^ Intel, Intel® Virtualization Technology FlexMigration Application Note 주문 번호 323850-004, 2012년 10월, 섹션 2.3.2(12페이지)
  40. ^ 인텔, 아톰 프로세서 C3000 제품군 데이터시트 주문번호 337018-002, 2018년 2월 133페이지, 3808페이지, 38142022년 2월 9일 보관.
  41. ^ AMD, AMD64 Architecture Programmer's Manual Volume 3 pub.no . 24594, rev 3.34, 2022년 10월, p. 165 (엔트리온CPUID지시)
  42. ^ 로버트 콜린스, CPUID 알고리즘 전쟁, 1996년 11월.2000년 12월 18일 원본에서 보관.
  43. ^ Geoff Chappell, CMPXCHG8B 32비트 Windows 커널 지원, 2008년 1월 23일
  44. ^ a b Intel, Software Developer's Manual, 주문 번호 325426-077, 2022년 11월 – 엔트리RDTSCp.1739의 명령은 명령을 내리는 데 필요한 명령 시퀀스를 설명합니다.RDTSC이전 및 이후의 지시에 대한 지시
  45. ^ Linux 커널 5.4.12, /arch/x86/커널/cpu/centaur.c
  46. ^ 스택 오버플로, 일정한 비불변 tsc가 cpu 상태에서 주파수를 변경할 수 있습니까?2023년 1월 24일 접속.
  47. ^ CPU-World, IDT ZHAOX용 CPUIDIN Kai Xian KX-U6780 2.7GHz (KZ 기준).2023년 1월 24일 접속.
  48. ^ Michal Necasek, "문서화되지 않은 RDTSC", 2018년 4월 27일
  49. ^ JookWiki, 2022년 9월 24일, "nopp" – 긴 NOP의 역사와 그 주변의 문제에 대한 긴 설명을 제공합니다.2022년 10월 28일 보관.
  50. ^ a b 인텔 커뮤니티:멀티바이트 NOP 공식화.2022년 4월 7일 보관.
  51. ^ Intel Software Developers Manual, vol 3B (주문 번호 253669-076us, 2021년 12월), 섹션 22.15 "예약 NOP"
  52. ^ AMD, AMD 64비트 기술 AMD x86-64 Architecture Programmer's Manual Volume 3, 공개번호 24594, rev 3.02, 2002년 8월 379페이지
  53. ^ Intel, Intel Architecture Software Developer's Manual, Volume 2, 1997, 주문번호 243191-001, 페이지 3-9 및 A-7
  54. ^ John Hassey, Pentium Prochanges, GAS2 메일링 리스트, 1995년 12월 28일 – 패치를 추가했습니다.UD2A그리고.UD2B니모믹스를 GNU Binutils에 지시합니다.
  55. ^ Jan Beulich, x86: 올바른 UDn, binutils-gdb 메일링 리스트, 2017년 11월 23일 – ModR/M 바이트를 추가한 binutils 패치UD1/UD2B덧붙여서UD0.
  56. ^ Intel, Pentium® 프로세서 제품군 개발자 설명서 3권, 1995주문 번호 241430-004, 부록 A, 943페이지 – opcode 및 를 예약합니다.
  57. ^ a b AMD, AMD64 Architecture Programmer's Manual Volume 3, 공보 번호 24594, rev 3.17, 2011년 12월 – 416페이지 참조UD0그리고 415페이지와 419페이지를 위하여.UD1.
  58. ^ a b c Intel, Software Developer's Manual, vol 2B, 주문번호 253667-061, Dec 2016 – listsUD1(ModR/M 바이트 포함) 및UD0(ModR/M 바이트 미포함) (4-687페이지).
  59. ^ Julian Stecklina, 불법 Opcode를 사용하여 x86 CPU 지문채취, 2019년 2월 8일
  60. ^ a b Cyrix, 6x86 프로세서 데이터북, 1996, 주문 번호 94175-01, 표 6-20, 209페이지 – 니모닉 사용OIO("공식 유효하지 않은 opcode").
  61. ^ Intel, Software Developer's Manual, vol 2B, 주문번호 253667-064, Oct 2017 – listsUD0(ModR/M 바이트 포함) (4-683페이지).
  62. ^ AMD, AMD-K5 프로세서 기술 참조 매뉴얼, 1996년 11월, 주문 번호 18524C/0, 섹션 3.3.7, 90페이지 – 메모리를 할당하지 않고 opcode를 예약합니다.
  63. ^ AMD, AMD-K6 프로세서 데이터 시트, 주문 번호 20695H/0, 1998년 3월, 섹션 24.2, 283페이지
  64. ^ George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 2012년 6월 13일2019년 3월 15일 보관.
  65. ^ 인텔, AP-485: 인텔 ® 프로세서 식별 CPUID 명령어, 주문번호 241618-039, 2012년 5월, 섹션 5.1.2.5, 32페이지
  66. ^ 마이클 네카섹, "SYSENTER, 어디 있어요?"
  67. ^ AMD, 애슬론 프로세서 x86 코드 최적화 가이드, 출판 번호22007, rev K, 2002년 2월, 부록 F, 284페이지
  68. ^ Transmeta, 프로세서 인식, 2002년 5월 7일
  69. ^ VIA, VIA C3 Nehemiah 프로세서 데이터시트, rev 1.13, 2004년 9월 29일 17페이지
  70. ^ CPU-World, Intel Xeon용 CPUID 3.40GHz – CMPXCHG16B 없이 D CPUID를 밟지 않음
  71. ^ CPU-World, Intel Xeon용 CPUID 3.60GHz – CMPXCHG16B로 E CPUID를 밟지 않음
  72. ^ SuperUser Stack Exchange, cmpxchg16b 명령이 없는 오래된 x64 프로세서는 얼마나 널리 사용되고 있습니까?
  73. ^ Intel SDM 주문번호 325462-077, ap 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension"에는 렉스가 없는 MOVSXD가 기재되어 있습니다."당연했다"
  74. ^ 아난드테크, AMD Zen 3 라이젠 다이브 리뷰, 2020년 11월 5일 6페이지
  75. ^ @instlatx64 (October 31, 2020). "Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7" (Tweet). Retrieved 2023-01-20 – via Twitter.
  76. ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.
  77. ^ 인텔, 제어 흐름 강제 기술 규격 (v3.0, 주문번호 334525-003, 2019년 3월)
  78. ^ Intel SDM, rev 076, 2021년 12월 1권, 섹션 18.3.1
  79. ^ Binutils 메일 목록: x86: CET v2.0: NOTRACK 접두사 업데이트
  80. ^ AMD, 3DNow! MMX 명령어 세트, 참조번호 22466D/0, 2000년 3월, 페이지 11
  81. ^ 하디 브레이스, x86 SFENCE 명령의 의의, 2019년 2월 26일
  82. ^ 인텔, 소프트웨어 개발자 매뉴얼, 주문번호 325426-077, 2022년 11월 1권, 섹션 11.4.4.3, 276페이지
  83. ^ Hadi Brais, LFENCE 명령의 중요성, 2018년 5월 14일
  84. ^ AMD, AMD 프로세서의 추측을 관리하기 위한 소프트웨어 기술, rev 3.8.22, 2022년 3월 8일 4페이지2022년 3월 13일 보관.
  85. ^ Intel, Prescott New Instructions Software Developer's Guide, 주문번호 252490-003, 2003년 6월, 3-26페이지 및 3-38페이지 목록MONITOR그리고.MWAIT명시적인 피연산자를 사용할 수 있습니다.
  86. ^ 플랫 어셈블러 메시지 보드, "BLENDVPS/BLENDVD/PBLENDVB 구문"도 다룹니다.MONITOR/MWAIT기억법
  87. ^ 인텔, 인텔 ® Xeon Phi제품군 x200 (KNL) 사용자 모드 (링 3) MONitor and MWAIT (2017년 3월 5일 archived)
  88. ^ AMD, BIOS커널 개발자 설명서(BKDG) AMD 제품군 10h 프로세서용 주문번호 31116, rev 3.62, 419페이지
  89. ^ R. Zhang 등, (M)WAIT for It: 마이크로아키텍처와 건축 측면 채널 사이의 간극 해소, 2023년 1월 3일 5페이지2023년 1월 5일 원본에서 보관.
  90. ^ Guru3D, VIA Zhaoxin x864 8코어 SoC 프로세서 출시, 2018년 1월 22일
  91. ^ Vulners, x86: INVPCID를 정규 주소가 아닌 사용 시도의 DoS, 2018년 11월 20일
  92. ^ Intel, Intel® 64 IA-32 Architectures 소프트웨어 개발자 매뉴얼 제3권, 주문번호 325384-078, 2022년 12월 23.15장
  93. ^ a b Catherine Easdon, x86 RISC-V 마이크로아키텍처의 문서화되지 않은 CPU 동작: 보안의 관점, 2019년 5월 10일 39페이지
  94. ^ Instlatx64, Zhaoxin Kaixian KX-6000G CPUID 덤프, 2023년 5월 15일
  95. ^ a b c Intel, Intel® Software Guard Extensions(Intel® SGX) 가상화 환경에서 보안 메모리의 초과 구독을 위한 아키텍처, 2017년 6월 25일
  96. ^ Intel, Runtime Microcode Update with Intel® Software Guard Extensions, sep 2021, 주문 번호 648682 rev 1.02023년 3월 31일 원본에서 보관.
  97. ^ 인텔, 11세대 인텔®Core프로세서 데스크톱 데이터시트, 제1권, 2022년 5월, 주문번호 634648-004, 섹션 3.5, 65페이지
  98. ^ Intel, Intel® SGX(Software Guard Extensions) SGX2를 지원하는 플랫폼은 무엇입니까?2022년 5월 5일에 보관.
  99. ^ a b Intel, Trust Domain CPU Architectural Extensions, 주문 번호 343754-002, 2021년 5월
  100. ^ @InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23 – via Twitter.
  101. ^ @Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20 – via Twitter.
  102. ^ Wikichip, CLZERO – x86
  103. ^ Intel, Application note AP-578: Intel Architecture Processor용 FPU 예외 핸들러에 대한 소프트웨어하드웨어 고려사항, 주문번호 243291-002, 1997년 2월
  104. ^ Intel, Application Note AP-113: 숫자 데이터 프로세서 시작하기, 1981년 2월 24-25페이지
  105. ^ Intel, 8087 Math Copprocessor, Oct 1989, 주문번호 285385-007, 3-100페이지, 그림 9
  106. ^ 인텔, 80287 80비트 HMOS 숫자 프로세서 확장, 1983년 2월, 주문번호 201920-001, 14페이지
  107. ^ Intel, iAPX86, 88 사용 설명서, 1981 (주문번호 2201-001), 페이지 797
  108. ^ a b Intel 80286 80287 프로그래머 참조 매뉴얼, 1987 (주문 번호 210498-005), 페이지 485
  109. ^ 인텔 소프트웨어 개발자 설명서 3B권, 개정판 064, 섹션 22.18.9
  110. ^ "GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'".
  111. ^ Michael Steil, FFREEP 존재하지 않았던 조립 지침
  112. ^ 두스코 콘칼리예프, 펜티엄 FDIV 버그
  113. ^ Bruce Dawson, Intel, 오류 한계 13억 5천만으로 과소평가
  114. ^ Intel SDM, rev 053 이상에서는 다음에 사용되는 정확한 인수 축소 절차를 설명합니다.FSIN,FCOS,FSINCOS그리고.FPTAN제1권 제8.3.8절에서
  115. ^ Intel, Intel® 64IA-32 Architecture Optimization Reference Manual (주문 번호 248966-044, 2021년 6월) 섹션 3.5.2.3
  116. ^ "The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers" (PDF). Retrieved October 17, 2016.
  117. ^ "Chess programming AVX2". Archived from the original on July 10, 2017. Retrieved October 17, 2016.
  118. ^ "Intel AVX-512 Instructions". Intel. Retrieved 21 June 2022.
  119. ^ Intel, DRNG(Digital Random Number Generator) 소프트웨어 구현 가이드 rev 2.1, 2018년 10월 17일 섹션 5.2 및 5.32021년 11월 19일 보관.
  120. ^ Michal Ludvig, VIA PadLock—Wicked Fast Encryption, Linux Journal, 2005년 4월 6일.2005년 6월 20일에 보관.
  121. ^ 스택 오버플로, VIA의 Padlock Hashing Engine을 이용한 스트리밍 SHA 계산?,2014년8월11일2019년 6월 14일 보관.
    스택 오버플로 답변에 참조된 PadLock SDK(v3.1)는 Crypto++ wiki(2023년 8월 11일 액세스) 또는 Wayback Machine에서 다운로드할 수 있습니다.
  122. ^ Zhaoxin, Zhaoxin 프로세서 기반 국가 암호화 알고리즘 가속화 명령어 사용을 위한 핵심 기술 지침(중국어)2022년 1월 5일 보관
  123. ^ 자오신, GMI 사용 설명서 v1.0(중국어).2022년 2월 28일 보관
  124. ^ AMD, AMD64 가상화 코드명 "Pacifica" 기술, 공보 제33407호, 2005.5.01.2011년 6월 13일에 보관.
  125. ^ CPU-World, AMD Turion 64 X2 RM-75용 CPUID, 2022-03-05
  126. ^ Intel, Intel® AtomProduct Family for Microserver 데이터시트, Volume 1 of 2, 주문번호 328194-001, dec 2012, 44페이지
  127. ^ 보안.주간, 인텔, 2023년 1월 10일 4세대 제온 프로세서 출시로 기밀 컴퓨팅 포트폴리오에 TDX 추가
  128. ^ Robert Collins, Undocumented OpCode: AAM
  129. ^ a b Frank van Gilluwe, "The Undocumented PC – Second Edition", 페이지 93-95
  130. ^ 마이클 네카섹, 인텔 486 에라타?
  131. ^ Robert Hummel, "PC Magazine Programmer's Technical Reference" (ISBN 1-56276-016-5) p.728
  132. ^ 라울 구티에레스 산즈, 8086 작품집, 1부
  133. ^ a b "Asm, opcode 82h".
  134. ^ 인텔 코퍼레이션 2022, 페이지 3698
  135. ^ Intel, The 8086 Family User's Manual, 1979년 10월, opcode 4-25페이지 및 4-31페이지 생략
  136. ^ Retrocomputing Stack Exchange, 80386 이전의 x86 CPU에서 문서화되지 않은 지침?
  137. ^ 다니엘 B.Sedory, 표준 MBR의 고찰
  138. ^ AMD, AMD64 프로세서용 소프트웨어 최적화 가이드 (공보 25112, 개정판 3.06, 2005년 9월), 섹션 6.2, 페이지 128
  139. ^ 버그 48227 – -march=core2에 대해 "repret" 생성
  140. ^ 레이먼드 첸, 세상에, 이상한 NOP가 있군요!
  141. ^ Jeff Parsons, Intel 80386 CPU 정보 (B1 errata 섹션, 항목 #7)
  142. ^ retrocomputing Stack Exchange, i80286의 0F1 홉코드 접두사
  143. ^ Intel 소프트웨어 개발자 설명서, 2B권(2006년 1월 주문 번호 235667-018, 긴 NOP 없음)
  144. ^ Intel 소프트웨어 개발자 설명서, 2B권(2006년 3월, 주문 번호 235667-019, 긴 NOP 포함)
  145. ^ 아그너 포그, 지침표, AMD K7 섹션
  146. ^ "579838 – glibc not compatible with AMD Geode LX".
  147. ^ Intel 소프트웨어 개발자 설명서, 2B권(2005년 4월, 주문 번호 235667-015, 0F0D-nop 목록에 없음)
  148. ^ Intel Software Developers Manual, volume 2B (2005년 6월, 주문 번호 235667-016, opcode 테이블에는 0F0D-nop이 나열되어 있지만 NOP 지침 설명에는 포함되어 있지 않음)
  149. ^ Intel Software Developers Manual, Volume 2B(주문 번호 253667-060, 2016년 9월)에는 UD0 및 UD1이 나와 있지 않습니다.
  150. ^ "PCJS : pcjs/x86op0F.js (two-byte x86 opcode handlers), lines 1647–1651". GitHub. 17 April 2022.
  151. ^ "80486 paging protection faults? \ VOGONS". Archived from the original on 9 April 2022.
  152. ^ "Invalid opcode handling \ VOGONS". Archived from the original on 9 April 2022.
  153. ^ "Invalid instructions cause exit even if Int 6 is hooked \ VOGONS". Archived from the original on 9 April 2022.
  154. ^ "Tutorial – Calling Win32 from DOS". Ragestorm. 17 Sep 2005. Archived from the original on 9 April 2022.
  155. ^ "Accessing Windows device drivers from DOS programs".
  156. ^ a b "8086 microcode disassembled". Reenigne blog. 2020-09-03. Retrieved 2022-07-26. Using the REP or REPNE prefix with a MUL or IMUL instruction negates the product. Using the REP or REPNE prefix with an IDIV instruction negates the quotient.
  157. ^ "Re: Undocumented opcodes (HINT_NOP)". Archived from the original on 2004-11-06. Retrieved 2010-11-07.
  158. ^ "Re: Also some undocumented 0Fh opcodes". Archived from the original on 2003-06-26. Retrieved 2010-11-07.
  159. ^ 인텔의 SCC용 RCCE 라이브러리는 opcode를 사용했습니다.0F 0ASCC의 메시지 무효화 지시에 대한.
  160. ^ Intel Labs, SCC 외부 아키텍처 사양(EAS), Revision 0.94, p.292022년 5월 22일 보관.
  161. ^ "Undocumented x86 instructions to control the CPU at the microarchitecture level in modern Intel processors" (PDF). 9 July 2021.
  162. ^ 로버트 R.콜린스, 문서화되지 않은 OpCode: UMOV. 2001년 2월 21일 보관.
  163. ^ Herbert Oppmann, NXOP (Opcode 0Fh 55h)
  164. ^ Herbert Oppmann, NexGen Nx586 Hypercode 소스, COMMEN.INC 참조
  165. ^ Herbert Oppmann, NxGen Nx586 시스템 BIOS 내부
  166. ^ Intel, XuCode: 2021년 5월 6일 복합 명령어 흐름 구현을 위한 혁신 기술2022년 7월 19일 보관.
  167. ^ Grzegorz Mazur, AMD 3D Now! 문서화되지 않은 지침
  168. ^ a b "Undocumented 3DNow! Instructions". grafi.ii.pw.edu.pl. Archived from the original on 30 January 2003. Retrieved 22 February 2022.
  169. ^ 포템킨의 해커 그룹의 OPCODE.LST, v4.51
  170. ^ "[UCA CPU Analysis] Prototype UMC Green CPU U5S-SUPER33". 25 May 2020.
  171. ^ Agner Fog, 인텔, AMD VIA CPU의 마이크로아키텍처 섹션 3.4 "P4 및 P4E에서의 분기 예측"
  172. ^ 레딧 /r/Amd 토론 스레드: 라이젠은 FMA4에 대한 문서화되지 않은 지원을 가지고 있습니다.
  173. ^ "Welcome to the OpenSSL Project". GitHub. 21 April 2022.
  174. ^ 패치: VIA C7 및 Nano CPU용 PadLock 엔진 업데이트
  175. ^ a b 크리스토퍼 도마스, x86 ISA 깨기
  176. ^ a b Xixing Li et al, UISFuzz : CPU 미문서 명령어 검색의 효율적인 퍼징 방법
  177. ^ a b OpenEuler 메일링 리스트, PATCH 커널-4.19 v25/6 : x86/cpu 기능: 자오신 피쳐 비트를 추가합니다.2022년 4월 9일 보관.
  178. ^ USPTO/Zhaoxin, 특허 출원 US2023/006718: 해시 암호 알고리즘을 갖는 프로세서 및 그 데이터 처리, 13페이지 및 45페이지, 2023년 3월 2일.2023년 9월 12일 보관.
  179. ^ InstLatx64, Zhaoxin KaiXian KX-6000G용 CPUID 덤프 – SM2 및 xmodx 기능 비트가 설정되어 있습니다(CPUID 리프 C0000001:EDX:비트 0과 29).2023년 7월 25일 보관.
  180. ^ 마이크로프로세서 보고서, MediaGX는 저비용 PC를 대상으로 합니다 (vol 11, no. 3, 1997년 3월 10일)
  181. ^ Intel XED용 ISA 데이터 파일(2022년 4월 17일), 라인 916-944
  182. ^ Cyrix 6x86 프로세서 데이터북, 6-34페이지
  183. ^ AMD Geode LX 프로세서 데이터 북, 출판물 3234H, 페이지 670

외부 링크