|
指令格式
ASCII表
legacy prefix 分类(1) operand size override prefix:66H --- 改变操作数大小
(2) address size override preifx:67H --- 改变操作数地址模式
(3) segment override prefix:改变 memory 操作数段选择子,包括:
- 2E --- CS register
- 3E --- DS register
- 26 --- ES register
- 64 --- FS register
- 65 --- GS register
- 36 --- SS register
(4) rep/repz prefix:F3H --- 串指字重复执行
(5) repnz prefix:F2H --- 串指字重复执行
(6) lock prefix: F0H --- LOCK
表 4.3.1
模式 | default operand size | effective operand size | prefix | REX prefix | 描述 | 16 模式 | 16 | 16 | --- | --- | 16 位模式下的 2 种 default operand size 的情形 | 32 | 66H | 32 | 16 | 66H | 32 | --- | 32 模式 | 16 | 16 | --- | --- | 32 位模式下的 2 种 default operand size 的情形 | 32 | 66H | 32 | 16 | 66H | 32 | --- | 64 模式 | 32 | 16 | 66H | --- | 64 位模式下的 2 种 default operand size 情形 | 32 | --- | --- | 64 | --- | REX.W = 1 | * 64 | 16 | 66H | --- | 64 | --- | 每一种模式下都分为 2 种 default operand size 情形,除了 64 位模式下 default operand size 是 32 时,有 3 种 effective operand size 外,其它都是 2 种 effective operand size
表中:--- 表示无需 prefix,REX.W = 1 表示:调整到 64 位(REX.W = 0 它是使用 default operand size)
* 标注处的 default operand size = 64 只有少数的指令 default operand size 是 64 位,大部分指令的 default 是 32 位的。
在 1 个字节的空间里:00 ~ FF,Prefix 与 Opcode 共同占用这个空间。
由于 x86/x64 是 CISC 架构,指令不定长。解码器解码的唯一途径就是按指令编码的序列进行解码,关键是第 1 字节是什么? 如:遇到 66h,它就是 prefix,遇到 89h,它就是 Opcode。
Prefix 与 Opcode 共享空间的原因是:Prefix 是可选的。在编码序列里,只有 Opcode 是不可缺少的,其它都是可选。这就决定了指令编码中的第 1 个字节对解码工作的重要性。
|
除了 1 个字节的 Opcode 外,还有 2 个字节的 Opcode 以及 3 个字节的 Opcode,第 2 个 Opcode 码是由 0F 字节进行引导,这个 0F 被称为 escape prefix。即:2 个字节的 Opcode 码,其第 1 个 Opcode 必定是 0F 字节。
- 在 16 位模式下
- 当 default operand size 是 16 位时:需要调整为 32 位,需要加 66H prefix
- 当 default operand size 是 32 位时:需要调整为 16 位,需要加 66H prefix
- 在 32 位模式下
- 当 default operand size 是 16 位时:需要调整为 32 位,需要加 66H prefix
- 当 default operand size 是 32 位时:需要调整为 16 位,需要加 66H prefix
- 在 64 位模式下
- 当 default operand size 是 32 位时:需要调整为 16 位时,需要加 66H prefix。需要调整到 64 位时,需要加 REX prefix
- 当 default operand size 是 64 位时: 不能调整到 32 位,调整到 16 位时,需要 66H prefix
在 64 位的 default operand size 下,effective 只有 2 种:16 位和 64 位。因此:只能使用 66H prefix 调整到 16 位,不能调整到 32 位
1.1 escape prefix x86/x64 平台上的 3 个字节的 Opcode 码是通过 escape prefix + opcode 形式。
这些 escape prefix 可以理解为:引导性的 prefix,这些 prefix 可以说是 opcode 的一部分。
这些 escape prefix(引导 prefix)是:
3 个字节的 Opcode 用于 SIMD 指令上(SSE1 ~ SSE4 系列,AVX 指令以及 XOP 指令)
1.2 SIMD prefix在大多数 SIMD 指令上,SIMD prefix 与 escape prefix 联合起来。
这些 SIMD prefix 包括:
1.3 escape prefix 与 SIMD prefix 总结 --- | 值 | 说明 | escape prefix | 0f | 引导 opcode | 0f 38 | 0f 3A | SIMD prefix | 66 | SIMD 指令修饰性 prefix | F3 | F2 |
例子:movntdq xmmword ptr [rax], xmm0
这条指令是 SSE2 指令,它 encodes 是:66 0f e7 00
它的 Opcode 是 66 0f e7 (3 bytes opcode),这里 66 是 SIMD prefix,0f 是 escape prefix
表3: 16 位的 ModRM 寻址ModRM.mod | ModRM.r/m | ModRM.r/m 寻址 | 00 | 000 | [bx+si] | 001 | [bx+di] | 010 | [bp+si] | 011 | [bp+di] | 100 | [si] | 101 | [di] | 110 | [disp16] | 111 | [bx] | 01 | 000 | [bx+si+disp8] | 001 | [bx+di+disp8] | 010 | [bp+si+disp8] | 011 | [bp+di+disp8] | 100 | [si+disp8] | 101 | [di+disp8] | 110 | [bp+disp8] | 111 | [bx+disp8] | 10 | 000 | [bx+si+disp16] | 001 | [bx+di+disp16] | 010 | [bp+si+disp16] | 011 | [bp+di+disp16] | 100 | [si+disp16] | 101 | [di+disp16] | 110 | [bp+disp16] | 111 | [bx+disp16] | 11 | 000 | ax | 001 | cx | 010 | dx | 011 | bx | 100 | sp | 101 | bp | 110 | si | 111 | di |
64 位寻址下的 ModRM
ModRM.mod | ModRM.r/m | ModRM.r/m 寻址 | REX.B = 0 | REX.B = 1 | 00 | 000 | [rax] | [r8] | 001 | [rcx] | [r9] | 010 | [rdx] | [r10] | 011 | [rbx] | [r11] | 100 | [SIB] | [SIB] | 101 | [disp32] 或 [rip + disp32] * | [disp32] 或 [rip + disp32] | 110 | [rsi] | [r14] | 111 | [rdi] | [r15] | 01 | 000 | [rax + disp8] | [r8 + disp8] | 001 | [rcx + disp8] | [r9 + disp8] | 010 | [rdx + disp8] | [r10 + disp8] | 011 | [rbx + disp8] | [r11 + disp8] | 100 | [SIB + disp8] | [SIB + disp8] | 101 | [rbp + disp8] | [r13 + disp8] | 110 | [rsi + disp8] | [r14 + disp8] | 111 | [rdi + disp8] | [r15 + disp8] | 10 | 000 | [rax + disp32] | [r8 + disp32] | 001 | [rcx + disp32] | [r9 + disp32] | 010 | [rdx + disp32] | [r10 + disp32] | 011 | [rbx + disp32] | [r11 + disp32] | 100 | [SIB + disp32] | [SIB + disp32] | 101 | [rbp + disp32] | [r13 + disp32] | 110 | [rsi + disp32] | [r14 + disp32] | 111 | [rdi + disp32] | [r15 + disp32] | 11 | 000 | rax | r8 | 001 | rcx | r9 | 010 | rdx | r10 | 011 | rbx | r11 | 100 | rsp | r12 | 101 | rbp | r13 | 110 | rsi | r14 | 111 | rdi | r15 |
|
|