第一字节(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域是目标操作数 | |
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标志位示例