在x86指令集中,索引1处的位可以是指定目标和源操作数的方向位,也可以是符号扩展位。我想知道最简单的逻辑方法是什么,以确定它是哪种情况。有没有办法检查除了检查指令操作码并比较它们以找出它是什么(对于指令的符号扩展或方向位变体)?还有一些指令忽略了这一位,但由于它被设置为0,因此它并不重要。
编辑:事实证明,对于写入错误(这是我的代码所针对的),reg-> r / m始终是这种情况,因为r / m-> reg指令永远不会触发写入错误。但是,如果其他人遇到类似的问题,任何信息仍然会很好。
答案 0 :(得分:2)
[评论回答]。
你显然需要一个指令字节流的布尔公式。我不知道如何轻松定义该公式; x86有一个非常混乱的指令集。我希望关键的技巧是在由前缀字节确定的表中查找操作码字节。如果您正在编写某种反汇编程序,我希望您无论如何都要有这样的表格。
答案 1 :(得分:0)
方向和符号位是x86处理器的标志寄存器的一部分。由于标志的最低8位具有与8080/8085 / Z80的标志相同的布局,我的猜测是索引1处的位是有符号位。自7062年代后期引入8086/88处理器后,方向位的位置没有改变,如果我的记忆能够为我服务的话。
符号位位作为算术运算的结果被修改,并且是操作结果的最高位的副本。 INC和DEC不影响符号位。
使用cld / std指令操作方向位,并控制块指令(cmps,ins,lods,movs,out,scas和stos)后递增/递减。
它们也可以通过堆栈进行操作(尽管这可能对符号位没有意义)
pushf
and dword ptr [esp],SOME_MASK
popf
使用“和”是一个例子:或者,也可以使用xor和其他。
如果您操纵该标志,则可能必须将其恢复为先前的值,因为某些运行时库假定它未被修改。