在 x86 指令集中,操作码索引 1 处的位可以是指定目标和源操作数的方向位,也可以是符号扩展位。
例如对于add
00 /r ADD r/m8, r8
与02 /r ADD r8, r/m8
该位区分r/m, reg
与reg, r/m
相同的助记符81 /0 id ADD r/m32, imm32
与83 /0 ib ADD r/m32, imm8
完整(第 1 位清零)与符号扩展立即数(第 1 位设置)
我想知道确定其中哪种情况的最简单的逻辑方法是什么。除了检查指令操作码并比较它们以找出它是什么(对于指令的符号扩展或方向位变体)之外,还有其他方法可以检查吗?还有一些指令忽略该位,但由于它设置为 0,所以它并不重要。
编辑:事实证明,对于写错误(这是我的代码的目的), reg->r/m 总是如此,因为 ar/m->reg 指令永远不会触发写错误。但是,如果其他人遇到类似问题,任何信息仍然会很好。