66H
プレフィックスは、オペランドのサイズを 16 ビットにオーバーライドします。
必要に応じて、アドレスのサイズをオーバーライドしません。67H
すべてのオペランドのリストを次に示します。
F0h = LOCK -- locks memory reads/writes
String prefixes
F3h = REP, REPE
F2h = REPNE
Segment overrides
2Eh = CS
36h = SS
3Eh = DS
26h = ES
64h = FS
65h = GS
Operand override
66h. Changes size of data expected to 16-bit
Address override
67h. Changes size of address expected to 16-bit
ただし、独自の nop 命令を作成するのではなく、推奨される (マルチバイト) nop を使用することをお勧めします。
AMD によると、推奨されるマルチバイト nops は次のとおりです。
表 4-9。NOP 命令の推奨マルチバイト シーケンス
bytes sequence encoding
1 90H NOP
2 66 90H 66 NOP
3 0F 1F 00H NOP DWORD ptr [EAX]
4 0F 1F 40 00H NOP DWORD ptr [EAX + 00H]
5 0F 1F 44 00 00H NOP DWORD ptr [EAX + EAX*1 + 00H]
6 66 0F 1F 44 00 00H NOP DWORD ptr [AX + AX*1 + 00H]
7 0F 1F 80 00 00 00 00H NOP DWORD ptr [EAX + 00000000H]
8 0F 1F 84 00 00 00 00 00H NOP DWORD ptr [AX + AX*1 + 00000000H]
9 66 0F 1F 84 00 00 00 00 00H NOP DWORD ptr [AX + AX*1 + 00000000H]
Intel は最大 3 つの冗長プレフィックスを気にしないため、最大 11 バイトの nop をそのように構築できます。
10 66 66 0F 1F 84 00 00 00 00 00H NOP DWORD ptr [AX + AX*1 + 00000000H]
11 66 66 66 0F 1F 84 00 00 00 00 00H NOP DWORD ptr [AX + AX*1 + 00000000H]
もちろん、通常の命令の前に冗長なプレフィックスを付けることで、nops を排除することもできます。
例えば
rep mov reg,reg //one extra byte
または、同じ命令のより長いバージョンを使用するように CPU に強制します。
test r8d,r8d is one byte longer than: test edx,edx
即値オペランドを持つ命令には、短いバージョンと長いバージョンがあります。
and edx,7 //short
and edx,0000007 //long
ほとんどのアセンブラは、すべての命令を短縮してくれるので、長い命令は自分でコーディングする必要があります。db
これらを戦略的な場所に散在させることで、nop のデコードまたは実行による遅延を招くことなく、ジャンプ ターゲットを整列させることができます。
ほとんどの CPU で実行中の nop は、依然としてリソースを使い果たしていることに注意してください。