1. “opcode前缀——66h”对size of oprand的影响
分为两种情况,oprand的值在寄存器中或者在内存中。
如果oprand的值在寄存器中,那么当default size of oprand = 32bit时,66h使得寄存器被解析为16bit的寄存器,否则,66h使得寄存器被解析为32bit的寄存器。下面是在win32程序中(default size of oprand = 32bit)中的例子:
8bc3:mov eax, ebx
66 86c3:mov ax, bx
如果oprand的值在内存中,那么当default size of oprand = 32bit时,66h将oprand由默认的占4个字节改为占2个字节,否则,66h将oprand由默认的占2个字节改为占4个字节。下面是在win32程序中(default size of oprand = 32bit)中的例子:
ff00:inc dword ptr [eax]
66 ff00:inc word ptr [eax]
2. “opcode的[w]bit”对size of oprand的影响
分为两种情况,oprand的值在寄存器中或者在内存中。
如果oprand的值在寄存器中,那么:
[w] = 1:寄存器被解析为32bit或者16bit,具体取决于default size of oprand以及是否存在前缀66h。
[w] = 0:寄存器被解析为8bit,即《tutorial of opcode by svin》中的partial registers。
下面是具体的例子:
f7e0:mul eax
66 f7e0:mul ax
f6e0:mul al
以上是在win32程序中(default size of oprand = 32bit)的结果,可以看到,[w]bit和指令前缀66h的区别。指令前缀66h的最用是“use oprand size opposit to default”,而default size of oprand只可能是32bit 或者16bit,所以,仅仅使用指令前缀66h无法访问8bit的寄存器(partial registers)。
如果 oprand的值在内存中,那么:
[w] = 1:oprand占4字节或者2字节,具体取决于default size of oprand以及是否存在前缀66h。
[w] = 0:oprand占1字节。
下面是具体的例子:
f720:mul dword ptr [eax]
66 f720:mul word ptr [eax]
f620:mul byte ptr [eax]
以上是在win32程序中(default size of oprand = 32bit)的结果。指令前缀66h只能使oprand在32bit与16bit之前进行切换,无法访问内存中1字节的值。