-
-
[原创]32位机器指令(二)——1字节长度主操作数
-
发表于:
2011-2-27 11:14
9087
-
[原创]32位机器指令(二)——1字节长度主操作数
看了一遍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]其他
还有一些和段寄存器相关的指令格式,这里就不讲了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!