回想一下,x86体系结构定义0x0F 0x1F [mod R/M]为多字节NOP。
现在,我看一个8字节NOP的特殊情况:
0x0F 0x1F 0x84 0x__ 0x__ 0x__ 0x__ 0x__
Run Code Online (Sandbox Code Playgroud)
最后5个字节具有任意值。
第三个字节[mod R/M]拆分得到:

mod = 10b:参数为reg1+ DWORD大小的位移reg2 = 000b:(我们不在乎)reg1 = 100b:表示参数改为SIB字节+ DWORD大小的位移。现在,举一个具体的例子
0x0F 0x1F 0x84 0x12 0x34 0x56 0x78 0x9A
Run Code Online (Sandbox Code Playgroud)
我有
SIB = 0x12displacement = 0x9A785634:DWORD现在,我添加0x66指令前缀以指示位移应为WORD而不是DWORD:
0x66 0x0F 0x1F 0x84 0x12 0x34 0x56 0x78 0x9A
Run Code Online (Sandbox Code Playgroud)
我希望0x78 0x9A被“切断”并被视为新的指示。但是,当编译它并objdump在生成的可执行文件上运行时,它仍然使用所有4个字节(一个DWORD)作为位移。
在这种情况下,我是否误解了“位移”的含义?还是0x66前缀对多字节NOP指令没有任何影响?