`
zhangjia328
  • 浏览: 17967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Opcode小结

F# 
阅读更多

1. opcode前缀——66h”对size of oprand的影响

分为两种情况,oprand的值在寄存器中或者在内存中。

如果oprand的值在寄存器中,那么当default size of oprand = 32bit时,66h使得寄存器被解析为16bit的寄存器,否则,66h使得寄存器被解析为32bit的寄存器。下面是在win32程序中(default size of oprand = 32bit)中的例子:

      8bc3mov eax, ebx

      66 86c3mov ax, bx

如果oprand的值在内存中,那么当default size of oprand = 32bit时,66hoprand由默认的占4个字节改为占2个字节,否则,66hoprand由默认的占2个字节改为占4个字节。下面是在win32程序中(default size of oprand = 32bit)中的例子:

      ff00inc dword ptr [eax]

      66 ff00inc 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

下面是具体的例子:

f7e0mul eax

66 f7e0mul ax

f6e0mul 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] = 1oprand4字节或者2字节,具体取决于default size of oprand以及是否存在前缀66h

[w] = 0oprand1字节。

下面是具体的例子:

f720mul dword ptr [eax]

66 f720mul word ptr [eax]

f620mul byte ptr [eax]

以上是在win32程序中(default size of oprand = 32bit)的结果。指令前缀66h只能使oprand32bit16bit之前进行切换,无法访问内存中1字节的值。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics