Intel x86指令中Opcode 0xFF的/2、/3标识含义咨询
哈哈,这个问题我刚学x86汇编的时候也卡过!咱们一步步拆解清楚。
先搞懂
/2、/3 是什么意思 你看到的 FF /2、FF /3 里的数字,是x86指令集里ModR/M字节的「Reg/Opcode字段」值。
x86指令里,有些主操作码(比如这里的FF)属于“扩展操作码”——它本身不完整,需要靠后面紧跟的ModR/M字节里的3位Reg字段来区分具体指令变体。这个字段的十进制值就用/n来表示,比如/2对应二进制010,/3对应011。
拿FF开头的指令举例,不同的/n对应完全不同的操作:
FF /0:INC r/m(递增寄存器或内存中的值)FF /1:DEC r/m(递减寄存器或内存中的值)FF /2:CALL r/m16/32(近调用,目标是寄存器或内存中的近地址)FF /3:CALL r/m16:32(远调用,目标是内存中的远地址,包含段选择子和偏移量)
那你看到的FF 15怎么对应FF /2?咱们拆一下15这个ModR/M字节:15的二进制是00010101,按照ModR/M字节的标准结构(高2位Mod + 中间3位Reg + 低3位R/M):
- 高2位(bit7-6):
00→ Mod字段,表示采用无位移的内存寻址模式 - 中间3位(bit5-3):
010→ 十进制就是2,也就是/2,刚好对应CALL近调用的变体 - 低3位(bit2-0):
101→ R/M字段,结合Mod=00,在32位模式下表示「直接寻址」——也就是后面会紧跟4字节的内存地址,所以FF 15 00 00 00 00实际就是CALL [0x00000000],这就是你看到的示例指令。
2000页手册该找哪部分?
这么厚的手册确实容易懵,直接瞄准这几个核心章节:
- 「Instruction Format」(指令格式):先把这个章节啃透,里面会详细讲解ModR/M字节、SIB字节这些基础指令结构,这是理解所有扩展操作码的前提。
- 「Opcode Map」(操作码映射表):这里会按主操作码分类汇总,所有以
FF开头的指令都会集中列在这里,每个变体对应的/n、功能、寻址模式一目了然。 - 「CALL Instruction」(CALL指令详情):如果要深挖CALL指令的具体行为,直接搜这个章节,里面会拆分不同寻址模式的CALL,包括
FF /2、FF /3对应的执行流程、标志位影响等细节。
另外,很多指令集手册会按操作码数值排序,你直接翻到FF对应的页码,就能快速找到所有FF开头的指令变体,比全局搜索效率高多了。
内容的提问来源于stack exchange,提问作者ShP
相关产品推荐
相关产品推荐

