前缀将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 推荐的多字节 nop 如下:
表 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 个冗余前缀,因此 nop 的最多 11 个字节可以这样构造。
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]
当然,您也可以通过在正常指令前加上冗余前缀来消除 nop。
例如
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 仍然会占用资源。