|
指令格式
ASCII表
legacy prefix 分類(lèi)(1) operand size override prefix:66H --- 改變操作數(shù)大小
(2) address size override preifx:67H --- 改變操作數(shù)地址模式
(3) segment override prefix:改變 memory 操作數(shù)段選擇子,包括:
- 2E --- CS register
- 3E --- DS register
- 26 --- ES register
- 64 --- FS register
- 65 --- GS register
- 36 --- SS register
(4) rep/repz prefix:F3H --- 串指字重復(fù)執(zhí)行
(5) repnz prefix:F2H --- 串指字重復(fù)執(zhí)行
(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 時(shí),有 3 種 effective operand size 外,其它都是 2 種 effective operand size
表中:--- 表示無(wú)需 prefix,REX.W = 1 表示:調(diào)整到 64 位(REX.W = 0 它是使用 default operand size)
* 標(biāo)注處的 default operand size = 64 只有少數(shù)的指令 default operand size 是 64 位,大部分指令的 default 是 32 位的。
在 1 個(gè)字節(jié)的空間里:00 ~ FF,Prefix 與 Opcode 共同占用這個(gè)空間。
由于 x86/x64 是 CISC 架構(gòu),指令不定長(zhǎng)。解碼器解碼的唯一途徑就是按指令編碼的序列進(jìn)行解碼,關(guān)鍵是第 1 字節(jié)是什么? 如:遇到 66h,它就是 prefix,遇到 89h,它就是 Opcode。
Prefix 與 Opcode 共享空間的原因是:Prefix 是可選的。在編碼序列里,只有 Opcode 是不可缺少的,其它都是可選。這就決定了指令編碼中的第 1 個(gè)字節(jié)對(duì)解碼工作的重要性。
|
除了 1 個(gè)字節(jié)的 Opcode 外,還有 2 個(gè)字節(jié)的 Opcode 以及 3 個(gè)字節(jié)的 Opcode,第 2 個(gè) Opcode 碼是由 0F 字節(jié)進(jìn)行引導(dǎo),這個(gè) 0F 被稱(chēng)為 escape prefix。即:2 個(gè)字節(jié)的 Opcode 碼,其第 1 個(gè) Opcode 必定是 0F 字節(jié)。
- 在 16 位模式下
- 當(dāng) default operand size 是 16 位時(shí):需要調(diào)整為 32 位,需要加 66H prefix
- 當(dāng) default operand size 是 32 位時(shí):需要調(diào)整為 16 位,需要加 66H prefix
- 在 32 位模式下
- 當(dāng) default operand size 是 16 位時(shí):需要調(diào)整為 32 位,需要加 66H prefix
- 當(dāng) default operand size 是 32 位時(shí):需要調(diào)整為 16 位,需要加 66H prefix
- 在 64 位模式下
- 當(dāng) default operand size 是 32 位時(shí):需要調(diào)整為 16 位時(shí),需要加 66H prefix。需要調(diào)整到 64 位時(shí),需要加 REX prefix
- 當(dāng) default operand size 是 64 位時(shí): 不能調(diào)整到 32 位,調(diào)整到 16 位時(shí),需要 66H prefix
在 64 位的 default operand size 下,effective 只有 2 種:16 位和 64 位。因此:只能使用 66H prefix 調(diào)整到 16 位,不能調(diào)整到 32 位
1.1 escape prefix x86/x64 平臺(tái)上的 3 個(gè)字節(jié)的 Opcode 碼是通過(guò) escape prefix + opcode 形式。
這些 escape prefix 可以理解為:引導(dǎo)性的 prefix,這些 prefix 可以說(shuō)是 opcode 的一部分。
這些 escape prefix(引導(dǎo) prefix)是:
3 個(gè)字節(jié)的 Opcode 用于 SIMD 指令上(SSE1 ~ SSE4 系列,AVX 指令以及 XOP 指令)
1.2 SIMD prefix在大多數(shù) SIMD 指令上,SIMD prefix 與 escape prefix 聯(lián)合起來(lái)。
這些 SIMD prefix 包括:
1.3 escape prefix 與 SIMD prefix 總結(jié) --- | 值 | 說(shuō)明 | escape prefix | 0f | 引導(dǎo) 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 |
|
|