I386指令集中GRPL指令的作用是什么?如何解析0x83操作码指令?
i386架构
0x83操作码GRPL标识与对应指令解析 83 F8 01指令的真实含义
这条指令在32位模式下是cmp eax, 0x1,16位模式下对应cmp ax, 0x1,拆解逻辑如下:
- 首字节
0x83不是单条指令的独立操作码,是一类组指令的公共前缀,你在映射表看到的GRPL是Group 1 Sign-Extended Byte Immediate的缩写,即「带符号扩展字节立即数的1号操作码组」。 - 第二字节
0xF8是ModR/M寻址字节,按i386的ModR/M结构拆分:- 高2位mod字段值为
11,代表操作数为寄存器类型,无内存偏移 - 中间3位reg字段值为
111,是组指令的二级操作码,对应CMP操作 - 低3位r/m字段值为
000,32位模式下对应eax寄存器,16位模式下对应ax寄存器
- 高2位mod字段值为
- 第三字节
0x01是8位立即数,CPU执行时会先将其符号扩展为当前操作数宽度(16位/32位)再参与运算。
GRPL标识的本质
按字母序翻指令集找不到GRPL对应条目是正常的:
- GRPL不是独立的指令助记符,是Intel为节省操作码空间设计的分组扩展操作码标识。当1字节操作码编码空间不足时,会将一类功能相近的指令共用同一个一级操作码,再借用ModR/M字节中原本用于指定寄存器的3位reg字段作为二级操作码,区分具体要执行的功能。
- 后缀L代表这组指令的立即数为8位长度,执行时会自动符号扩展到当前代码段的默认操作数宽度(字/双字)。同组的其他一级操作码还包括:
0x80对应8位操作数的组1指令、0x81对应立即数本身为字/双字长度的组1指令,三者的二级操作码映射规则完全一致。 - 组1指令的二级操作码对应关系固定:
- reg=0(000):
ADD加法 - reg=1(001):
OR按位或 - reg=2(010):
ADC带进位加法 - reg=3(011):
SBB带借位减法 - reg=4(100):
AND按位与 - reg=5(101):
SUB减法 - reg=6(110):
XOR按位异或 - reg=7(111):
CMP比较
- reg=0(000):
- 其中
CMP指令的执行逻辑和SUB完全一致,区别仅在于不会把减法运算的结果写回目标寄存器,只会根据运算结果更新OF、SF、ZF、AF、PF、CF六个状态标志位,供后续跳转指令判断使用。
正确的资料查询方式
- 查阅i386手册操作码附录时,遇到
Grp1/Grp2/GRPL这类分组标识,不需要去指令集的字母索引里检索,直接翻到操作码附录末尾的「组操作码子映射表」章节,就能查到每个组对应的二级操作码定义、操作数约束。 - 验证未知机器码时,可以直接用汇编器、反汇编工具(如nasm、objdump)对机器码做反汇编,能快速得到对应指令的助记符,再回头对照手册核对执行逻辑,效率远高于纯手工查表。
内容的提问来源于stack exchange,提问作者edian
相关产品推荐
相关产品推荐

