关于增量,减量和乘法的一些汇编问题

时间:2011-02-12 12:53:01

标签: assembly x86 increment multiplication decrement

我正面临一些问题,因为我正在研究的IA-32装配电子书中没有明确涵盖这些问题:
1 - EFLAGS寄存器状态部分的0位是否受“INC”(递增)和“Dec”(递减)指令影响的状态位中的唯一位,或者奇偶校验位也受影响?<登记/> 2 -mul(无符号整数乘法)指令是否会影响EFLAGS寄存器的状态部分?

最后还有一句话,我不确定我是否清楚明白:
“IMUL指令可以由有符号和无符号整数使用,但必须注意结果不使用目标的最高有效位。对于较大的值,IMUL指令仅对有效值有效。签名整数。“
我的想法是,当你要使用这个指令(有三种格式)进行无符号整数乘法时,操作数应该在它们的最高有效位中为零,所以在这种情况下不使用该位;一旦打算进行有符号整数乘法,操作数将自然地使用最高位作为它们的符号位,所以我是对的吗?

2 个答案:

答案 0 :(得分:2)

许多/大多数指令集引用将告诉您哪些标志受哪些指令的影响,例如: http://home.comcast.net/~fbui/intel.html

有些参考手册在每条指令中都有这些信息,有些参考手册有一个单独的表,其目的是显示哪些标志受影响,哪些标志可能无法告诉您每个指令哪些标志受到影响。

在文档的其他地方你必须找到字母的含义,大多数处理器都是指Z,V,N和C.我上面链接的引用当然使用不同的符号来表示标志,所以你必须找到一张表告诉你哪些标志是哪个,然后查询问题中提到的说明。

包括问题1和2.

对于第三个问题,当你回答“从有符号的角度看有符号和无符号数字之间有什么区别”这个问题时,就会有这样的理解。我发现用2或3位思考是最简单的,知道基本概念可以扩展。因此,例如,考虑3位,如何将位模式0b011解释为无符号位模式,如何将其解释为有符号位模式? 0b111怎么样? 0b001怎么样?和0b101?如果使用无符号数字,0b011乘以0b010会给你什么?签名号码?

如果答案不明显,则记下所有64个三位操作数的组合,计算结果,假设数字被认为是无符号的,然后计算结果,并将数字视为有符号。如果您没有犯错,因为有问题的语句表明是否设置了任一操作数的高位,那么您将无法在有符号和无符号数学之间得到相同的结果。如果高位清零,您将得到相同的结果。原因来自于理解signed vs unsigned的编码或使用另一个术语,twos补充。

现在尝试一些有趣的4位情况(一些有高位设置,少数有没有)并决定你是否得到与4位相同的4位结果,然后可能用计算器尝试一些8或16位数字,并确定规则是否适用于任何位数或是否更改。然后决定你学到的3位数的答案,或者至少澄清了与IA-32 IMUL指令中操作数大小相关的陈述/问题。

答案 1 :(得分:1)

1)否,感染的标志是O,S,Z,A和P.

2)是的,预测的(有用的)标志是O和C,但是标志S,Z,A和P是在IMUL指令不可预测之后。

3)是的,最后一位(MSB)是符号,如果符号为0则数字为正,因此两种数字类型的分区算法相同。