Intel 64/x86_64/IA-32/x86处理器 - 指令格式(4) - 8086/16位指令操作码字节

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/86593761

第一字节(BYTE1)

指令定义了处理器要执行的操作,例如ADD,XOR,HLT等。操作码通常位于第一字节,某些指令的操作码会扩展到第二字节(即ModR/M字节)的REG域,故有时候REG域也被称为REG/Opcode域,用来指出该域的两种用途。

绝大多数的指令的第一字节的高6个比特位(即BYTE1[7:2])是操作码,BYTE1[1]是D标志位,指明操作的方向,BYTE1[0]是W标志位,指示操作数的宽度。

标志位

含义

D

0

ModR/M字节的REG域是源操作数

1

ModR/M字节的REG域是目标操作数

扫描二维码关注公众号,回复: 5091970 查看本文章

W

0

指示指令是字节操作

 

1

指示指令是字操作

 

 

 

 

 

 

D/W标志位示例

上图是ADD指令的其中4种格式。从第一字节可以看出,ADD指令的操作码是000000(即高6比特位),D/W标志位各不相同,分别指示不同的操作数和不同的操作数宽度。第一字节分别是00H,01H,02H,03H,对应的二进制编码也已经列出。

第一条指令的第一字节00H中,W标志位是0,说明在对字节进行操作,即操作数是8比特长;D标志位是0,说明在REG域是源操作数。与最后一列的汇编代码含义正好相符:将8位的REG8加到8位REG8/MEM8上。

第二条指令的第一字节01H中,W标志位是1,说明操作数是16比特长;D标志位是0,说明REG是源操作数。与最后一列的汇编代码正好相符:将16位的REG16加到REG16/MEM16上。

第三条指令的第一字节02H中,W是0,说明是字节操作数,D是1,说明REG是目标操作数。与最后一列的汇编代码正好相符:将8位的REG8/MEM8加到8位的REG8中。

第四条指令03H中,W和D都是1,说明是将16位的REG16/MEM16加到16位的REG16上,也与最后一列的汇编代码相符。

除了D/W标志位,某些指令格式中还会使用S,V,Z标志位。在算术指令中,S位与W位联合指明立即数是否是符号扩展的。在移位和循环移位指令中,V标志位用于指明是单比特操作还是多比特操作。在条件重复和循环指令中,Z标志位指明其与标志寄存器中的零标志位进行比较。

标志位

含义

S

0

不做符号扩展

1

如果W=1,则将8位的立即数符号扩展为16位

 

 

 

 

S位的示例

ADD/ADC/SUB/SBB/CMP指令

V标志位

标志位

含义

V

0

移位/循环移位指令的计数次数是1

1

移位/循环移位指令的计数次数由CL寄存器指定

 

 

 

 

V标志的示例

Todo,添加指令示例

Z标志位

标志位

含义

Z

0

当标志寄存器的零标志位为0则持续循环

1

当标志寄存器的零标志位为1则持续循环

 

 

 

 

Z标志位示例

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/86593761