看了一遍egogg关于指令格式的文章,他对于主操作码的叙述明显不够,因此,我想把这个部分彻底讲明白。后几章我分别将,如下内容:
1字节长度主操作码
1字节长度主操作码+3bit拓展操作码
2字节长度主操作码
2字节长度主操作码+3bit拓展操作码

     希望通过我的叙述,使你能明白,虽然机器指令与汇编不存在“一对一”的规律,但它们存在非常好的“多对多”的规律。

一、1字节长度主操作码
  本篇文章我的主要说一下“1字节长度主操作码”,这也是各种长度操作码中最为复杂的。
好吧,现在开始。

[1] opcode + d+ w
如图:

    这种指令格式最为常见,因为它对应三种常见汇编形式:
OP Reg,Mem
OP Meg,Reg
OP Reg,Reg
    其中d位表示数据传送方向,这和后文将要说道的Mod R/M字节相关,当d=l时,数据从R/M字段流向reg字段,当d=0时,数据从reg字段流向R/M字段或立即数流向reg。
举例:
  mov eax,[eax]  =8B00  →主操作码8B  =10001011
  mov [eax],eax  =8900  →主操作码89  =10001001
w位用来区分指令8位操作数与32/16位操作数,w=1表示使用16/32位操作数,w=2表示使用8位操作数。
举例:
  Mov eax,eax  =8BC0  →主操作码8B  =10001011
  Mov al,al    =8AC0  →主操作码8A  =10001010

[2] opcode + s+ w
如图:

    这种机器指令也比较常见,它对应汇编格式:Op Reg/Mem,immed
其中s位表示立即数是8位还是16/32位
举例:
  add ebx,12345678H  =83C1 78563412  →主操作码83=10000011

  add ebx,12H        =81C1 12    →主操作码81=10000001

[3] opcode+w
如图:

    这种形式比较常见,对应汇编形式:Op ACC,immed 
    ACC代表eax/ax/al,;immed必须与ACC等长,且不能填0凑出等长

[4] opcode+cond
如图

     这种形式专门对应非条件跳转汇编指令:jxx xxxx,比如 jxx disp8 占用主操作码从01110000至01111111

[5] opcode+reg

    这种形式对应汇编格式:op reg
举例:
  Push eax  =50  →主操作码50 =01010000
  Push ecx  =51  →主操作码51 =01010001
  Push edx  =52  →主操作码52 =01010010
  其中reg代表寄存器。


[6]opcode(8位)
    这种形式一般对应无操作数汇编指令。

[7]opcode(高6)+s+opcode(低1位)
    这种形式一般对应只有一个立即数的汇编指令

[8]其他
  还有一些和段寄存器相关的指令格式,这里就不讲了