x86 명령어 목록
x86 instruction listings![]() | 이 기사는 너무 길어서 편하게 읽고 탐색할 수 없습니다.(2017년 11월) |
x86 명령어 집합은 x86 호환 마이크로프로세서가 지원하는 명령어 집합을 나타냅니다.명령어는 대개 실행 가능한 프로그램의 일부이며, 종종 컴퓨터 파일로 저장되고 프로세서에서 실행됩니다.
x86 명령어 세트는 여러 번 확장되어 더 넓은 레지스터와 데이터 유형뿐만 아니라 새로운 기능을 도입했습니다.[1]
x86 정수 명령어
아래는 인텔의 전체 8086/8088 명령어 세트(총 81개의 명령어)입니다.대부분의 명령어는 32비트 모드에서 사용할 수는 없지만, 16비트(ax, bx 등) 레지스터와 값에서 작동합니다.업데이트된 명령어 집합은 아키텍처(i386, i486, i686)에 따라 그룹화되기도 하며, 일반적으로 (32비트) x86 및 (64비트) x86-64(AMD64라고도 함)라고도 합니다.
원본 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를 종료합니다. |
- ^ a b c d 에 의해 사용되는 설명자.
LGDT
,LIDT
,SGDT
그리고.SIDT
명령어는 2-파트 데이터 구조로 구성됩니다.첫 번째 부분은 16비트 값으로, 테이블 크기를 바이트에서 1을 뺀 값으로 지정합니다.두 번째 부분은 32비트 값(64비트 모드의 경우 64비트 값)으로 테이블의 선형 시작 주소를 지정합니다.
위해서LGDT
그리고.LIDT
16비트 피연산자 크기의 주소는 00FFFFFh로 AND 처리됩니다.Intel(AMD는 아님) CPU의 경우SGDT
그리고.SIDT
16비트 피연산자 크기의 명령어는 2023년 3월 Intel SDM 리비전 079에서 마지막 바이트가 0으로 설정된 상태에서 메모리에 디스크립터를 쓰기 위해 문서화되었습니다.그러나 관찰된 동작은 디스크립터 테이블 주소의 비트 31:24가 대신 기록되는 것입니다.[2] - ^ a b c d e 그
LGDT
,LIDT
,LLDT
,LMSW
그리고.LTR
명령어는 펜티엄 이후의 프로세서에서 직렬화되고 있습니다. - ^ 80386 이상에서 "Machine Status Word"는 CR0 제어 레지스터와 동일하지만,
LMSW
명령어는 이 레지스터의 하위 4비트만 수정할 수 있고 0비트는 지울 수 없습니다.
비트 0을 지울 수 없다는 것은LMSW
x86 Protected Mode(보호 모드)를 시작할 때는 사용할 수 있지만 종료할 수는 없습니다.80286에서는 CPU 리셋 없이 보호 모드를 완전히 종료할 수 없습니다. 80386 이상에서는 보호 모드를 종료할 수 있지만 이를 위해서는 80386 이상 MOV to CR0 명령을 사용해야 합니다. - ^ 한다면
CR4.UMIP=1
설정된 다음,SGDT
,SIDT
,SLDT
,SMSW
그리고.STR
명령은 Ring 0에서만 실행할 수 있습니다.
이러한 지침은 80286 이후부터 2017년 UMIP가 도입될 때까지 모든 x86 CPU에서 적용되지 않았습니다.[3]이러한 지침은 VM 게스트가 VM 내부에서 실행 중임을 감지하는 데 사용할 수 있기 때문에 소프트웨어 기반 가상화에서 중요한 보안 문제가 되었습니다.[4][5] - ^ a b c 그
SMSW
,SLDT
그리고.STR
명령어는 메모리 인수와 함께 사용될 때 항상 16비트의 피연산자 크기를 사용합니다.80386 이상의 프로세서에서 레지스터 인수를 사용하면 더 넓은 대상 피연산자 크기를 사용할 수 있으며 다음과 같이 동작합니다.SMSW
: x86-64 Long 모드에서 전체 CR0를 저장하며, 그렇지 않으면 정의되지 않습니다.SLDT
: Pentium Pro 이상의 프로세서에서 이전 프로세서에서는 정의되지 않은 16비트 인수를 0으로 확장합니다.STR
: 16비트 인수를 0으로 확장합니다.
- ^ x86-64 long 모드에서
ARPL
명령을 사용할 수 없습니다. – the63 /r
opcode가 64비트 모드 전용으로 재할당되었습니다.MOVSXD
설명. - ^ 그
ARPL
명령은 #UD를 Real 모드와 Virtual 8086 Mode에서 유발합니다 – Windows 95와 OS/2 2.x는 이 #UD를 광범위하게 사용하여 사용하는 것으로 알려져 있습니다.63
opcode는 가상 8086 모드에서 커널 모드로 전환하기 위한 1바이트 중단점입니다.[6][7] - ^ 이 마스크의 비트 19:16은 Intel CPU에서 "정의되지 않음"으로 문서화됩니다.[8]AMD CPU에서 마스크는 다음과 같이 문서화되어 있습니다.
0x00FFFF00
. - ^ 2019년 이후 인텔 CPU/마이크로코드의 일부 조합에서
VERW
명령어는 마이크로아키텍처 데이터 버퍼도 플러시합니다.이를 통해 마이크로아키텍처 데이터 샘플링 보안 취약성에 대한 해결책의 일부로 사용할 수 있습니다.[9][10] - ^ a b 미문서, 80286만 해당.[11][12][13] (다른 버전의
LOADALL
80386에 다른 opcode와 메모리 레이아웃이 존재합니다.)
80386 추가
80386은 x86 명령어 세트에 32비트 연산 지원을 추가했습니다.이것은 범용 레지스터를 32비트로 확장하고 OperandSize와 AddressSize의 개념을 도입함으로써 이루어졌습니다. 이전에 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
그리고.GS
x86 컨트롤, 디버그 및 테스트 레지스터 뿐만 아니라
80386에 도입된 새로운 명령어는 크게 두 가지 클래스로 나눌 수 있습니다.
- 32비트 Operand Size 변형(예: 32비트 Operand Size 변형)을 위해 새로운 니모닉이 필요했던 기존 opcode.
CWDE
,LODSD
) - 새로운 기능을 도입한 새로운 opcode (예:
SHLD
,SETcc
)
명령어의 인수에서 피연산자 크기를 유추할 수 있는 명령어 양식의 경우(예:ADD EAX,EBX
EAX를 인수로 사용하기 때문에 32비트 OperandSize를 갖는 것으로 추론할 수 있습니다), 새로운 명령어 니모닉이 필요하지 않고 제공되지 않습니다.
유형 | 지시 기억법 | 옵코드 | 묘사 | 이전 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비트의 배당금을 준비하는 데 사용됩니다. | 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비트와 다른 점IRET 16비트 항목이 아닌 32비트 항목으로 스택에서 인터럽트 리턴 항목(EIP, CS, EFLAGS; 또한 CPL 변경이 있는 경우[j] ESP 및 SS)을 팝합니다.인터럽트 핸들러가 32비트 IDT 인터럽트/트랩 게이트를 통해 입력되었을 때 인터럽트에서 반환할 때 사용해야 합니다.명령을 직렬화하고 있습니다. | IRET |
- ^ 32비트 문자열 명령의 경우 ±±표기를 사용하여 표시된 레지스터가 다음과 같이 4만큼 후감소됨을 나타냅니다.
EFLAGS.DF=1
그 외에는 4개가 증가했습니다.
DS 세그먼트가 표시된 피연산자의 경우, 세그먼트 오버라이드 접두사로 DS 세그먼트를 재정의할 수 있습니다. ES 세그먼트가 표시된 경우 세그먼트는 항상 ES이므로 재정의할 수 없습니다.
16비트 SI/DI 레지스터 또는 32비트 ESI/EDI 레지스터를 사용할 주소 레지스터로 사용할 것인지의 선택은 AddressSize에 의해 결정되며, 이는 덮어쓸 수 있습니다.67
접두사를 붙입니다 - ^ 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
)이 성립합니다. - ^ 를 위해
INSB/W/D
명령, 에 대한 메모리 액세스 권한ES:[rDI]
메모리 주소는 포트 액세스가 수행된 후까지 확인되지 않을 수 있습니다. 이 확인이 실패할 경우(예: 페이지 오류 또는 기타 메모리 예외), 포트에서 읽은 데이터 항목이 손실됩니다.따라서 읽기 시 부작용이 발생하는 I/O 포트에 액세스하려면 이 지침을 사용하지 않는 것이 좋습니다. - ^ CPL≤인 경우에만 I/O 포트 액세스가 허용됩니다.포트가 액세스할 IOPL 또는 I/O 포트 권한 비트맵 비트가 모두 0으로 설정됩니다.
- ^ 그
CWDE
오래된 것과 다른 지시.CWD
그것에 관한 지시.CWD
는 AX의 16비트 값을 DX:AX 레지스터 쌍의 32비트 값으로 부호 확장합니다. - ^ 를 위해
E3
opcode ()JCXZ
/JECXZ
), 명령어가 다음을 사용할지 여부의 선택CX
아니면ECX
비교를 위해(그리고 결과적으로 어떤 니모닉을 사용할 것인지) OperandSize가 아닌 AddressSize를 기반으로 합니다(OperandSize는 대신 점프 대상을 16비트로 잘라야 하는지 여부를 제어합니다)
이는 루프 지침에도 적용됩니다.LOOP
,LOOPE
,LOOPNE
(opcode)E0
,E1
,E2
), 단, 과는JCX
/JECXZ
, 이러한 지침은 ECX 사용 변형에 대한 새로운 니모닉이 주어지지 않았습니다. - ^ 위해서
PUSHA(D)
, 스택에 푸시된 SP/ESP의 값은 바로 직전에 가지고 있던 값입니다.PUSHA(D)
명령이 실행되기 시작했습니다. - ^ 위해서
POPA
/POPAD
, SP/ESP에 해당하는 스택 항목은 스택에서 팝업되지만(메모리 읽기 수행) SP/ESP에는 배치되지 않습니다. - ^ 그
PUSHFD
그리고.POPFD
IOPL이 3이 아닌 경우 가상 8086 모드에서 실행되는 경우 명령어는 #GP 예외를 발생시킵니다.
그PUSHF
,POPF
,IRET
그리고.IRETD
IOPL이 3이 아니고 VME가 활성화되지 않은 경우 Virtual-8086 모드에서 실행되면 지침에 따라 #GP 예외가 발생합니다. - ^ 한다면
IRETD
커널 모드에서 사용자 모드(CPL 변경을 수반할 것)로 되돌리는 데 사용되며 SS에 의해 지시되는 사용자 모드 스택 세그먼트는 16비트 세그먼트입니다.IRETD
명령어는 스택 포인터(ESP/RSP)의 낮은 16비트만 복원할 것이며, 남은 비트들은 커널 코드에 그들이 가지고 있던 값을 이전에 유지할 것입니다.IRETD
. 이로 인해 Linux("ESPIX")[14]와 Windows 모두에서 복잡한 해결책이 필요하게 되었습니다.[15]이 문제는 이후 64비트에도 영향을 미칩니다.IRETQ
설명.
명령어 기억법 | 옵코드 | 묘사 | 울리다 |
---|---|---|---|
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 이상의 프로세서에서는 다음으로 이동합니다. | |
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 모드에서 사용자 메모리에 액세스할 수 있는 데이터 이동을 수행합니다. 다음과 같은 작업을 수행합니다. | |
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 |
- ^ a b c d 를 위해
BT
,BTS
,BTR
그리고.BTC
지침:- 명령에 대한 첫 번째 인수가 레지스터 피연산자이고 두 번째 인수가 즉시인 경우 두 번째 인수의 비트 인덱스는 modulo 피연산자 크기(16/32/64, 사실상 인덱스의 하위 4, 5 또는 6비트만 사용)를 가져옵니다.
- 첫 번째 인수가 메모리 피연산자이고 두 번째 인수가 레지스터 피연산자인 경우 두 번째 인수의 비트 인덱스가 모두 사용됩니다. 즉, 비트 테스트에 사용할 메모리 주소를 오프셋하는 데 사용되는 부호 비트 인덱스로 해석됩니다.
- ^ a b c 그
BTS
,BTC
그리고.BTR
명령은 수락합니다.LOCK
(F0
) 메모리 인수와 함께 사용할 경우 접두사 – 명령어가 원자적으로 실행됩니다. - ^ 만약에
F3
prefix는 opcode와 함께 사용되며, 명령어는 다음과 같이 실행됩니다.TZCNT
BMI1 확장을 지원하는 시스템에서.TZCNT
다르다BSF
그 점에서TZCNT
그러나 그렇지는BSR
소스 피연산자가 0일 경우 피연산자 크기를 반환하도록 정의됩니다. 다른 소스 피연산자 값의 경우 동일한 결과를 생성합니다. - ^ a b
BSF
그리고.BSR
EFLAGS를 설정합니다.소스 인수가 all-0이면 ZF를 1로 플래그를 지정하고 그렇지 않으면 0으로 플래그를 지정합니다.
source 인수가 all-0s인 경우 대상 레지스터는 AMD 프로세서에서는 변경되지 않은 상태로 유지되지만 Intel 프로세서에서는 정의되지 않은 값으로 설정된 것으로 문서화됩니다. - ^ 만약에
F3
prefix는 opcode와 함께 사용되며, 명령어는 다음과 같이 실행됩니다.LZCNT
ABM 또는 LZCNT 확장을 지원하는 시스템에서 사용할 수 있습니다.LZCNT
와 다른 결과를 가져옵니다.BSR
대부분의 입력 값에 적용됩니다. - ^ a b 위해서
SHLD
그리고.SHRD
, 시프트 양은 마스킹됩니다. 하위 5비트는 16/32비트 피연산자 크기에 사용되고 6비트는 64비트 피연산자 크기에 사용됩니다.SHLD
그리고.SHRD
16비트 인수와 16보다 큰 시프트 양은 정의되지 않은 결과를 생성합니다. (실제 결과는 인텔 CPU마다 다르며, 적어도 세 가지 동작이 알려져 있습니다.)[16] - ^ 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): "덜하거나 같지 않음", "더 크다" - ^ 위해서
SETcc
, opcode는 일반적으로 /0으로 지정되는데, 이는 명령의 ModR/M 바이트의 비트 5:3이 000이어야 함을 의미합니다. – 현대 x86 프로세서(펜티엄 이후)는 비트 5:3을 무시하고 명령을 다음과 같이 실행합니다.SETcc
이 비트들의 내용에 관계없이. - ^ 위해서
LFS
,LGS
그리고.LSS
, 파 포인터의 오프셋 부분의 크기는 피연산자 크기로 표시됩니다. 세그먼트 부분의 크기는 항상 16비트입니다.64비트 모드에서는REX.W
이러한 지침을 포함한 접두사를 사용하면 인텔에서는 64비트 오프셋이 있는 먼 포인터를 로드하지만 AMD 프로세서에서는 로드할 수 없습니다. - ^ 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
. - ^ a b c d 이동/이동의 경우
CRx
그리고.DRx
레지스터, 피연산자 크기는 64비트 모드에서는 항상 64비트이고 그렇지 않으면 32비트입니다. - ^ Pentium 이전 프로세서에서는 다음으로 이동합니다.
CR0
명령 스트림을 직렬화하지 않습니다. 이러한 이유로 인해 일반적으로 다음과 같은 즉시 멀리뛰기를 수행해야 합니다.MOV
로.CR0
그와 같은 경우에는MOV
보호 모드 및/또는 메모리 페이징을 활성화/비활성화하는 데 사용됩니다.MOV
로.CR2
는 구조적으로 직렬화로 나열되어 있지만 적어도 일부 인텔 Core-i7 프로세서에서는 직렬화되지 않는 것으로 보고되었습니다.[17]MOV
로.CR8
(x86-64와 함께 도입됨)이(가) 직렬화되고 있지 않습니다. - ^ a b 그
MOV TRx
명령은 펜티엄 이후부터 중단되었습니다. - ^ 그
INT1
/ICEBP
(F1
) 지침은 80386 이후의 알려진 모든 Intel x86 프로세서에 있지만 Intel SDM(rev 067) 이후의 Intel 프로세서에 대해서만 완전히 문서화되었습니다.[18][19]이 릴리스 이전에는 Intel 자료에 대한 설명이 산발적으로 언급되었습니다(예: AP-526 rev001).[20]
AMD 프로세서의 경우 2002년부터 지침이 문서화되어 있습니다.[21] - ^ 의 작동.
F1
(ICEBP
) opcode는 일반 소프트웨어 인터럽트 opcode와 몇 가지 점에서 다릅니다.- 보호 모드에서는 접근 권한 검사로 인터럽트 설명자의 DPL 필드에 대해 CPL을 검사합니다.
- virtual-8086 모드에서는 액세스 권한 검사로 IOPL에 대한 CPL도 검사합니다.
F1
하지 않을 것이다. - VME를 사용하도록 설정된 virtual-8086 모드에서는 인터럽트 리디렉션이 지원되지만 다음에 대해서는 지원되지 않습니다.
F1
.
F1
하지 않을 것이다. - virtual-8086 모드에서는 액세스 권한 검사로 IOPL에 대한 CPL도 검사합니다.
- ^ UMOV 명령은 386 및 486 프로세서에만 있습니다.[18]
- ^ a b 그
XBTS
그리고.IBTS
명령은 80386의 B1 스텝핑과 함께 중단되었습니다.
주로 80386의 버그[22] B0 스텝을 감지하기 위해 소프트웨어에 의해 사용되었습니다.Microsoft Windows(v2.01 이상)에서는XBTS
CPU 검출의 일부로 명령을 실행하는 경우CPUID
존재하지 않으며, 만약에 부팅을 위해 부팅을 거부할 것입니다.XBTS
작동 중인 것으로 확인되었습니다.[23] - ^ a b 위해서
XBTS
그리고.IBTS
, r/m 인수는 비트 필드를 추출/삽입할 데이터, reg 인수는 삽입/추출할 비트 필드, AX/EAX는 비트 오프셋, CL은 비트 필드 길이를 나타냅니다.[24] - ^ 미등록, 80386만.[25]
80486 추가
설명 | 옵코드 | 묘사 | 울리다 |
---|---|---|---|
BSWAP r32 | 0F C8+r | 바이트 순서 스왑.일반적으로 빅 엔디언 데이터 표현과 리틀 엔디언 데이터 표현 간의 변환에 사용됩니다.32비트 레지스터의 경우 수행되는 작업은 다음과 같습니다.r = (r < 24) ((r < 8) & 0x00FF0000) ((r >> 8) & 0x0000FF00)(r >> 24); 사용. | 3 |
CMPXCHG r/m8,r8 | 0F B0 /r [b] | 비교하고 교환합니다.누산기(AL/AX/EAX/RAX)가 첫 번째 피연산자와[c] 동일한 값을 비교할 경우EFLAGS.ZF 를 1로 설정하고 첫 번째 피연산자를 두 번째 피연산자로 덮어씁니다.그렇지않으면,EFLAGS.ZF 는 0으로 설정되며, 첫 번째 피연산자는 누산기에 복사됩니다.명령 원자만 함께 사용되는 경우 | |
CMPXCHG r/m,r16 CMPXCHG r/m,r32 | 0F B1 /r [b] | ||
XADD r/m,r8 | 0F C0 /r | eExchange and ADD.첫 번째 피연산자와 두 번째 피연산자를 교환한 다음 두 값의 합을 대상 피연산자에 저장합니다. 명령 원자만 함께 사용되는 경우 | |
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]프로세서의 내부 캐시에 있는 모든 수정된 캐시 라인을 기본 메모리에 다시 쓰고 내부 캐시를 무효화합니다. |
- ^ 사용.
BSWAP
16비트 레지스터는 허용되지 않지만(#UD나 다른 예외를 생성하지 않고 실행) 정의되지 않은 결과를 생성하도록 문서화되어 있습니다(486, 586,[26] Box/QEMU에서 다양한 결과를 생성하는 것으로 보고됩니다).[27] - ^ a b 인텔 80486 스텝 A에서,[28]
CMPXCHG
명령어는 다른 인코딩을 사용합니다 - 8비트 변형의 경우, 16/32비트 변형의 경우.인코딩은 80486 단계 B 이상에서 사용됩니다.[29][30] - ^ 그
CMPXCHG
명령어 세트EFLAGS
와 마찬가지로CMP
첫 번째 인수와 같이 누적기(AL/AX/EAX/RAX)를 사용하는 명령. - ^
INVLPG
m8 인수가 올바르지 않은 경우(예: 매핑되지 않은 페이지 또는 canonical가 아닌 주소), no-operation으로 실행됩니다.INVLPG
를 사용하여 개별 전역 페이지에 대한 TLB 항목을 무효화할 수 있습니다. - ^ a b 그
INVD
그리고.WBINVD
명령어는 CPU의 L1 캐시에 있는 모든 캐시 라인을 무효화합니다.L2/L3 캐시도 무효화할지 여부는 구현에 정의되어 있습니다.
이 명령어는 직렬화되고 있습니다. 일부 프로세서에서는 완료될 때까지 인터럽트를 차단할 수도 있습니다. - ^ PRM(Processor Reserved Memory)이 PRMR(PRM range registers)을 사용하여 설정된 경우
INVD
명령이 허용되지 않으므로 #GP(0) 예외가 발생합니다.(PRM은 Intel SGX에 필요합니다.)[31] - ^ 만약에
F3
접두사는 다음과 함께 사용됩니다.0F 09
opcode, 그러면 명령어는 다음과 같이 실행됩니다.WBNOINVD
WBNOINVD 확장을 지원하는 프로세서에서는 캐시가 무효화되지 않습니다.
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 의무화를 야기합니다. 지원. | 보통 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. | 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] |
- ^ Intel 및 AMD CPU의 경우
WRMSR
명령어는 또한 CPU 마이크로코드를 업데이트하는데 사용됩니다.MSR에 업로드할 새 마이크로코드의 가상 주소를 기록하면 됩니다.79h
인텔 CPU 및 MSR에서C001_0020h
AMD CPU에서. - ^ 다음 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) - ^ 시스템 관리 모드 및
RSM
인텔 486은 1993년 인텔 펜티엄이 처음 출시된 후에야 SL이 아닌 버전에서 사용할 수 있었습니다. - ^ 일부 이전 32비트 프로세서에서 실행
CPUID
리프 인덱스(EAX)가 0보다 크면 EBX 및 ECX가 수정되지 않은 상태로 남아 이전 값을 유지할 수 있습니다.따라서 실행하기 전에 EBX와 ECX를 제로 아웃하는 것이 좋습니다.CPUID
.
이러한 동작을 나타내는 것으로 주목되는 프로세서로는 Cyrix MII와[37] IDT WinChip 2가 있습니다.[38]
64비트 모드에서는,CPUID
는 RAX, RBX, RCX 및 RDX의 상위 32비트를 0으로 설정합니다. - ^ Ivy Bridge에서 시작하는 일부 Intel 프로세서에는 제한을 위해 사용할 수 있는 MSR이 존재합니다.
CPUID
0을 울립니다.이러한 MSR은 적어도 Ivy Bridge와[39] Denverton에 대해서는 문서화되어 있습니다.[40]
제한하는 능력CPUID
링 0은 "CpuidUserDis" 기능(Zen 4 "Raphael" 이상)을 지원하는 AMD 프로세서에도 존재합니다.[41] - ^ a b
CPUID
또한 인텔 펜티엄 최초 출시 이후 출시된 일부 인텔 및 AMD 486 프로세서 변종에서도 사용할 수 있습니다. - ^ Cyrix 5x86 및 6x86 CPU의 경우,
CPUID
는 기본적으로 활성화되지 않으며 Cyrix 구성 레지스터를 통해 활성화해야 합니다. - ^ NexGen CPU의 경우,
CPUID
일부 시스템 BIOS에서만 지원됩니다.를 지원하는 일부 NexGen CPU에서CPUID
, EFLAGS.ID는 지원되지 않지만 EFLAGS입니다.AC는 CPU 검출을 복잡하게 만듭니다.[42] - ^ 형들과는 다르게
CMPXCHG
수업, 그CMPXCHG8B
명령어는 ZF 이외의 EFLAGS 비트를 수정하지 않습니다. - ^
LOCK CMPXCHG8B
레지스터 피연산자(잘못된 인코딩)를 사용하면 일부 Intel Pentium CPU(Pentium F00F 버그)가 중단될 수 있습니다. - ^ a b c IDT WinChip, Transmeta Crusoe 및 Rise mP6 프로세서에서
CMPXCHG8B
명령은 항상 지원되지만 해당 CPUID 비트가 누락될 수 있습니다.이것은 윈도우 NT의 버그에 대한 해결책입니다.[43] - ^ a b 그
RDTSC
그리고.RDPMC
명령어는 다른 명령어와 관련하여 명령되지 않으며, 이전 명령어가 실행되기 전에 또는 이후 명령어가 실행된 후에 각각의 카운터를 샘플링할 수 있습니다.호출RDPMC
(그렇지는 않음)RDTSC
)는 동일한 카운터의 읽기에 대해서도 서로 상대적으로 재정렬될 수 있습니다.
그 밖의 지시에 관하여 명령을 부과하기 위하여,LFENCE
또는 명령을 직렬화합니다(예:CPUID
)가 필요합니다.[44] - ^ 고정 비율 TSC는 다음 두 단계로 도입되었습니다.
- Constant TSC
- 프로세서 코어가 딥 슬립(C2 이상) 모드에 있지 않고 CPU 코어 간에 동기화되지 않는 한 TSC가 고정 속도로 실행됩니다.Intel Prescott, Yonah and Bonnell에서 소개되었습니다.또한 모든 Transmeta 및 VIA 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]
).
- ^
RDTSC
다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0
.
인텔 펜티엄과 AMD K5에서,RDTSC
Virtual-8086 모드에서는 실행할 수 없습니다.[48]이후 프로세서는 이 제한을 없앴습니다. - ^
RDPMC
다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.PCE=1
. - ^ 그
RDPMC
Nano 이전의 VIA 프로세서에는 지침이 없습니다. - ^ 지원되는 조건 코드는
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): "덜하거나 같지 않음", "더 크다" - ^ 64비트 모드에서는,
CMOVcc
32비트 피연산자 크기의 경우 조건이 거짓일지라도 대상 레지스터의 상위 32비트를 지웁니다.
위해서CMOVcc
메모리 소스 피연산자를 사용하면 CPU는 이동 조건이 충족되지 않더라도 항상 메모리에서 피연산자를 읽어와 메모리 예외 및 캐시 라인 채우기를 유발할 수 있습니다.(Intel APX 확장은 EVEX로 인코딩된 버전을 정의합니다.CMOVcc
조건이 false일 경우 메모리 예외를 억제합니다.) - ^ Pentium Pro에 추가된 다른 명령어와 달리 long NOP에는 CPUID 기능 비트가 없습니다.
- ^
0F 1F /0
Long-NOP는 펜티엄 프로에 도입되었지만 2006년까지 문서화되지 않았습니다.[50]전체 작전 코드 범위는NOP
펜티엄 프로에서.단, 인텔은 다음을 제외하고는 이러한 옵코드가 그대로 유지된다는 것을 보장하지 않습니다.NOP
미래의 프로세서에서, 그리고 적어도 일부 프로세서에서 이러한 옵코드 중 일부를 다른 명령어에 할당했습니다.[51] - ^ 2002년부터 AMD x86-64용으로 문서화되었습니다.[52]
- ^ opcode는 펜티엄 이후부터 유효하지 않은 opcode로 공식적으로 예약되었지만, nemonic만 할당되었습니다.
UD2
펜티엄 프로 이후로.[53] - ^ a b GNU Binutils는 다음을 사용합니다.
UD2A
그리고.UD2B
버전 2.7 이후의 및 opcode에 대한 니모닉스.[54]
둘 다 아니다.UD2A
도 아니다UD2B
원래는 모든 주장을 폈습니다.UD2B
나중에 Binutils 버전 2.30에서 ModR/M 바이트를 허용하도록 수정되었습니다.[55] - ^ a b UD0/1/2 opcode -, 및 -는 80186 이후의 모든 x86 프로세서(NEC V-Series 프로세서 제외)에서 #UD 예외를 발생시키지만 P5급 프로세서까지 이 목적으로 명시적으로 예약되지 않았습니다.
- ^ opcode는 펜티엄 이후부터 유효하지 않은 opcode로 공식적으로 예약되었지만, 그것은 단지 니모닉만 할당되었습니다.
UD1
훨씬 나중에 – AMD APM이 상장을 시작했습니다.UD1
Rev 3.17 이후의 Opcode Map에서,[57] 인텔 SDM은 Rev 061 이후부터 그것을 목록화하기 시작했습니다.[58] - ^ a b 및 opcode 모두에서, opcode가 ModR/M 바이트를 수용하는지 여부에 따라 상이한 x86 구현이 상이한 것으로 알려져 있습니다.[59]
- ^ opcode의 경우,
OIO
니모닉은 사이릭스에 의해 도입된 반면,[60]UD0
menmonic은 (논쟁없이) AMD와 인텔에 의해 동시에 도입되었습니다.UD1
에 대한 니모닉.[57][58] 나중에 인텔(AMD는 아님) 문서는 설명을 수정했습니다.UD0
ModR/M 바이트를 추가하고 두 개의 인수를 수행합니다.[61] - ^ K6에서.
SYSCALL
/SYSRET
지침은 이전 모델 6이 아닌 모델 7(250nm "Little Foot") 이상에서 사용할 수 있었습니다.[63] - ^
SYSCALL
그리고.SYSRET
x86-64의 필수 구성 요소가 되었습니다. 그 결과 AMD, Intel, VIA 및 Zhaoxin의 모든 x86-64 프로세서에서 64비트 모드로 명령어를 사용할 수 있게 되었습니다.
64비트 모드 이외에서는 AMD 프로세서에서만 명령을 사용할 수 있습니다. - ^ 의 정확한 의미론은
SYSRET
AMD 프로세서와 Intel 프로세서 간에 약간의 차이가 있습니다. 정규식이 아닌 반환 주소로 인해 AMD CPU에서는 #GP 예외가 Ring 3에서 발생하지만 Intel CPU에서는 Ring 0에서 발생합니다.이로 인해 보안 문제가 발생하는 것으로 알려져 있습니다.[64] - ^ a b 를 위해
SYSRET
그리고.SYSEXIT
x86-64에 의거한 명령어들은 다음을 추가할 필요가 있습니다.REX.W
64비트 사용자 모드 코드로 돌아가는 변형의 접두사.
이 지침의 암호화는 다음과 같습니다.REX.W
접두사는 32비트 사용자 모드 코드로 되돌리는 데 사용됩니다.(16비트 사용자 모드 코드로 되돌리는 데는 이 두 가지 지침을 모두 사용할 수 없습니다.) - ^ a b c 그
SYSRET
,SYSENTER
그리고.SYSEXIT
Real 모드에서는 명령을 사용할 수 없습니다. (SYSENTER
는 가상 8086 모드에서 사용할 수 있습니다.) - ^ 그
CPUID
지원을 나타내는 플래그SYSENTER
/SYSEXIT
프로세서가 공식적으로 이러한 지침을 지원하지 않음에도 불구하고 Pentium Pro에 설정되어 있습니다.[65]
타사 테스트 결과, 펜티엄 프로에는 opcode가 있지만 버그가 너무 심하여 사용할 수 없음을 알 수 있습니다.[66] - ^ AMD CPU의 경우
SYSENTER
그리고.SYSEXIT
x86-64 long mode(#UD)에서는 지침을 사용할 수 없습니다. - ^ Transmeta CPU의 경우
SYSENTER
그리고.SYSEXIT
지침은 Transmeta Code Morphing 소프트웨어 버전 4.2 이상에서만 사용할 수 있습니다.[68] - ^ 느헤미아에 대하여,
SYSENTER
그리고.SYSEXIT
는 8단계 이상에서만 사용할 수 있습니다.[69]
명령어 집합 확장으로 추가됨
x86-64에 추가됨
이러한 명령어는 64비트 모드에서만 인코딩할 수 있습니다.이들은 네 그룹으로 나뉩니다.
- 기존의 opcode를 다른 용도로 재사용하는 오리지널 명령어 (
MOVSXD
교체하기ARPL
) - 새로운 opcode가 포함된 원본 지침(
SWAPGS
) - 64비트 주소 크기로 확장된 기존 명령어(
JRCXZ
) - 64비트 피연산자 크기로 확장된 기존 명령어(remaining 명령어)
64비트 피연산자 크기의 대부분의 명령어는 이것을 인코딩합니다.REX.W
접두사; 가 없는 경우REX.W
prefix, 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 교환 |
- ^ 메모리가 작동합니다.
CMPXCHG16B
정렬된 16바이트여야 합니다. - ^ 그
CMPXCHG16B
초기 인텔/AMD x86-64 프로세서 중 일부에서는 명령이 없었습니다.인텔 프로세서에서는 제온 노코나(Xeon Nocona) 스텝 D에서 명령어가 누락되었지만 [70]스텝 E에서 추가되었습니다.[71]AMD K8 계열 프로세서에서는 DDR2 지원이 도입됨과 동시에 F 단계에서 추가되었습니다.[72]
이런 이유로,CMPXCHG16B
는 나머지 x86-64와는 별개로 자체 CPUID 플래그를 가지고 있습니다. - ^ 암호화
MOVSXD
렉스 없이W 접두사는 허용되지만 사용하지[73] 않습니다. 이러한 인코딩은 16/32비트와 동일하게 동작합니다.MOV
(8B /r
).
비트 조작 확장자
비트 조작 지침.BMI1 및 BMI2에 의해 정의된 모든 VEX 인코딩 명령의 경우, 피연산자 크기는 VEX에 의해 제어되는 32비트 또는 64비트일 수 있습니다.W bit – 16비트 버전으로 제공되는 지침은 없습니다.
비트 조작 확장 | 설명 기억법 | 옵코드 | 지침설명 | 추가됨 |
---|---|---|---|---|
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 | |||
| 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 | ||
| 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 , 에 규정된 시프트량rb 32비트 피연산자 크기의 경우 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 | 플래그를 업데이트하지 않고 왼쪽으로 이동합니다. |
- ^ AMD CPU에서 "ABM" 확장은 두 가지를 모두 제공합니다.
POPCNT
그리고.LZCNT
. 그러나 Intel CPU의 경우 "ABM"에 대한 CPUID 비트는 다음의 존재를 나타내도록 문서화되어 있을 뿐입니다.LZCNT
"LZCNT"로 나열되는 반면,POPCNT
는 자체 CPUID 기능 비트를 가지고 있습니다.
그러나 "ABM"/"LZCNT" 확장을 구현하는 알려진 모든 프로세서는 또한POPCNT
그리고 POPCNT의 CPUID 피쳐 비트를 설정하므로 구분은 이론적으로만 가능합니다.
(그 반대는 사실이 아닙니다. 를 지원하는 프로세서가 있습니다.POPCNT
Intel Nehalem 및 VIA Nano 3000과 같은 ABM은 아닙니다.) - ^ 그
LZCNT
명령은 다음과 같이 실행됩니다.BSR
LZCNT 또는 ABM 확장을 지원하지 않는 시스템의 경우.BSR
소스 피연산자에서 가장 높은 설정 비트의 인덱스를 계산하여 다음과 다른 결과를 생성합니다.LZCNT
대부분의 입력 값에 적용됩니다. - ^ 그
TZCNT
명령은 다음과 같이 실행됩니다.BSF
BMI1 확장을 지원하지 않는 시스템에서.BSF
다음과 같은 결과를 가져옵니다.TZCNT
0을 제외한 모든 입력 피연산자 값 - 에 대해TZCNT
입력 피연산자 크기를 반환하지만BSF
는 정의되지 않은 동작을 생성합니다(대부분의 최신 CPU에서 대상을 수정하지 않은 상태로 유지). - ^ 위해서
BEXTR
, 시작 위치와 길이는 마스킹되지 않으며 0 ~ 255의 값을 취할 수 있습니다.선택한 비트가 끝을 넘어 확장되는 경우r/m
인수(일반적인 32/64비트 피연산자 크기)를 사용하면 초과 비트가 0으로 읽힙니다. - ^ 젠 3 이전의 AMD 프로세서에서는
PEXT
그리고.PDEP
명령어는 상당히 느리고[74] 마이크로코딩된 구현(마스크 인수에서 설정된 비트 수에 따라 약 18 ~ 300 사이클)을 사용하기 때문에 데이터에 의존하는 타이밍을 나타냅니다.따라서 이러한 프로세서에서 다른 명령어 시퀀스를 사용하는 것이 더 빠른 경우가 많습니다.[75][76]
Intel TSX 추가
TSX 부분 집합 | 설명 | 옵코드 | 묘사 | 추가됨 |
---|---|---|---|---|
| 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로 설정합니다. | ||
| XACQUIRE | F2 | 하드웨어 잠금 해제의 시작을 나타내는 명령 접두사, 메모리 원자 명령에만 사용(다른 명령의 경우,F2 prefix는 다른 의미를 가질 수 있습니다.이러한 지침과 함께 사용하면 메모리 원자 작동 대신 트랜잭션을 시작할 수 있습니다. | 해스웰 (단종 – HLE를 지원하는 마지막 프로세서는 Coffee Lake와 Cascade Lake) |
XRELEASE | F3 | 하드웨어 잠금 해제의 종료를 나타내는 명령 접두사, 메모리 원자/저장 명령에만 사용(다른 명령의 경우에는F3 prefix는 다른 의미를 가질 수 있습니다.하드웨어 잠금 해제 중에 이러한 지침과 함께 사용하면 저장/원자를 수행하는 대신 관련 트랜잭션을 종료합니다. | ||
| XSUSLDTRK | F2 0F 01 E8 | 추적 로드 주소 일시 중지 | 사파이어 래피즈 |
XRESLDTRK | F2 0F 01 E9 | 로드 주소 추적 재개 |
Intel CET 추가
Intel CET(Control-Flow Enforcement Technology)는 반환 지향 프로그래밍(CET_SS)과 간접 분기 추적(CET_IBT)과 같은 보안 공격으로부터 보호하는 데 도움이 되는 두 가지 기능을 추가했습니다.
CET 부분 집합 | 설명 | 옵코드 | 묘사 | 울리다 | 추가됨 |
---|---|---|---|---|---|
| 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 | 섀도 스택 사용 중 플래그 지우기 | |||
| ENDBR32 | F3 0F 1E FB | 32비트 모드에서[b] 간접 분기 종료 | 3 | 타이거 레이크 |
ENDBR64 | F3 0F 1E FA | 64비트 모드에서[b] 간접 분기 종료 | |||
NOTRACK | 3E [c] | 간접과 함께 사용되는 접두사CALL /JMP near 명령(opcodes 및 )을 사용하여 분기 대상이 시작할 필요가 없음을 나타내는ENDBR32/64 설명.NO_TRACK_EN 플래그가 설정된 경우에만 프리픽스가 지정됩니다. |
- ^ a b 그
RDSSPD
그리고.RDSSPQ
명령어는 그림자 스택이 비활성화되거나 CET가 지원되지 않는 프로세서에서 NOP로 작동합니다. - ^ a b
ENDBR32
그리고.ENDBR64
CET를 지원하지 않는 프로세서에서 NOP 역할 수행_IBT 또는 IBT가 비활성화된 경우. - ^ 이 접두사는 DS: 세그먼트 재정의 접두사와 동일한 인코딩을 갖습니다. 2022년 4월 현재 인텔 문서에는 이 접두사가 노트랙 접두사로 사용될 때 이전 세그먼트 재정의 기능을 유지하는지 여부를 명시하지 않은 것으로 보이며, 이 접두사에 대한 공식적인 기억법도 제공하지 않습니다.[77][78] (GNU binutils는 "nottrack"을 사용합니다.)[79]
다른 공급업체 간 확장 기능 추가
명령어 집합 확장 | 설명 기억법 | 옵코드 | 지침설명 | 울리다 | 추가됨 |
---|---|---|---|---|---|
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] | |||
| 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] | |||
| CLFLUSH m8 | NP 0F AE /7 | 하나의 캐시 라인을 메모리에 플러시합니다. 여러 개의 캐시 계층 레벨 및/또는 각각 고유한 캐시를 가진 여러 개의 프로세서를 가진 시스템에서는 라인이 모두 플러시됩니다. | 3 | (SSE2), 지오데 LX |
| 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 전원 관리에 일반적으로 사용됩니다. | |||
| GETSEC | NP 0F 37 | SMX 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[s] | 0 | 콘로/메롬, 우다오커우,[90] 트레몽 |
| 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 | 0F 01 F9 | 타임 스탬프 카운터와 프로세서 코어 ID를 읽습니다.[v] TSC 값은 EDX에 배치됩니다.EAX와 ECX의 핵심 ID.[w] | 보통 3개[x] | K8,[y] 네할렘, 실버몬트, 나노 |
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 | ||||
| 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 mem XSAVEOPT64 mem | NP 0F AE /6 NP REX.W 0F AE /6 | EDX에서 지정한 상태 구성 요소 저장:EAX를 메모리에 연결합니다. 형들과는 다르게 XSAVE 설명,XSAVEOPT CPU가 가장 최근 대응하는 이후로 변경되지 않았다고 판단할 수 있을 때 프로세서 상태 항목을 메모리에 쓰는 것을 자제할 수 있습니다.XRSTOR . | 3 | 샌디브릿지, 스팀롤러, 퓨마, 골드몬트, 장장 |
| 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 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 reg,m128 | 66 0F 38 82 /r | m128의[aa] 레지스터 및 디스크립터의 무효화 유형에 따라 TLB 및 페이징 구조 캐시의 항목을 무효화합니다.디스크립터에는 메모리 주소와 PCID가 포함되어 있습니다.[ab] AMD에서 명령이 직렬화되고 있지만 Intel CPU는 그렇지 않습니다. | 0 | 해스웰, 장장, 3번 선, 그레이스몬트 | |
| PREFETCHW m8 | 0F 0D /1 | 쓸 캐시 라인을 미리 페치합니다.[b] | 3 | K6-2, (세더밀),[ad] 실버몬트, 브로드웰, 장장 |
PREFETCH m8 [ae] | 0F 0D /0 | 캐시 라인을 미리 페치합니다.[b] | |||
| 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 다른 플래그는 변경되지 않은 채로 운반 입력 및 출력 역할을 합니다. | |||
| CLAC | NP 0F 01 CA | 분명한EFLAGS.AC . | 0 | 브로드웰, 골드몬트, 젠1, 루자쭈이[af] |
STAC | NP 0F 01 CB | 세트EFLAGS.AC . | |||
| CLFLUSHOPT m8 | NFx 66 0F AE /7 | 캐시 라인을 플러시합니다. 오래된 것과 다른 점 CLFLUSH 메모리 저장소 및 기타 캐시 라인 플러시와 관련하여 보다 완화된 주문 규칙을 가지고 있어 성능을 향상시킬 수 있습니다. | 3 | 스카이레이크, 골드몬트, 젠1 |
| XSAVEC mem XSAVEC64 mem | NP 0F C7 /4 NP REX.W 0F C7 /4 | EDX에서 지정한 프로세서 확장 상태 구성 요소 저장:EAX를 압축을 사용하여 메모리에 연결합니다. | 3 | 스카이레이크, 골드몬트, 젠1 |
| 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 m8 | 0F 0D /2 | T1 로컬리티 힌트(L2 캐시로 가져오기, L1 캐시는 제외)와 쓰기 의도 힌트로 데이터를 미리 페치합니다.[b] | 3 | 나이트 랜딩, 용펑 |
| RDPKRU | NP 0F 01 EE | 사용자 페이지 키 등록기를 EAX로 읽습니다. | 3 | 스카이레이크-X, 혜성 호수, 그레이스몬트, 3번 선, 루자쭈이[af] |
WRPKRU | NP 0F 01 EF | EAX의 데이터를 User Page Key Register에 기록하고 Memory Fence를 수행합니다. | |||
| CLWB m8 | NFx 66 0F AE /6 | 캐시 라인을 무효화하지 않고 캐시 라인 하나를 메모리에 다시 씁니다. | 3 | 스카이레이크-X, 젠2, 타이거 레이크, 트레몽 |
| RDPID r32 | F3 0F C7 /7 | 프로세서 코어 ID를 레지스터로 읽습니다.[v] | 3[ag] | 골드몬트 플러스, 젠2, 얼음 호수, 루자쭈이[af] |
| WBNOINVD | F3 0F 09 | 모든 더러운 캐시 라인을 무효화하지 않고 메모리에 다시 씁니다.[ah]명령을 직렬화하고 있습니다. | 0 | 젠2, 아이스레이크-SP |
- ^ a b c Athlon XP 이전의 AMD Athlon 프로세서는 전체 SSE를 지원하지 않았지만, "MMX Extensions"의 일부로 SSE의 비 SIMD 명령을 도입했습니다.[80]전체 SSE가 없는 이러한 확장 기능은 Geode GX2 이상의 Geode 프로세서에도 있습니다.
- ^ a b c d e f g 모두
PREFETCH*
명령어는 프로그램 의미론이 아닌 성능에만 영향을 미치는 힌트 명령어입니다.잘못된 주소(예: 매핑되지 않은 페이지의 주소 또는 정규식이 아닌 주소)를 제공하면 명령이 생성된 예외 없이 NOP 역할을 수행하게 됩니다. - ^ a b c 를 위해
SFENCE
,LFENCE
그리고.MFENCE
명령어, ModR/M 바이트의 하위 3비트는 무시되며, 0.7 범위의 x 값은 유효한 명령어가 됩니다. - ^ 그
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
또는 직렬화 명령어를 사용할 수도 있습니다. - ^ 그
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] - ^ 그
MFENCE
명령어는 모든 메모리 로드, 저장 및 캐시라인 플러시를 보장합니다.MFENCE
명령어는 모든 메모리 로드, 저장 및 캐시라인 플러시 후에 전세계적으로 관찰 가능합니다.MFENCE
.
인텔 CPU의 경우,MFENCE
는 dispatch-serializing이 아니므로 성능 카운터 및 x2apic MSR과 같은 비메모리 리소스에 대한 액세스 시 순서 지정을 강제하는 데 사용할 수 없습니다.MFENCE
에 관해서는 여전히 명령이 내려져 있습니다.LFENCE
, 만약 디스패치 시리얼라이제이션과 함께 메모리 장벽이 필요하다면, 그것은 발행함으로써 얻어질 수 있습니다.MFENCE
뒤를 이어LFENCE
.[44]
AMD CPU의 경우,MFENCE
연재 중입니다. - ^ 의 작동.
PAUSE
64비트 모드에서의 명령은 다음과 같습니다.NOP
, 의 존재에 영향을 받지 않는REX.R
접두사를 붙입니다둘 다 아니다.NOP
도 아니다PAUSE
다른 비트의 영향을 받습니다.REX
접두사를 붙입니다opcode의 몇 가지 예90
64비트 모드의 다양한 접두사는 다음과 같습니다.90
가NOP
41 90
가XCHG R8D,EAX
4E 90
가NOP
49 90
가XCHG R8,RAX
F3 90
가PAUSE
F3 41 90
가PAUSE
F3 4F 90
가PAUSE
- ^ 에 의해 수행된 일시 중지의 실제 길이
PAUSE
명령은 구현에 의존적입니다.
SSE2가 없는 시스템에서는PAUSE
NOP로 실행됩니다. - ^ VT-x 또는 AMD-V 가상화 하에서 실행
PAUSE
짧은 시간 간격으로 여러 번 #VMEXIT가 발생할 수 있습니다.개수PAUSE
#VMEXIT를 트리거할 수 있는 실행 및 간격 길이는 플랫폼별로 다릅니다. - ^ 그 동안에
CLFLUSH
명령어는 SSE2와 함께 도입되었으며 자체 CPUID 플래그가 있으며 SSE2를 구현하지 않는 프로세서에 존재하거나 SSE2를 구현하지 않는 프로세서에 존재할 수 있습니다(예: AMD Geode LX 지원).CLFLUSH
SSE2는 아닙니다.) - ^ 그 동안에
MONITOR
그리고.MWAIT
SSE3와 동시에 도입된 지침으로 SSE3 CPUID 플래그와 별도로 확인해야 하는 자체 CPUID 플래그가 있습니다(예: Athlon64 X2 및 VIA C7은 SSE3를 지원하지만 MONITOR는 지원하지 않음). - ^ a b 를 위해
MONITOR
그리고.MWAIT
명령어, 구 인텔 문서[85] 목록 명시적 피연산자가 있는 명령어 니모닉(MONITOR EAX,ECX,EDX
그리고.MWAIT EAX,ECX
), 최신 문서에서는 이러한 피연산자를 생략합니다.조립자/분해자는 이 두 가지 변형을 모두 지원할 수 있습니다.[86] - ^ 위해서
MONITOR
, DS: 세그먼트는 세그먼트 접두사로 재정의할 수 있습니다.
모니터링할 메모리 영역은 DS:rAX에서 지정한 단일 바이트뿐만 아니라 바이트를 포함하는 선형 메모리 영역이 됩니다. 이 메모리 영역의 크기와 정렬은 구현에 따라 다르며 CPUID를 통해 쿼리할 수 있습니다.
모니터링할 메모리 위치에 메모리 유형 WB(write-back cacheable)가 있어야 합니다. 그렇지 않으면 모니터링이 실패할 수 있습니다. - ^ 2023년 3월 현재, 확장이나 힌트는 정의되지 않았습니다.
MONITOR
설명.따라서 명령어는 ECX=0을 필요로 하며 EDX를 무시합니다. - ^ Intel Xeon Phix200[87] 및 AMD K10[88] 이상과 같은 일부 프로세서에는 다음을 지원하는 데 사용할 수 있는 문서화된 MSR이 있습니다.
MONITOR
그리고.MWAIT
3번 링에서 뛰게 될 겁니다 - ^ 수행된 대기 시간
MWAIT
메모리 쓰기 이외의 시스템 이벤트(예: 캐시라인 퇴거, 인터럽트)에 의해 종료될 수 있습니다. 종료 대기를 유발할 수 있는 정확한 이벤트 집합은 구현에 따라 다릅니다.
메모리 쓰기 또는 다른 이벤트로 인해 대기가 종료되었는지 여부에 관계없이 모니터링이 종료되고 다음을 사용하여 다시 모니터링을 설정해야 합니다.MONITOR
더 이상 공연하기 전에MWAIT
s. - ^ 에 사용 가능한 확장 플래그
MWAIT
ECX 레지스터에는 다음이 있습니다.비트 MWAIT 확장자 0 EFLAGS(EFLAGS)를 마스킹한 경우에도 인터럽트를 중단 이벤트로 처리합니다.IF=0). (NetBurst가 아닌 모든 구현에서 사용 가능) MWAIT
.)1 Timed MWAIT: TSC가 EDX의 값에 도달하거나 초과하면 대기를 종료합니다.EBX. (Intel Skylake 이후의 Intel 프로세서에 문서화되지 않은 것으로 알려짐)[89] 31:2 사용하지 않습니다. 0으로 설정해야 합니다. - ^ 에 사용할 수 있는 힌트 플래그
MWAIT
EAX 레지스터에는 다음이 있습니다.비트 MWAIT 힌트 3:0 C 상태 내의 하위 상태(비트 7:4 참조)(Intel 프로세서만 해당) 7:4 대기 중 대상 CPU 전원 C-상태 - 1(예: C1,0001b의 경우 C2, 1111b의 경우 C0) 31:8 사용하지 않음. C-상태는 프로세서 고유의 전력 상태이며, ACPI C-상태와 반드시 1:1로 일치하지는 않습니다.
- ^ 다음에 대해 정의된 리프 함수
GETSEC
(EAX에 의해 선택됨)은 다음과 같습니다.EAX 기능. 0(기능) SMX 기능 보고 2 (ENTERACCES) 인증코드모듈실행입력 3(EXITAC) 인증된 코드 모듈 실행 종료 4(SENTER) 측정환경입력 5(섹트) 측정환경종료 6(파라미터) SMX 매개변수 보고 7(SMTRL) SMX 모드 제어 8(웨이크업) 측정된 환경에서 취침 프로세서 깨우기 EAX에서 지원되지 않는 값은 #UD 예외를 발생시킵니다.
- ^ XSAVE는 Penryn의 스텝 E0/R0에 추가되었으며 이전 스텝에서는 사용할 수 없습니다.
- ^ 일부 프로세서(Skylake, Goldmont 및 Zen 1부터 시작)에서 실행
XGETBV
ECX=1 사용이 허용됩니다. 이 경우에는 반환되지 않습니다.XCR1
(해당 레지스터가 없습니다) 대신 반환XCR0
"XINUSE" 상태 구성 요소 비트맵(초기 상태가 아닌 XSAVE 상태 구성 요소의 비트맵)의 현재 값으로 bitwise-ANDED.
이러한 기능의 존재는XGETBV
는 CPUID로 표시됩니다. (EAX=0Dh,ECX=1):EAX[비트 2]. - ^ a b 에서 읽은 "core ID" 값
RDTSCP
그리고.RDPID
사실은.TSC_AUX
MSR (MSR)C000_0103h
). 이 값이 실제로 프로세서 ID에 해당하는지 여부는 운영체제 관례의 문제입니다. - ^ 형들과는 다르게
RDTSC
설명,RDTSCP
는 이전의 모든 명령이 폐기될 때까지 TSC 읽기를 지연시켜 이전의 메모리 로드(저장은 제외)에 대한 순서를 보장합니다.RDTSCP
그러나 후속 지침과 관련하여 명령되지 않습니다. - ^
RDTSCP
다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0
. - ^ 지원.
RDTSCP
AMD K8의 스텝 F에서 추가되었으며 이전 스텝에서는 사용할 수 없습니다. - ^ 그 동안에
POPCNT
SSE 4.2와 동시에 도입된 명령어는 SSE 4.2의 일부가 아니라 자체 CPUID 플래그가 있는 별도의 확장으로 간주됩니다.
AMD 프로세서에서는 ABM 확장의 일부로 간주되지만 자체 CPUID 플래그가 있습니다. - ^ 다음에 대해 정의된 무효화 유형
INVPCID
(register 인수에 의해 선택됨)은 다음과 같습니다.가치 기능. 0 설명자의 PCID 및 가상 메모리 주소와 일치하는 TLB 항목을 무효화(글로벌 항목 제외) 1 전역 항목을 제외하고 디스크립터의 PCID와 일치하는 TLB 항목을 무효화합니다. 2 전역 항목을 포함한 모든 TLB 항목을 무효화합니다. 3 글로벌 항목을 제외한 모든 TLB 항목을 무효화합니다. register 인수에서 지원되지 않는 값은 #GP 예외를 발생시킵니다.
- ^ 형들과는 다르게
INVLPG
설명,INVPCID
제공된 메모리 주소가 정규식이 아닌 경우에는 #GP 예외가 발생합니다.이러한 불일치로 인해 보안 문제가 발생하는 것으로 알려져 있습니다.[91] - ^ 그
PREFETCH
그리고.PREFETCHW
명령은 3DNow! 명령 집합 확장의 필수 부분이지만 3DNow를 지원하지 않는 시스템에서는 독립 실행형 확장으로도 사용할 수 있습니다. - ^ 에 대한 opcode.
PREFETCH
그리고.PREFETCHW
(0F 0D /r
Cedar Mill(65nm Pentium 4) 이후부터 Intel CPU에서 NOP로 실행됩니다.PREFETCHW
Broadwell 이후부터 프리페치 기능을 이용할 수 있습니다. - ^ 그
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에서 프리페치를 수행하는 것으로 나타났습니다. - ^ a b c SMAP, PKU 및 RDPID 명령어 세트 확장은 Zhaoxin LuJiaZui의 2단계[94] 이상에서는 지원되지만 이전 단계에서는 지원되지 않습니다.
- ^ 형들과는 다르게
RDTSCP
프로세서 ID, 사용자 모드를 읽기 위해 사용할 수도 있는 명령어RDPID
다음에 의해 비활성화되지 않습니다.CR4.TSD=1
. - ^ 그
WBNOINVD
명령은 다음과 같이 실행됩니다.WBINVD
WBNOINVD 확장을 지원하지 않는 시스템에서 실행되는 경우.WBINVD
다르다WBNOINVD
그 점에서WBINVD
쓰기백 후 모든 캐시 라인이 무효화됩니다.
기타 Intel 특정 확장 기능 추가
명령어 집합 확장 | 설명 기억법 | 옵코드 | 지침설명 | 울리다 | 추가됨 |
---|---|---|---|---|---|
| ENCLS | NP 0F 01 CF | SGX Supervisor 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[a] | 0 | |
ENCLU | NP 0F 01 D7 | SGX User 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[c] | 3[d] | ||
ENCLV | NP 0F 01 C0 | SGX 가상화 기능을 수행합니다.수행할 기능은 EAX에 있습니다.[e] | 0[f] | ||
| PTWRITE r/m32 PTWRITE r/m64 | F3 0F AE /4 F3 REX.W 0F AE /4 | 레지스터 또는 메모리에서 데이터를 읽어 PTW 패킷으로 인코딩합니다.[g] | 3 | 케이비 레이크, 골드몬트 플러스 |
| MOVDIRI m32,r32 MOVDIRI m64,r64 | NP 0F 38 F9 /r NP REX.W 0F 38 F9 /r | Direct Store(캐시되지 않거나 다른 스토어와 쓰기 결합되지 않은 메모리 스토어)를 사용하여 메모리에 저장합니다. | 3 | 타이거 레이크, 트레몽 |
| MOVDIR64B reg,m512 | 66 0F 38 F8 /r | 64바이트의 데이터를 m512에서 ES:reg에서 지정한 주소로 이동합니다.64바이트 쓰기는 Direct Store를 통해 원자적으로 수행됩니다.[h] | 3 | 타이거 레이크, 트레몽 |
| PCONFIG | NP 0F 01 C5 | 플랫폼 피쳐 구성 기능을 수행합니다.수행할[i] 기능은 EAX에 명시되어 있습니다 - 기능에 따라 RBX, RCX 및 RDX는 추가 입력 정보를 제공할 수 있습니다. 명령어가 실패하면 EFLAGS를 설정합니다.ZF=1이며 EAX의 오류 코드를 반환합니다.성공하면 EFLAGS를 설정합니다.ZF=0 및 EAX=0. | 0 | 아이스레이크-SP |
| CLDEMOTE m8 | NP 0F 1C /0 | m8이 포함된 캐시 라인을 CPU L1 캐시에서 캐시 계층의 더 먼 수준으로 이동합니다.[j] | 3 | (트레몽), (올더 호수), 사파이어 래피즈[k] |
| 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 | NP 0F 01 E8 | 명령어 가져오기 및 실행을 직렬화합니다.[o] | 3 | 올더 호 |
| HRESET imm8 | F3 0F 3A F0 C0 ib | 프로세서가 하드웨어 유지 관리 예측 기록의 선택된 구성 요소를 재설정하도록 요청합니다.CPU 예측 이력의 구성 요소를 리셋할 비트맵이 EAX에 지정됩니다(imm8 인수는 무시됨).[p] | 0 | 올더 호 |
| 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 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 |
- ^ 다음에 대해 정의된 리프 함수
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 예외를 발생시킵니다.
- ^ SGX는 11세대(Rocket Lake, Tiger Lake) 이후부터는 데스크톱/노트북 프로세서에서 더 이상 사용되지 않지만 Xeon 브랜드 서버 부품에서는 계속 사용할 수 있습니다.[97]
- ^ 다음에 대해 정의된 리프 함수
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 엔클레이브 내에서 실행할 수 없으며, 다른 기능은 엔클레이브 내에서만 실행할 수 있습니다. - ^
ENCLU
링 0/1/2이 아닌 링 3에서만 실행할 수 있습니다. - ^ 다음에 대해 정의된 리프 함수
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")를 지원하는 시스템에서만 제공됩니다. - ^
ENCLV
Intel VMX 작업을 사용하도록 설정한 경우에만 사용할 수 있습니다.VMXON
, 그렇지 않으면 #UD를 생성할 것입니다. - ^ 위해서
PTWRITE
, 프로세서 트레이스 패킷에 대한 쓰기는 활성화 비트 집합("TriggerEn", "ContextEn", "FilterEn" 비트)의 경우에만 수행됩니다.RTIT_STATUS
MSR 및 "PTWEn" 비트RTIT_CTL
MSR)은 모두 1로 설정됩니다.
그PTWRITE
66h 명령 접두사를 사용하는 경우, 다른 접두사에 관계없이 #UD 예외를 발생시키도록 SDM에 명령이 표시됩니다. - ^ 위해서
MOVDIR64
, ES:reg에서 지정한 대상 주소는 64바이트 정렬되어야 합니다.
register 인수의 피연산자 크기는 주소 크기에 의해 지정되며, 이는 에 의해 재정의될 수 있습니다.67h
접두사를 붙입니다
64바이트 메모리 소스 인수는 64바이트를 정렬할 필요가 없으며, 원자적으로 읽을 수 있는 것도 보장되지 않습니다. - ^ 다음에 대해 정의된 리프 함수
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) 예외를 발생시킵니다.
- ^ 위해서
CLDEMOTE
, 캐시 라인을 강등할 캐시 레벨은 구현에 따라 달라집니다.
명령어는 힌트로 간주되기 때문에 제공된 메모리 주소가 올바르지 않거나 L1 캐시에 없는 경우에는 예외 없이 NOP로 실행됩니다.또한 구현에 의존하는 다른 상황에서도 NOP로 실행될 수 있습니다.
CLDMOTE 확장을 지원하지 않는 시스템에서는 NOP로 실행됩니다. - ^ 인텔 문서에는 CLDMOTE가 도입된 프로세서로 트레몬트(Tremont)와 올더(Alder) 호수(Lake)가 나와 있습니다.그러나 2022년 5월 현재 CLDMOTE에 대한 CPUID 피쳐 비트가 설정된 트레몬트 또는 앨더 레이크 모델은 관찰되지 않았으며, 그 중 일부 모델은 CPUID 비트가 삭제되었습니다.[100]
2023년 4월 현재 CLDMOTE의 CPUID 피쳐 비트는 사파이어 래피드에 설정된 것으로 확인되었습니다.[101] - ^ 위해서
UMONITOR
, 주소 인수의 피연산자 크기는 주소 크기에 의해 주어지는데, 이것은 에 의해 무시될 수 있습니다.67h
접두사를 붙입니다사용되는 기본 세그먼트는 DS:이며, 세그먼트 접두사로 재정의할 수 있습니다. - ^ 위해서
UMWAIT
, 운영 체제는 사용할 수 있습니다.IA32_UMWAIT_CONTROL
MSR을 사용하여 단일 시스템의 최대 시간을 제한합니다.UMWAIT
호출은 기다리는 것이 허용됩니다.UMWAIT
명령어가 설정됩니다.RFLAGS.CF
그것이 1에 도달합니다.IA32_UMWAIT_CONTROL
- 시간 제한을 정의하고 그렇지 않으면 0으로 설정합니다. - ^
TPAUSE
그리고.UMWAIT
다음과 같은 경우에만 Ring 0 밖에서 실행할 수 있습니다.CR4.TSD=0
. - ^ 시리얼라이제이션은 예를 들어 이전의 명령으로 수행할 수 있습니다.
CPUID
그리고.IRET
, 이러한 명령어는 추가적인 기능을 수행하여 독립 실행형 명령어 직렬화가 필요한 경우 측면의 effects 및 성능 저하를 초래합니다. (CPUID
또한 가상화 환경에서 실행할 때 필수 #VMEXIT(VMEXIT)가 발생하여 오버헤드가 매우 크다는 문제점이 있습니다.SERIALIZE
명령어는 직렬화만 수행하므로 추가 비용을 피할 수 있습니다. - ^ 를 통해 재설정할 수 있는 CPU 기록 구성 요소 비트맵
HRESET
CPUID에서 제공합니다. (EAX=20h,ECX=0):EBX.
2023년 7월 기준으로 정의된 비트는 다음과 같습니다.조금 사용. 0 인텔 스레드 디렉터 히스토리 31:1 (예약) - ^ register 인수 대상
SENDUIPI
는 UITT(User-Interrupt Target Table)에서 항목을 선택하기 위한 인덱스로, 새 테이블에 의해 지정됩니다.UINTR_TT
그리고.UINT_MISC
MSRs.)
다른 AMD별 확장 기능 추가
명령어 집합 확장 | 설명 기억법 | 옵코드 | 지침설명 | 울리다 | 추가됨 |
---|---|---|---|---|---|
MOV reg,CR8 | F0 0F 20 /0 [b] | CR8 레지스터를 읽습니다. | 0 | K8[c] | |
MOV CR8,reg | F0 0F 22 /0 [b] | CR8 레지스터에 기록합니다. | |||
| MONITORX | NP 0F 01 FA | 메모리 쓰기를 위해 메모리 위치 모니터링을 시작합니다.오래된 것과 유사함MONITOR , 사용자 모드에서 사용할 수 있는 경우를 제외합니다. | 3 | 굴삭기 |
MWAITX | NP 0F 01 FB | 이전에 지정한 모니터링된 메모리 위치에 쓰기를 기다립니다.MONITORX .MWAITX 형들과 다른MWAIT 주로 사용자 모드에서 실행되며 EBX(ECX의 비트[1]를 1로 설정하여 활성화됨)에서 선택적 타임아웃 인수(TSC 시간 단위로 제공됨)를 허용할 수 있다는 점에서 명령어. | |||
| CLZERO rAX | NP 0F 01 FC | CPU 캐시 라인의 크기와 정렬이 있고 DS:rAX로 지정된 바이트를 포함하는 메모리 영역의 모든 바이트에 0을 기록합니다.[d] | 3 | 젠1 |
| RDPRU | NP 0F 01 FD | 사용자 모드에서 선택한 MSR(주로 성능 카운터)을 읽습니다.ECX는 읽을 레지스터를 지정합니다.[e] MSR의 값은 EDX로 반환됩니다.EAX. | 보통 3개[f] | 선2 |
| MCOMMIT | F3 0F 01 FA | 스레드의 모든 이전 저장소가 메모리에 커밋되었는지, 이러한 저장소에서 발생한 오류가 관련 오류 로깅 리소스에 시그널링되었는지 확인합니다.보고할 수 있는 오류 집합과 로깅 메커니즘은 플랫폼별로 다릅니다. 놓다 EFLAGS.CF 오류가 발생하면 0으로, 발생하지 않으면 1로 바꿉니다. | 3 | 선2 |
| INVLPGB | NP 0F 01 FE | 브로드캐스트가 있는 페이지 범위에 대해 TLB 항목을 무효화합니다.무효화는 명령을 실행하는 프로세서에서 수행되며 시스템의 다른 모든 프로세서로 브로드캐스트됩니다. rAX는 가상 주소를 무효화하고 일부 추가 플래그를 사용하며 ECX는 무효화할 페이지 수를 사용하며 EDX는 TLB 무효화를 수행할 ASID 및 PCID를 지정합니다. | 0 | 선3 |
TLBSYNC | NP 0F 01 FF | TLB 무효화를 동기화합니다. 의 이전 호출에 의해 모든 TLB 무효화가 신호화될 때까지 기다립니다. INVLPGB 동일한 논리 프로세서에 대한 명령은 시스템의 모든 프로세서에 의해 응답되었습니다.명령을 직렬화하고 있습니다. |
- ^ CR8 레지스터에 액세스하는 표준 방법은 다음을 사용하는 인코딩을 사용하는 것입니다.
REX.R
접두사().MOV RDI,CR8
하지만, 그REX.R
접두사는 64비트 모드에서만 사용할 수 있습니다.
AltMovCr8 확장은 CR8에 액세스하기 위한 추가적인 방법을 추가합니다.F0
(LOCK
) 대신 접두사REX.R
– 이를 통해 CR8 외부 64비트 모드에 액세스할 수 있습니다. - ^ a b CRx 레지스터에 연결/연결되는 MOV의 다른 변형과 마찬가지로 AltMovCr8 인코딩은 명령어의 ModR/M 바이트의 상위 2비트를 무시하고 항상 이 두 비트가 다음과 같이 설정된 것처럼 실행됩니다.
11b
.
AltMovCr8 인코딩은 64비트 모드에서 사용할 수 있습니다.하지만, 이를 합하면.LOCK
접두어에 을 붙입니다.REX.R
접두사는 허용되지 않으므로 #UD 예외를 발생시킵니다. - ^ AMD K8의 F 단계에서 AltMovCR8 지원이 추가되었으며 이전 단계에서는 사용할 수 없습니다.
- ^ 위해서
CLZERO
, 주소 크기 및 67h 접두사는 AX, EAX 또는 RAX를 주소로 사용할지 여부를 제어합니다.기본 세그먼트 DS:는 세그먼트 재정의 접두사로 재정의될 수 있습니다.제공된 주소는 정렬할 필요가 없습니다. 하드웨어는 필요에 따라 주소를 정렬합니다.
그CLZERO
지침은 치명적인 기계 점검 오류를 복구하기 위한 것입니다.캐시할 수 없고, 메모리 액세스 없이 캐시 라인을 할당하는 데 사용할 수 없으며, 빠른 메모리 삭제에 사용해서는 안 됩니다.[102] - ^ 에서 사용하는 레지스터 번호.
RDPRU
반드시 다음과 일치하지는 않습니다.RDMSR
/WRMSR
.
에서 지원하는 레지스터RDPRU
2022년 12월 기준으로 다음과 같습니다.ECX 등록하세요 0 MPERF (MSR 0E7h: 최대 성능 주파수 클럭 수) 1 APERF (MSR 0E8h: 실제 성능 주파수 클럭 수) ECX에서 지원되지 않는 값이 0을 반환합니다.
- ^ 한다면
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 기본 산술 명령어 | 정확 통제 | 라운딩 통제 | ||
부동 소수점 추가
| FADD m32 | D8 /0 | 네. | 네. |
FADD m64 | DC /0 | |||
FADD st,st(i) | D8 C0+i | |||
FADD st(i),st | DC C0+i | |||
부동 소수점 곱셈
| FMUL m32 | D8 /1 | 네. | 네. |
FMUL m64 | DC /1 | |||
FMUL st,st(i) | D8 C8+i | |||
FMUL st(i),st | DC C8+i | |||
부동 소수점 차감
| FSUB m32 | D8 /4 | 네. | 네. |
FSUB m64 | DC /4 | |||
FSUB st,st(i) | D8 E0+i | |||
FSUB st(i),st | DC E8+i | |||
부동 소수점 역감산
| FSUBR m32 | D8 /5 | 네. | 네. |
FSUBR m64 | DC /5 | |||
FSUBR st,st(i) | D8 E8+i | |||
FSUBR st(i),st | DC E0+i | |||
부동 소수점차[l]
| FDIV m32 | D8 /6 | 네. | 네. |
FDIV m64 | DC /6 | |||
FDIV st,st(i) | D8 F0+i | |||
FDIV st(i),st | DC F8+i | |||
부동소수점 역분할
| FDIVR m32 | D8 /7 | 네. | 네. |
FDIVR m64 | DC /7 | |||
FDIVR st,st(i) | D8 F8+i | |||
FDIVR st(i),st | DC F0+i | |||
부동 소수점 비교
| 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)의 지수와 가수를 나타내는 두 개의 값 E와 M으로 나눕니다. 분할은 ∗ 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] |
- ^ x87 코프로세서(8087 이외)는 예외를 상당히 이례적인 방식으로 처리합니다.x87 명령이 마스킹되지 않은 산술 예외를 생성해도 CPU 오류가 발생하지 않고 완료됩니다. - 오류가 발생하는 대신 예외 처리에 필요한 보조 프로세서 정보(명령 포인터, opcode,명령에 메모리 피연산자)가 있는 경우 data pointer(데이터 포인터), 보류 중인 예외가 있음을 나타내는 FPU status-word 플래그를 설정합니다.그러면 다음 x87, MMX 또는 다음 x87에서 CPU 오류가 발생합니다.
WAIT
명령이 실행됩니다.
이에 대한 예외는 x87의 "대기 금지" 지침으로, 보류 중인 예외가 존재하더라도 이러한 오류가 발생하지 않고 실행됩니다(일부 주의 사항이 있는 경우 애플리케이션 노트 AP-578[103] 참조).이러한 지침은 대부분 x87 FPU의 보류 예외 상태를 검사 및/또는 수정할 수 있는 제어 지침입니다. - ^ 메모리가 다음으로 시작되는 대기하지 않는 각 x87 명령에 대해
FN
, N이 없는 경우를 제외하고 동일한 니모닉을 갖는 의사 명령이 존재합니다.이 유사 명령들은 다음과 같이 구성됩니다.WAIT
명령어(opcode)9B
)에 해당하는 비 waiting x87 지침이 뒤따릅니다.예를 들어,FNCLEX
opcode가 있는 명령어입니다.이에 해당하는 유사 명령어는FCLEX
로 인코딩됩니다.FNSAVE ES:[BX+6]
opcode가 있는 명령어입니다.해당 의사 명령어는 다음과 같이 인코딩됩니다.
- ^ a b c d 80387 이상 x87 FPU에서는
FLDENV
,F(N)STENV
,FRSTOR
그리고.F(N)SAVE
16비트 및 32비트 변종으로 존재합니다.16비트 변형은 메모리에 14바이트 부동 소수점 환경 데이터 구조를 로드/저장합니다. 32비트 변형은 대신 28바이트 데이터 구조를 로드/저장합니다.F(N)SAVE
/FRSTOR
는 FPU 환경 이후에 80바이트의 FPU 데이터 레지스터 컨텐츠를 추가로 로드/저장합니다. 총 94바이트 또는 108바이트입니다.16비트 및 32비트 변종 간의 선택은CS.D
비트와 존재.66h
명령 접두사8087 및 80287에서는 16비트 버전만 사용할 수 있습니다.
64비트 버전의 명령어는 존재하지 않음 - 사용REX.W
x86-64에서 32비트 변형이 사용됩니다.FIP 및 FDP의 하위 32비트만 로드/저장할 수 있으므로 를 사용하는 것이 좋습니다.FXSAVE64
/FXRSTOR64
대신 64비트 작업이 필요한 경우. - ^ 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)DISI
x87 상태를 수정하지 않는 NOP로 실행하여 하위 호환성을 위해 명령이 유지되었습니다. - ^ a b c
FST
/FSTP
80비트 대상(m80 또는 st(i)) 및 sNaN 소스 값을 사용하면 AMD에서는 예외가 발생하지만 Intel FPU에서는 예외가 발생하지 않습니다. - ^
FSTP ST(0)
는 x87 레지스터 스택에서 하나의 레지스터를 터뜨리는 데 일반적으로 사용되는 관용구입니다. - ^ 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] - ^ a b 8087호와 80287호에
FBSTP
그리고 부하 constant 지침은 항상 라운드 투 nearest 라운딩 모드를 사용합니다.80387 이상 x87 FPU에서는 x87 RC 레지스터에 지정된 라운딩 모드를 사용합니다. - ^ a b c d e f g h i 를 위해
FADDP
,FSUBP
,FSUBRP
,FMULP
,FDIVP
,FDIVRP
,FCOM
,FCOMP
그리고.FXCH
명령어, x86 어셈블러/어셈블러는 인수 없이 명령어의 변형을 인식할 수 있습니다.이러한 변형은 st(1)을 첫 번째 인수로 사용하는 변형과 동일합니다. - ^ 인텔 펜티엄 이후 프로세서에서는
FXCH
는 실제 데이터 이동이 아닌 레지스터 이름 변경으로 구현됩니다.이것은 의미론적인 효과는 없지만 제로 사이클 레이턴시 작동을 가능하게 합니다.또한 명령어를 사용하여 x87 탑 오브 스택 값에 대한 데이터 의존성을 해소할 수 있으며, 이러한 프로세서에 최적화된 코드에 대한 달성 가능한 성능을 개선할 수 있습니다. - ^ 를 실행한 결과.
FBLD
BCD가 아닌 데이터에 대한 명령이 정의되지 않았습니다. - ^ 초기 인텔 펜티엄 프로세서에서는 부동 소수점 분할이 펜티엄 FDIV 버그의 대상이었습니다.이것은 또한 그들의 작업의 일부분으로서 분할을 수행하는 지시에도 영향을 미쳤습니다. 예를 들어 다음과 같이 말입니다.
FPREM
그리고.FPATAN
.[112] - ^ 그
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)의 부호 비트로 설정됩니다.
- ^ 위해서
FXTRACT
, st(0)가 0 또는 ± ∞이면 M은 st(0)와 같게 설정됩니다.st(0)가 0이면 8087/80287에서는 E가 0으로 설정되지만 80387 이상에서는 - ∞로 설정됩니다.st(0)가 ± ∞이면 E는 + ∞로 설정됩니다. - ^ 위해서
FPREM
, 몫 Q가 보다클 경우, 나머지 계산은 부분적으로만 수행되었을 수 있습니다 – 이 경우,FPREM
나머지 계산을 완료하려면 명령을 다시 실행해야 합니다.이는 지침 설정에 의해 표시됩니다.C2
1 대 1.
명령어가 나머지 계산을 완료한 경우 설정됩니다.C2
0으로 설정하고 3비트를 설정합니다.{C0,C3,C1}
계수 Q의 하위 세 부분까지
80387 이상에서 명령어가 나머지 계산을 완료하지 않은 경우 인수 감소에 사용되는 계산된 나머지 Q는 8의 배수(또는 2의 거듭제곱)로 반올림되어 나머지 계산을 완료하는 나중의 패스에서 몫의 하위 3비트를 여전히 올바르게 검색할 수 있습니다. - ^ 에 의해 수행된 나머지 계산.
FPREM
명령은 항상 정확하고 반올림 오류가 없습니다. - ^ 를 위해
FSCALE
8087 및 80287에서 명령어 st(1)는 < 범위여야 합니다 또한 절대값은 0 또는 적어도 1이어야 합니다.이러한 요구 사항이 충족되지 않으면 결과가 정의되지 않습니다.
이러한 제한은 80387년에 제거되었습니다. - ^ 위해서
FSCALE
, 반올림은 오버플로우, 언더플로우 또는 정상 이하의 결과인 경우에만 적용됩니다. - ^ x87 초월 명령어는 PC나 RC를 따르지 않고 대신 전체 80비트 결과를 계산합니다.이러한 결과는 반드시 정확하게 반올림된 것은 아닙니다(표 제조업체의 딜레마 참조). 펜티엄 이상에서는 최대 ±1 ulp의 오차를 갖거나 이전 x87 보조 프로세서에서는 최대 ±1.5 ulp의 오차를 가질 수 있습니다.
- ^ a b 를 위해
FYL2X
그리고.FYL2XP1
명령, ±1 ulp의 최대 오차 한계는 st(1)=1.0에 대해서만 유지됩니다. – st(1)의 다른 값의 경우 오차 한계는 ±1.35 ulp로 증가됩니다. - ^ 위해서
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)와 동일한 부호를가진 ± π{\의 덧셈이 결과에 추가됩니다.
- ^ 하는 동안에
FNOP
x87 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 결과를 정수에 넣었다는 점에서 부동 소수점 비교 명령EFLAGS x87 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 K7 및 SSE에[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 |
- ^ 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로 실행됩니다. - ^ 특정 80387 호환 FPU 모델과 관련된 중단된 지침은 포함되지 않습니다.
- ^ a b 를 위해
FUCOM
그리고.FUCOMP
명령어, x86 어셈블러/어셈블러는 인수 없이 명령어의 변형을 인식할 수 있습니다.이러한 변형은 st(1)을 첫 번째 인수로 사용하는 변형과 동일합니다. - ^ 더 80387
FPREM1
오래된 것과 다른 지시.FPREM
(D9 F8
)에서 사용하는 반올림이 아닌 반올림에서 반올림에 가까운 짝수 반올림으로 Q를 정수로 반올림하는 명령FPREM
.맘에 들다FPREM
,FPREM1
는 항상 반올림 오류 없이 정확한 결과를 계산합니다.맘에 들다FPREM
, 또한 몫이 너무 크면 부분 연산을 수행할 수 있으며, 이 경우 다시 실행해야 합니다. - ^ a b c x87 FPU는 정밀도 약 68비트로 sin/cos에 대한 인수 감소를 수행하기 때문에, 계산에 사용되는 k의 값은
FSIN
,FCOS
그리고.FSINCOS
정확하게 1.0이 아니라, 대신에[113][114] 에 의해 주어집니다.이 논쟁 감소 부정확성은 또한 영향을 미칩니다.FPTAN
설명. - ^ 그
FCOMI
,FCOMIP
,FUCOMI
그리고.FUCOMIP
명령어들은 그들의 결과들을 그들에게 적습니다.ZF
,CF
그리고.PF
아주 조금EFLAGS
등록하세요.AMD 프로세서가 아닌 인텔에서,SF
,AF
그리고.OF
몇 개의EFLAGS
또한 이 지침에 의해 0이 됩니다. - ^ 그
FXSAVE
그리고.FXRSTOR
명령어는 펜티엄 II의 Deschutes 개정판에 추가되었으며 이전의 Klamath 개정판에는 없습니다.
AMD K7에도 존재합니다.
또한 SSE의 필수적인 부분으로 간주되므로 SSE를 사용하는 모든 프로세서에 존재합니다. - ^ a b 그
FXSAVE
그리고.FXRSTOR
명령어는 SSE를 지원하는 프로세서에만 SSE 상태를 저장/복원합니다.그렇지 않으면 x87 및 MMX 상태만 저장/복원됩니다.
저장/복원된 상태의 x87 섹션FXSAVE
/FXRSTOR
기존의 데이터 구조와 완전히 다른 레이아웃을 갖습니다.F(N)SAVE
/FRSTOR
명령어를 사용하여 잘못 정렬된 로드 및 저장소를 방지하여 보다 빠른 저장/복원을 가능하게 합니다. - ^ 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에 대해서도.) - ^ 형들과는 다르게
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 명령어
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 명령어
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
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 /r
opcode 바이트는 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])+xmm3
W=0 인코딩이 필요합니다.vfmaddsd xmm1,xmm2,xmm3,[mem]
공연할 것입니다.xmm1 ← (xmm2*xmm3)+[mem]
W=1 인코딩이 필요합니다.vfmaddsd xmm1,xmm2,xmm3,xmm4
공연할 것입니다.xmm1 ← (xmm2*xmm3)+xmm4
W=0 또는 W=1로 인코딩할 수 있습니다.
Opcode 테이블
FMA4 명령어는 * 및 노란색 셀 색상으로 강조 표시되고 FMA3 명령어는 강조 표시되지 않은 FMA3 명령어와 함께 10개의 융합-다중 덧셈 연산과 110개의 명령어 변형은 다음 표와 같습니다.
기본동작 | Opcode | FP32 지침 | FP64 지침 | FP16 지침 |
---|---|---|---|---|
포장된 교대 곱셈/감산
| 96 | VFMADDSUB132PS | VFMADDSUB132PD | VFMADDSUB132PH |
A6 | VFMADDSUB213PS | VFMADDSUB213PD | VFMADDSUB213PH | |
B6 | VFMADDSUB231PS | VFMADDSUB231PD | VFMADDSUB231PH | |
5C/5D * | VFMADDSUBPS * | VFMADDSUBPD * | — | |
포장된 교대 다중 뺄셈/추가
| 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 * | — |
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 부분 집합 | 명령어 기억법 | 옵코드 | 지침설명 | 추가됨 |
---|---|---|---|---|
| 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 로.tmm7 INIT 상태(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 타일 레지스터의 메모리에 데이터 타일을 저장합니다. | ||
| 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의 결과를 누적합니다. | ||
TDPBF16PS tmm1,tmm2,tmm3 | VEX.128.F3.0F38.W0 5C /r | 행렬은 tmm2에서 BF16 값을 tmm3에서 BF16 값을 곱하여 tmm1을 누적합니다. | ||
TDPFP16PS tmm1,tmm2,tmm3 | VEX.128.F2.0F38.W0 5C /r | 행렬은 tmm2의 FP16 값과 tmm3의 FP16 값을 곱하여 tmm1을 누적합니다. | (그래파이트 급류) | |
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로 결과의 허수 부분을 누적합니다. |
- ^ 위해서
TILEZERO
, 삭제할 타일 레지스터는 명령어의 ModR/M 바이트의 비트 5:3으로 지정됩니다.비트 7.6은 11b로 설정해야 하며 비트 2:0은 000b로 설정해야 합니다. - ^ 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-90B 및 C를 준수합니다.[a] | 브로드웰, 장장, 나이트 랜딩, 젠1, 그레이스몬트 |
RDSEED r64 | NFx REX.W 0F C7 /7 |
인텔 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비트 암호화 키를 지정합니다.에 있는 암시적 피연산자.XMM0 128비트 무결성 키를 지정합니다.EAX 는 명령의 작동을 제어하는 플래그를 포함합니다.로드된 후 IWKey는 소프트웨어에서 직접 읽을 수는 없지만 다음과 같이 수행되는 키 랩핑에 의해 사용됩니다.
|
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의 데이터 크기 또는 카운트를 사용합니다.기존의 문자열 지침처럼 모두 중단 가능하도록 설계되어 있습니다.
패들락 부분집합 | 설명 | 인코딩 | 묘사 | 추가됨 |
---|---|---|---|---|
| XSTORE | NFx 0F A7 C0 | 랜덤 바이트를 ES:[rDI]에 저장하고 그에 따라 ES:rDI를 증가시킵니다.XSTORE 는 현재 사용 가능한 바이트(0 ~ 8바이트)를 저장합니다.REP XSTORE 는 rCX에서 지정한 난수 바이트 수를 기록하며, 필요할 때 난수 생성기를 기다립니다.EDX는 "품질 요인"을 지정합니다. | 느헤미아 (stepping 3) |
REP XSTORE | F3 0F A7 C0 | |||
| 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 | |||
| REP XCRYPTCTR | F3 0F A7 D8 | C7 "에스더"[120] | |
| REP XSHA1 | F3 0F A6 C8 | (SHA-1 함수와 SHA-256 함수를 각각 사용하여) 암호 해시를 계산합니다.ES:rSI는 해시를 계산할 데이터를 가리키고, ES:rDI는 메시지 다이제스트를 가리키며 rCX는 바이트 수를 지정합니다. rAX는 계산을 시작할 때 0으로 설정해야 합니다.[c] | 에스더 |
REP XSHA256 | F3 0F A6 D0 | |||
| REP MONTMUL | F3 0F A6 C0 | 몽고메리 곱셈을 수행합니다.ECX에서 피연산자 폭(비트 수로 제공됨)을 취합니다. 범위는 256이어야 합니다.32768과 128로 나뉠 수 있음) 및 ES:ESI의 데이터 구조에 대한 포인터.[d] | 에스더 |
CCS_HASH | F3 0F A6 E8 | SM3 해시를 계산합니다.REP XSHA* 지침들.rBX 레지스터는 해시 함수()를 지정하는 데 사용됩니다.20h SM3가 유일하게 문서화된 값입니다. | 장장 | |
CCS_ENCRYPT | F3 0F A7 F0 | 다양한 블록 모드에서 SM4 암호를 사용하여 데이터를 암호화/복호화합니다. rCX는 암호화/복호화할 16바이트 블록 수를 포함하고, rBX는 암호화 키를 가리키는 포인터를 포함하고, rDX는 암호화 키를 필요로 하는 블록 모드의 초기화 벡터를 가리키는 포인터를 포함하고, rAX는 제어어를 포함합니다.[e] |
- ^ 제어어:
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으로 설정 - ^ ACE2는 또한 다른 기능에 추가 기능을 추가합니다.
REP XCRYPT
명령어: CBC 및 CFB 명령어에 대한 다이제스트 모드 및 비ECB 명령어에 대해 16바이트 정렬되지 않은 입출력 데이터를 사용할 수 있는 기능. - ^ VIA Nano 이상의 프로세서에서는 rAX를 다음과 같이 all-1s 값으로 설정합니다.
REP XSHA*
명령어는 대체 작동 모드를 활성화합니다. 여기서 rCX는 64바이트 블록의 수를 지정하고 해시 계산이 끝날 때 표준 FIPS-180-2 길이 확장 절차를 생략합니다.따라서 원래 EAX=0 모델보다 데이터 스트리밍에 더 적합한 모델이 됩니다.이 기능은 다음에 대해서도 존재합니다.CCS_HASH
.
- ^ 데이터 구조는 다음과 같습니다.
REP MONTMUL
는 6개의 32비트 요소를 포함하고 있는데, 첫 번째 요소는 모듈러스의 하위 32비트의 네거티브 모듈러 역이고 나머지 5개는 다양한 메모리 버퍼에 대한 포인터입니다.간격띄우기 자료항목 0 음의 모듈러 역수 4 첫번째 곱셈기에 대한 포인터 8 두번째 곱셈기 포인터 12 결과 버퍼의 포인터 16 계수에 대한 포인터 20 32바이트 스크래치 패드 포인터 - ^ 그
CCS_ENCRYPT
rAX의 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 |
- ^ a b c d RAX 인수의 경우
VMRUN
,VMLOAD
,VMSAVE
그리고.INVLPGA
지침에 따라 AX/EAX/RAX의 선택은 주소 크기에 따라 달라지며, 67h 접두사를 사용하면 무시할 수 있습니다. - ^ AMD-V 지원은 AMD K8의 F 단계에서 추가되었으며 이전 단계에서는 사용할 수 없습니다.
- ^ a b 그
VMRUN
명령어는 CPU 상태의 제한된 부분 집합만 로드합니다.VMLOAD
실행 전에 실행해야 함VMRUN
추가 상태를 로드합니다.
마찬가지로 #VMEXIT는 VMCB에 제한된 양의 게스트 상태만 저장합니다.VMSAVE
추가 상태를 저장하기 위해 필요합니다.
VMM에서 처리하는 상태 항목을 사용할 필요가 없는 단순 가로채기 조건의 경우VMSAVE
/VMLOAD
, VMM은 수행을 포기함으로써 성능을 향상시킬 수 있습니다.VMSAVE
/VMLOAD
가상 시스템을 다시 entering하기 전에VMRUN
. - ^ VMLOAD/VMSAVE 가상화(Excavator 이상)를 지원하는 CPU의 경우
VMLOAD
그리고.VMSAVE
게스트 모드에서도 명령을 실행할 수 있습니다. - ^ 가상 GIF(굴착기 이상)를 지원하는 CPU의 경우
STGI
그리고.CLGI
게스트 모드에서도 명령을 실행할 수 있습니다. - ^
VMGEXIT
다음과 같이 실행됩니다.VMMCALL
SEV-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 게스트 |
- ^ VM 게스트 내에서 VT-x VMM 지침을 실행하면 VMXIT가 발생합니다.
다음을 통해 VMX 작업을 입력하지 않은 경우VMXON
, 모든 VT-x 명령(단, 제외)VMXON
)이 #UD를 유발합니다. - ^ a b c d m64 논법은 다음과 같습니다.
VMPTRLD
,VMPTRST
,VMCLEAR
그리고.VMXON
는 64비트 물리 주소입니다. - ^ m64 논법은 다음과 같습니다.
VMXON
는 "VMXON 영역"에 대한 64비트 물리 주소입니다. "VMXON 영역"은 4Kbyte가 정렬되어야 하는 4Kbyte 영역입니다.이 영역은 프로세서가 VMX 작업을 구현 종속적인 방식으로 지원하기 위해 사용할 수 있으며 프로세서가 VMX 작업을 종료할 때까지 소프트웨어에서 액세스할 수 없습니다.VMXOFF
설명. - ^ "VMCS Shadowing"(VMCS Shadowing)이 활성화된 경우(Haswell 이상에서 사용 가능),
VMREAD
그리고.VMWRITE
명령은 게스트에 의해서도 실행될 수 있습니다. - ^ 그
VMCALL
VMM에서도 명령을 실행할 수 있습니다. 이렇게 하면 SMM VM이 특별하게 종료됩니다. - ^ 사용 가능한 기능은
VMFUNC
EAX 레지스터에는 다음이 있습니다.EAX 기능. 0 EPTP 스위칭: 확장 페이지 테이블 포인터를 VM 호스트가 미리 준비한 최대 512개 테이블 포인터 중 하나로 전환합니다.
ECX는 512개의 포인터 중에서 사용할 포인터를 지정합니다.1-63 (예약, VMEXIT 발생) ≥64 올바르지 않습니다. #UD를 발생시킵니다. - ^ 사용 가능한 작업은
SEAMOPS
RAX 레지스터에는 다음이 있습니다.락스 작동 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 전용으로 문서화되었습니다. 실제 작동은 | 펜티엄(Pentium) 이후로 0Ah 이외의 imm8 값에 대해 문서화된 8086부터 사용 가능합니다(이전 문서에는 인수가 없음) |
AAD im8 | D5 im8 | ASCII-Adjust-Before-Division.8086에서 imm8=0Ah에 대해서만 문서화되어 있으며, 이는 BCD 값을 다음 분할 명령을 위해 이진으로 변환하는 데 사용됩니다. 실제 작동은 | |
SALC, 세탈크 | D6 | Carry Flag(SBB AL, AL의 1바이트 대안) 값에 따라 AL 설정 | 8086부터 사용할 수 있지만 펜티엄 프로 이후로 문서화되어 있습니다. |
시험 | F6/1 imm8, F7/1 imm16/32 | TEST 지침의 문서화되지 않은 변형.[129]문서화된 F6/0 및 F7/0 변형과 동일한 작동을 수행합니다. | 8086년부터 사용 가능합니다. |
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. | 펜티엄 프로 및 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 아니면REPNZ a의 접두사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 ,
| 0F 04 | 정확한 목적을 알 수 없으며, HCF(CPU 행)를 발생시킵니다.유일한 방법은 CPU 리셋입니다.[157] 일부 구현에서는 BIOS를 통해 중지 시퀀스로 에뮬레이트합니다.[158] 빈티지 컴퓨팅 연맹의 포럼 게시물에서 이 지침은 다음과 같이 설명됩니다. | 80286에서만 이용 가능합니다. |
LOADALL | 0F 05 | 메모리 주소 0x000800H에서 모든 레지스터 로드 | 80286에서만 이용 가능합니다. 재사용된 Opcode |
LOADALLD | 0F 07 | 메모리 주소 ES:EDI에서 모든 레지스터 로드 | 80386에서만 사용 가능합니다. 재사용된 Opcode |
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에서만 사용할 수 있습니다. 문서화를 위해 재사용된 Opcode |
알 수 없는 기억력 | 64 D6 | 사용.64 (FS: 세그먼트) 문서화되지 않은 접두사D6 (SALC /SETALC ) 지침에 따라 UMC CPU에서만 EAX가 다음과 같이 설정됩니다.0xAB6B1B07 .[169][170] | UMC Green CPU에서만 사용할 수 있습니다.다음으로 실행SALC UMC CPU가 아닌 경우. |
FS: Jcc | 64 (70..7F) rel8 ,
| 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 Technologies와 Zhaoxin이 만든 일부 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를 유발하지 않고 실행되는 것으로 감지됨. 알 수 없는 작업, 문서화된 작업과 관련이 있을 수 있습니다. | |
(unknown, 배수) | 0F 0F /r ?? | SandSifter[175] 및 UISFuzz의[176] 백서에서는 여러 AMD CPU(적어도 Geode NX 및 C-50)에서 3DNow! opcode 범위에서 문서화되지 않은 명령이 대량으로 탐지되었음을 보고합니다.그들의 작전은 알려지지 않았습니다. 적어도 AMD K6-2에서는 할당되지 않은 모든 3DNow! opcode(문서화되지 않은 것 제외) | 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 ,
| 알 수 없는 | 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 모두에서 동작이 동일한지 여부도 알 수 없습니다. |
참고 항목
참고문헌
- ^ "Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
- ^ 마이클 네카섹, SGDT/SIDT 픽션과 현실
- ^ WikiChip, UMIP – x86
- ^ Oracle Corporation, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, 섹션 3.5: 소프트웨어 가상화에 대한 세부 정보
- ^ MBC 프로젝트, 가상 머신 탐지(영구 링크) 또는 가상 머신 탐지(영구 링크)
- ^ Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), 챕터 8, 페이지 249, 257
- ^ 미국 특허 4974159, "멀티태스킹 컴퓨터 시스템에서의 제어권 이전 방법"은 63h/ARPL을 언급하고 있습니다.
- ^ Intel, Pentium® 프로세서 제품군 개발자 설명서, 1995년 3권, 주문 번호 241430-004, 섹션 12.7, 페이지 323
- ^ Intel, 마이크로아키텍처 데이터 샘플링의 작동 방식, 완화 섹션 참조.2022년 4월 22일에 보관됨
- ^ 리눅스 커널 문서, 마이크로아키텍처 데이터 샘플링(MDS) 완화 Wayback Machine에서 2020-10-21 아카이브
- ^ 인텔, 문서화되지 않은 iAPX 286 테스트 지침
- ^ VCF 포럼, 2019년 6월 21일 SAVEALL opcode를 찾았습니다.
- ^ replodsb, Intel 286 Secret : ICE mode and F10F 04, 2022년 8월 12일
- ^ LKML, (PATCH) x86-64, espfix: 31:16 %의 비트를 16비트 스택으로 유출하지 마십시오, 2014년 4월 29일.2018년 1월 4일에 보관됨
- ^ Raymond Chen, 윈도우 95에서 MS-DOS 게임 실행하기: iredd 문제 해결하기, 2016년 4월 4일2019년 3월 15일 보관
- ^ sandpile.org , x86 아키텍처 FLAGs 레지스터, 참고 #7 참조
- ^ 2021년 3월 22일, 볼뤼크, 이 이상한 속임수로 x86-64 명령 세트 전체를 몇 초 안에 추측할 수 있을까요?2021년 3월 23일 보관.
- ^ a b Robert Collins, Undocumented OpCodes, 1995년 7월 29일.2001년 2월 21일 보관.
- ^ Michal Necasek, ICEBP 최종 문서화, OS/2 Museum, 2018년 5월 25일2018년 6월 6일 보관
- ^ Intel, AP-526: Intel의 32비트 프로세서에 대한 최적화, 주문 번호 242816-001, 1995년 10월 – 목록
INT1
86쪽에 - ^ AMD, AMD 64비트 기술, vol 2: 시스템 프로그래밍, 주문번호 24593, rev 3.06, 2002년 8월 248페이지
- ^ "Intel 80386 CPU Information PCJS Machines".
- ^ Geoff Chapell, CPUID 이전의 CPU ID
- ^ 제프 파슨스, 구식 80386 명령어: IBTS 및 XBTS, PCjs 머신2020년 9월 19일 보관.
- ^ 로버트 콜린스, LOADALL 지침서.1997년 6월 5일 원본에서 보관.
- ^ 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.
- ^ 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
- ^ Intel "i486 Microprocessor" (1989년 4월, 주문번호 240440-001) p.142 lists
CMPXCHG
암호화된 - ^ Intel "i486 Microprocessor" (1989년 11월, 주문번호 240440-002) p.135 목록
CMPXCHG
암호화된 - ^ "Intel 486 & 486 POD CPUID, S-spec, & Steppings".
- ^ Intel, Software Guard Extensions Programming Reference, 주문 번호 3298-002, Oct 2014, 섹션 3.5 및 3.6.5
- ^ Frank van Gilluwe, "The Undocumented PC, Second Edition", 1997, ISBN 0-201-47950-8, 55페이지
- ^ 인텔, 소프트웨어 개발자 매뉴얼, vol 3A, 주문번호 253668-078, 2022년 12월 9.3, 299페이지
- ^ "RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
- ^ 마이크로프로세서 보고서, 시스템 관리 모드 설명 (vol 6, no. 8, 1992년 6월 17일)2022년 6월 29일 보관.
- ^ Cyrix 486SLC/e 데이터 시트(1992), 섹션 2.6.4
- ^ Linux 6.3 커널 소스, /arch/x86/포함/asm/cpuid.h, 라인 69
- ^ gcc-patch 메일링 리스트, IDT Winchip용 CPUID Patch, 2019년 5월 21일
- ^ Intel, Intel® Virtualization Technology FlexMigration Application Note 주문 번호 323850-004, 2012년 10월, 섹션 2.3.2(12페이지)
- ^ 인텔, 아톰 프로세서 C3000 제품군 데이터시트 주문번호 337018-002, 2018년 2월 133페이지, 3808페이지, 38142022년 2월 9일 보관.
- ^ AMD, AMD64 Architecture Programmer's Manual Volume 3 pub.no . 24594, rev 3.34, 2022년 10월, p. 165 (엔트리온
CPUID
지시) - ^ 로버트 콜린스, CPUID 알고리즘 전쟁, 1996년 11월.2000년 12월 18일 원본에서 보관.
- ^ Geoff Chappell, CMPXCHG8B 32비트 Windows 커널 지원, 2008년 1월 23일
- ^ a b Intel, Software Developer's Manual, 주문 번호 325426-077, 2022년 11월 – 엔트리
RDTSC
p.1739의 명령은 명령을 내리는 데 필요한 명령 시퀀스를 설명합니다.RDTSC
이전 및 이후의 지시에 대한 지시 - ^ Linux 커널 5.4.12, /arch/x86/커널/cpu/centaur.c
- ^ 스택 오버플로, 일정한 비불변 tsc가 cpu 상태에서 주파수를 변경할 수 있습니까?2023년 1월 24일 접속.
- ^ CPU-World, IDT ZHAOX용 CPUIDIN Kai Xian KX-U6780 2.7GHz (KZ 기준).2023년 1월 24일 접속.
- ^ Michal Necasek, "문서화되지 않은 RDTSC", 2018년 4월 27일
- ^ JookWiki, 2022년 9월 24일, "nopp" – 긴 NOP의 역사와 그 주변의 문제에 대한 긴 설명을 제공합니다.2022년 10월 28일 보관.
- ^ a b 인텔 커뮤니티:멀티바이트 NOP 공식화.2022년 4월 7일 보관.
- ^ Intel Software Developers Manual, vol 3B (주문 번호 253669-076us, 2021년 12월), 섹션 22.15 "예약 NOP"
- ^ AMD, AMD 64비트 기술 – AMD x86-64 Architecture Programmer's Manual Volume 3, 공개번호 24594, rev 3.02, 2002년 8월 379페이지
- ^ Intel, Intel Architecture Software Developer's Manual, Volume 2, 1997, 주문번호 243191-001, 페이지 3-9 및 A-7
- ^ John Hassey, Pentium Prochanges, GAS2 메일링 리스트, 1995년 12월 28일 – 패치를 추가했습니다.
UD2A
그리고.UD2B
니모믹스를 GNU Binutils에 지시합니다. - ^ Jan Beulich, x86: 올바른 UDn, binutils-gdb 메일링 리스트, 2017년 11월 23일 – ModR/M 바이트를 추가한 binutils 패치
UD1
/UD2B
덧붙여서UD0
. - ^ Intel, Pentium® 프로세서 제품군 개발자 설명서 3권, 1995주문 번호 241430-004, 부록 A, 943페이지 – opcode 및 를 예약합니다.
- ^ a b AMD, AMD64 Architecture Programmer's Manual Volume 3, 공보 번호 24594, rev 3.17, 2011년 12월 – 416페이지 참조
UD0
그리고 415페이지와 419페이지를 위하여.UD1
. - ^ a b c Intel, Software Developer's Manual, vol 2B, 주문번호 253667-061, Dec 2016 – lists
UD1
(ModR/M 바이트 포함) 및UD0
(ModR/M 바이트 미포함) (4-687페이지). - ^ Julian Stecklina, 불법 Opcode를 사용하여 x86 CPU 지문채취, 2019년 2월 8일
- ^ a b Cyrix, 6x86 프로세서 데이터북, 1996, 주문 번호 94175-01, 표 6-20, 209페이지 – 니모닉 사용
OIO
("공식 유효하지 않은 opcode"). - ^ Intel, Software Developer's Manual, vol 2B, 주문번호 253667-064, Oct 2017 – lists
UD0
(ModR/M 바이트 포함) (4-683페이지). - ^ AMD, AMD-K5 프로세서 기술 참조 매뉴얼, 1996년 11월, 주문 번호 18524C/0, 섹션 3.3.7, 90페이지 – 메모리를 할당하지 않고 opcode를 예약합니다.
- ^ AMD, AMD-K6 프로세서 데이터 시트, 주문 번호 20695H/0, 1998년 3월, 섹션 24.2, 283페이지
- ^ George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 2012년 6월 13일2019년 3월 15일 보관.
- ^ 인텔, AP-485: 인텔 ® 프로세서 식별 및 CPUID 명령어, 주문번호 241618-039, 2012년 5월, 섹션 5.1.2.5, 32페이지
- ^ 마이클 네카섹, "SYSENTER, 어디 있어요?"
- ^ AMD, 애슬론 프로세서 x86 코드 최적화 가이드, 출판 번호22007, rev K, 2002년 2월, 부록 F, 284페이지
- ^ Transmeta, 프로세서 인식, 2002년 5월 7일
- ^ VIA, VIA C3 Nehemiah 프로세서 데이터시트, rev 1.13, 2004년 9월 29일 17페이지
- ^ CPU-World, Intel Xeon용 CPUID 3.40GHz – CMPXCHG16B 없이 D CPUID를 밟지 않음
- ^ CPU-World, Intel Xeon용 CPUID 3.60GHz – CMPXCHG16B로 E CPUID를 밟지 않음
- ^ SuperUser Stack Exchange, cmpxchg16b 명령이 없는 오래된 x64 프로세서는 얼마나 널리 사용되고 있습니까?
- ^ Intel SDM 주문번호 325462-077, ap 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension"에는 렉스가 없는 MOVSXD가 기재되어 있습니다."당연했다"
- ^ 아난드테크, AMD Zen 3 라이젠 딥 다이브 리뷰, 2020년 11월 5일 6페이지
- ^ @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.
- ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.
- ^ 인텔, 제어 흐름 강제 기술 규격 (v3.0, 주문번호 334525-003, 2019년 3월)
- ^ Intel SDM, rev 076, 2021년 12월 1권, 섹션 18.3.1
- ^ Binutils 메일 목록: x86: CET v2.0: NOTRACK 접두사 업데이트
- ^ AMD, 3DNow! 및 MMX 명령어 세트, 참조번호 22466D/0, 2000년 3월, 페이지 11
- ^ 하디 브레이스, x86 SFENCE 명령의 의의, 2019년 2월 26일
- ^ 인텔, 소프트웨어 개발자 매뉴얼, 주문번호 325426-077, 2022년 11월 1권, 섹션 11.4.4.3, 276페이지
- ^ Hadi Brais, LFENCE 명령의 중요성, 2018년 5월 14일
- ^ AMD, AMD 프로세서의 추측을 관리하기 위한 소프트웨어 기술, rev 3.8.22, 2022년 3월 8일 4페이지2022년 3월 13일 보관.
- ^ Intel, Prescott New Instructions Software Developer's Guide, 주문번호 252490-003, 2003년 6월, 3-26페이지 및 3-38페이지 목록
MONITOR
그리고.MWAIT
명시적인 피연산자를 사용할 수 있습니다. - ^ 플랫 어셈블러 메시지 보드, "BLENDVPS/BLENDVD/PBLENDVB 구문"도 다룹니다.
MONITOR
/MWAIT
기억법 - ^ 인텔, 인텔 ® Xeon Phi™ 제품군 x200 (KNL) 사용자 모드 (링 3) MONitor and MWAIT (2017년 3월 5일 archived)
- ^ AMD, BIOS 및 커널 개발자 설명서(BKDG) AMD 제품군 10h 프로세서용 주문번호 31116, rev 3.62, 419페이지
- ^ R. Zhang 등, (M)WAIT for It: 마이크로아키텍처와 건축 측면 채널 사이의 간극 해소, 2023년 1월 3일 5페이지2023년 1월 5일 원본에서 보관.
- ^ Guru3D, VIA Zhaoxin x864 및 8코어 SoC 프로세서 출시, 2018년 1월 22일
- ^ Vulners, x86: INVPCID를 정규 주소가 아닌 사용 시도의 DoS, 2018년 11월 20일
- ^ Intel, Intel® 64 및 IA-32 Architectures 소프트웨어 개발자 매뉴얼 제3권, 주문번호 325384-078, 2022년 12월 23.15장
- ^ a b Catherine Easdon, x86 및 RISC-V 마이크로아키텍처의 문서화되지 않은 CPU 동작: 보안의 관점, 2019년 5월 10일 39페이지
- ^ Instlatx64, Zhaoxin Kaixian KX-6000G CPUID 덤프, 2023년 5월 15일
- ^ a b c Intel, Intel® Software Guard Extensions(Intel® SGX) 가상화 환경에서 보안 메모리의 초과 구독을 위한 아키텍처, 2017년 6월 25일
- ^ Intel, Runtime Microcode Update with Intel® Software Guard Extensions, sep 2021, 주문 번호 648682 rev 1.02023년 3월 31일 원본에서 보관.
- ^ 인텔, 11세대 인텔®Core™프로세서 데스크톱 데이터시트, 제1권, 2022년 5월, 주문번호 634648-004, 섹션 3.5, 65페이지
- ^ Intel, Intel® SGX(Software Guard Extensions) SGX2를 지원하는 플랫폼은 무엇입니까?2022년 5월 5일에 보관.
- ^ a b Intel, Trust Domain CPU Architectural Extensions, 주문 번호 343754-002, 2021년 5월
- ^ @InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23 – via Twitter.
- ^ @Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20 – via Twitter.
- ^ Wikichip, CLZERO – x86
- ^ Intel, Application note AP-578: Intel Architecture Processor용 FPU 예외 핸들러에 대한 소프트웨어 및 하드웨어 고려사항, 주문번호 243291-002, 1997년 2월
- ^ Intel, Application Note AP-113: 숫자 데이터 프로세서 시작하기, 1981년 2월 24-25페이지
- ^ Intel, 8087 Math Copprocessor, Oct 1989, 주문번호 285385-007, 3-100페이지, 그림 9
- ^ 인텔, 80287 80비트 HMOS 숫자 프로세서 확장, 1983년 2월, 주문번호 201920-001, 14페이지
- ^ Intel, iAPX86, 88 사용 설명서, 1981 (주문번호 2201-001), 페이지 797
- ^ a b Intel 80286 및 80287 프로그래머 참조 매뉴얼, 1987 (주문 번호 210498-005), 페이지 485
- ^ 인텔 소프트웨어 개발자 설명서 3B권, 개정판 064, 섹션 22.18.9
- ^ "GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'".
- ^ Michael Steil, FFREEP – 존재하지 않았던 조립 지침
- ^ 두스코 콘칼리예프, 펜티엄 FDIV 버그
- ^ Bruce Dawson, Intel, 오류 한계 13억 5천만으로 과소평가
- ^ Intel SDM, rev 053 이상에서는 다음에 사용되는 정확한 인수 축소 절차를 설명합니다.
FSIN
,FCOS
,FSINCOS
그리고.FPTAN
제1권 제8.3.8절에서 - ^ Intel, Intel® 64 및 IA-32 Architecture Optimization Reference Manual (주문 번호 248966-044, 2021년 6월) 섹션 3.5.2.3
- ^ "The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers" (PDF). Retrieved October 17, 2016.
- ^ "Chess programming AVX2". Archived from the original on July 10, 2017. Retrieved October 17, 2016.
- ^ "Intel AVX-512 Instructions". Intel. Retrieved 21 June 2022.
- ^ Intel, DRNG(Digital Random Number Generator) 소프트웨어 구현 가이드 rev 2.1, 2018년 10월 17일 섹션 5.2 및 5.32021년 11월 19일 보관.
- ^ Michal Ludvig, VIA PadLock—Wicked Fast Encryption, Linux Journal, 2005년 4월 6일.2005년 6월 20일에 보관.
- ^ 스택 오버플로, VIA의 Padlock Hashing Engine을 이용한 스트리밍 SHA 계산?,2014년8월11일2019년 6월 14일 보관.
스택 오버플로 답변에 참조된 PadLock SDK(v3.1)는 Crypto++ wiki(2023년 8월 11일 액세스) 또는 Wayback Machine에서 다운로드할 수 있습니다. - ^ Zhaoxin, Zhaoxin 프로세서 기반 국가 암호화 알고리즘 가속화 명령어 사용을 위한 핵심 기술 지침(중국어)2022년 1월 5일 보관
- ^ 자오신, GMI 사용 설명서 v1.0(중국어).2022년 2월 28일 보관
- ^ AMD, AMD64 가상화 코드명 "Pacifica" 기술, 공보 제33407호, 2005.5.01.2011년 6월 13일에 보관.
- ^ CPU-World, AMD Turion 64 X2 RM-75용 CPUID, 2022-03-05
- ^ Intel, Intel® Atom™ Product Family for Microserver 데이터시트, Volume 1 of 2, 주문번호 328194-001, dec 2012, 44페이지
- ^ 보안.주간, 인텔, 2023년 1월 10일 4세대 제온 프로세서 출시로 기밀 컴퓨팅 포트폴리오에 TDX 추가
- ^ Robert Collins, Undocumented OpCode: AAM
- ^ a b Frank van Gilluwe, "The Undocumented PC – Second Edition", 페이지 93-95
- ^ 마이클 네카섹, 인텔 486 에라타?
- ^ Robert Hummel, "PC Magazine Programmer's Technical Reference" (ISBN 1-56276-016-5) p.728
- ^ 라울 구티에레스 산즈, 8086 작품집, 1부
- ^ a b "Asm, opcode 82h".
- ^ 인텔 코퍼레이션 2022, 페이지 3698
- ^ Intel, The 8086 Family User's Manual, 1979년 10월, opcode 4-25페이지 및 4-31페이지 생략
- ^ Retrocomputing Stack Exchange, 80386 이전의 x86 CPU에서 문서화되지 않은 지침?
- ^ 다니엘 B.Sedory, 표준 MBR의 고찰
- ^ AMD, AMD64 프로세서용 소프트웨어 최적화 가이드 (공보 25112, 개정판 3.06, 2005년 9월), 섹션 6.2, 페이지 128
- ^ 버그 48227 – -march=core2에 대해 "repret" 생성
- ^ 레이먼드 첸, 세상에, 이상한 NOP가 있군요!
- ^ Jeff Parsons, Intel 80386 CPU 정보 (B1 errata 섹션, 항목 #7)
- ^ retrocomputing Stack Exchange, i80286의 0F1 홉코드 접두사
- ^ Intel 소프트웨어 개발자 설명서, 2B권(2006년 1월 주문 번호 235667-018, 긴 NOP 없음)
- ^ Intel 소프트웨어 개발자 설명서, 2B권(2006년 3월, 주문 번호 235667-019, 긴 NOP 포함)
- ^ 아그너 포그, 지침표, AMD K7 섹션
- ^ "579838 – glibc not compatible with AMD Geode LX".
- ^ Intel 소프트웨어 개발자 설명서, 2B권(2005년 4월, 주문 번호 235667-015, 0F0D-nop 목록에 없음)
- ^ Intel Software Developers Manual, volume 2B (2005년 6월, 주문 번호 235667-016, opcode 테이블에는 0F0D-nop이 나열되어 있지만 NOP 지침 설명에는 포함되어 있지 않음)
- ^ Intel Software Developers Manual, Volume 2B(주문 번호 253667-060, 2016년 9월)에는 UD0 및 UD1이 나와 있지 않습니다.
- ^ "PCJS : pcjs/x86op0F.js (two-byte x86 opcode handlers), lines 1647–1651". GitHub. 17 April 2022.
- ^ "80486 paging protection faults? \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Invalid opcode handling \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Invalid instructions cause exit even if Int 6 is hooked \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Tutorial – Calling Win32 from DOS". Ragestorm. 17 Sep 2005. Archived from the original on 9 April 2022.
- ^ "Accessing Windows device drivers from DOS programs".
- ^ 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.
- ^ "Re: Undocumented opcodes (HINT_NOP)". Archived from the original on 2004-11-06. Retrieved 2010-11-07.
- ^ "Re: Also some undocumented 0Fh opcodes". Archived from the original on 2003-06-26. Retrieved 2010-11-07.
- ^ 인텔의 SCC용 RCCE 라이브러리는 opcode를 사용했습니다.
0F 0A
SCC의 메시지 무효화 지시에 대한. - ^ Intel Labs, SCC 외부 아키텍처 사양(EAS), Revision 0.94, p.292022년 5월 22일 보관.
- ^ "Undocumented x86 instructions to control the CPU at the microarchitecture level in modern Intel processors" (PDF). 9 July 2021.
- ^ 로버트 R.콜린스, 문서화되지 않은 OpCode: UMOV. 2001년 2월 21일 보관.
- ^ Herbert Oppmann, NXOP (Opcode 0Fh 55h)
- ^ Herbert Oppmann, NexGen Nx586 Hypercode 소스, COMMEN.INC 참조
- ^ Herbert Oppmann, NxGen Nx586 시스템 BIOS 내부
- ^ Intel, XuCode: 2021년 5월 6일 복합 명령어 흐름 구현을 위한 혁신 기술2022년 7월 19일 보관.
- ^ Grzegorz Mazur, AMD 3D Now! 문서화되지 않은 지침
- ^ a b "Undocumented 3DNow! Instructions". grafi.ii.pw.edu.pl. Archived from the original on 30 January 2003. Retrieved 22 February 2022.
- ^ 포템킨의 해커 그룹의 OPCODE.LST, v4.51
- ^ "[UCA CPU Analysis] Prototype UMC Green CPU U5S-SUPER33". 25 May 2020.
- ^ Agner Fog, 인텔, AMD 및 VIA CPU의 마이크로아키텍처 섹션 3.4 "P4 및 P4E에서의 분기 예측"
- ^ 레딧 /r/Amd 토론 스레드: 라이젠은 FMA4에 대한 문서화되지 않은 지원을 가지고 있습니다.
- ^ "Welcome to the OpenSSL Project". GitHub. 21 April 2022.
- ^ 패치: VIA C7 및 Nano CPU용 PadLock 엔진 업데이트
- ^ a b 크리스토퍼 도마스, x86 ISA 깨기
- ^ a b Xixing Li et al, UISFuzz : CPU 미문서 명령어 검색의 효율적인 퍼징 방법
- ^ a b OpenEuler 메일링 리스트, PATCH 커널-4.19 v25/6 : x86/cpu 기능: 자오신 피쳐 비트를 추가합니다.2022년 4월 9일 보관.
- ^ USPTO/Zhaoxin, 특허 출원 US2023/006718: 해시 암호 알고리즘을 갖는 프로세서 및 그 데이터 처리, 13페이지 및 45페이지, 2023년 3월 2일.2023년 9월 12일 보관.
- ^ InstLatx64, Zhaoxin KaiXian KX-6000G용 CPUID 덤프 – SM2 및 xmodx 기능 비트가 설정되어 있습니다(CPUID 리프 C0000001:EDX:비트 0과 29).2023년 7월 25일 보관.
- ^ 마이크로프로세서 보고서, MediaGX는 저비용 PC를 대상으로 합니다 (vol 11, no. 3, 1997년 3월 10일)
- ^ Intel XED용 ISA 데이터 파일(2022년 4월 17일), 라인 916-944
- ^ Cyrix 6x86 프로세서 데이터북, 6-34페이지
- ^ AMD Geode LX 프로세서 데이터 북, 출판물 3234H, 페이지 670
- Intel Corporation (April 2022). "Intel 64 and IA-32 Architectures Software Developer's Manual, Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4". Intel. Retrieved 21 June 2022.
외부 링크
