AESENC128KL
使用128比特键执行 AES 的十轮加密流程
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 38 DC !(11):rrr:bbb | AESENC128KL xmm, m384 | A | 有效 | 有效 | 使用128位的 AES 密钥 加密 xmm 以 han- dle 表示在 m384 ,存储结果为 xmm. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
AESENC128KL1指令执行十轮AES,使用128位的密钥 indi-加密第一个操作数.
由第二批操作数的句柄催化. 如果操作成功, 它会存储第一个 操作数 的结果
(例如,不会遇到句柄违规失败).
行动
AESENC128KL
Handle := UnalignedLoad of 384 bit (SRC); // Load is not guaranteed to be atomic.
Illegal Handle = (
HandleReservedBitSet (Handle) ||
(Handle[0] AND (CPL > 0)) ||
Handle [1] ||
HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES128
);
IF (Illegal Handle) {
THEN RFLAGS.ZF := 1;
ELSE
(UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey);
IF (Authentic == 0)
THEN RFLAGS.ZF := 1;
ELSE
DEST := AES128Encrypt (DEST, UnwrappedKey) ;
RFLAGS.ZF := 0;
FI;
FI;
RFLAGS.OF, SF, AF, PF, CF := 0;受影响的旗帜
ZF如果操作成功,则设定为0;如果由于句柄的违反,操作失败,则设定为1. 其他算术旗(OF, SF, AF, PF, CF)清除为0.
Intel C/C++ 内在编译器
AESENC128KL unsigned char _mm_aesenc128kl_u8(__m128i* odata, __m128i idata, const void* h);异常
实地址模式
#UD | 如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 如果使用 CR4.KL=0. 如果使用 CPUID.19H:EBX.AESKLE[0]=0. 如果使用 CR0.EM=1. 如果使用 CR4.OSFXSR=0. |
#NM | 如果 CR0.TS = 1. |
#PF | 如果发生 页面错误 。 |
#GP(0) | 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。 |
保护模式
#UD | 如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 如果使用 CR4.KL=0. 如果使用 CPUID.19H:EBX.AESKLE[0]=0. 如果使用 CR0.EM=1. 如果使用 CR4.OSFXSR=0. |
#NM | 如果 CR0.TS = 1. |
#PF | 如果发生 页面错误 。 |
#GP(0) | 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。 |
虚拟 8086 模式
#UD | 如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 如果使用 CR4.KL=0. 如果使用 CPUID.19H:EBX.AESKLE[0]=0. 如果使用 CR0.EM=1. 如果使用 CR4.OSFXSR=0. |
#NM | 如果 CR0.TS = 1. |
#PF | 如果发生 页面错误 。 |
#GP(0) | 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。 |
兼容模式
#UD | 如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 如果使用 CR4.KL=0. 如果使用 CPUID.19H:EBX.AESKLE[0]=0. 如果使用 CR0.EM=1. 如果使用 CR4.OSFXSR=0. |
#NM | 如果 CR0.TS = 1. |
#PF | 如果发生 页面错误 。 |
#GP(0) | 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。 |
64 位模式
#UD | 如果使用 LOCK 前缀,如果使用 CPUID.07H.00H:ECX.KEY_LOCKER[23]=0. 如果使用 CR4.KL=0. 如果使用 CPUID.19H:EBX.AESKLE[0]=0. 如果使用 CR0.EM=1. 如果使用 CR4.OSFXSR=0. |
#NM | 如果 CR0.TS = 1. |
#PF | 如果发生 页面错误 。 |
#GP(0) | 如果 内存操作数 的有效地址位于 CS, DS, ES, FS, 或 GS 区段限制之外, 如果使用 DS, ES, FS, 或 GS 寄存器访问内存, 并包含 NULL 段选择子 。 如果内存地址是非卡通形式 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果引用 SS 段的内存地址是非冠状的 。 |