带有不同标志的负值

时间:2017-11-27 20:28:59

标签: assembly flags

我试图了解负值如何与不同的标志一起使用。 使用此代码:

mov ax, 0
add al, 116
sub al, 117

现在我应该写出ZF,CF,OF和SF将会是什么。

  • 零标志为0,因为结果不为零。

  • Carry Flag将为1,因为我必须“借”。

    问题出在工作表中我需要写下为什么Carry Flag将以以下格式打开/关闭:'进位标志将打开/关闭,因为操作的结果是_______(在基数10中),并且这个值超出了8位的数字范围。

我不太明白无符号的结果是什么..

  • 溢出标志我明白它应该关闭但我不明白为什么。

补充2:0001 -> 1110 + 1 -> 1111 = FFh
FF是255,它通过`-127 - 128'的范围,为什么OF关闭?

  • 签署旗帜 - 为什么打开?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

al的结果是1111 1111 base 2 (所有8位都设置为1)。

如果解释它为无符号8位值,则为255 = FFh

如果您解释它是带符号的8位值,则为-1 = -1h

如您所见,al本身的值没有信息,如果它是有符号或无符号值,则只有8位。逻辑意义和类型由代码给出,它以某种方式解释那些8位。

CF是无符号数学相关的,116-117是“1小于0”,这超出了无符号范围(从0开始,所有可能的位大小)。

所以我不确定在你的工作表中写什么..可能是-1,因为这是十进制的结果,它实际上超出了(无符号)8位的范围。然后再次在无符号计算机中,数学0-1对于8位值清零255,因为它们环绕256(或其他位大小的其他2的幂)(8位数学是组256或如何在代数中调用它)然后很好地定义了0-1,结果只是“255”。

所以我对这个提议的句子感到很困惑,如果你在那里写255,那就是正确的结果,但这很符合无符号的8位。它超出了有符号8位值的范围(最多只有+127)。但是对于带符号的8位值,结果-1适合8位,所以...我发现这个措辞不准确,我不确定答案是什么。 CF将打开,因为0 - 1 = 255(缠绕→CF = 1),但255适合8位。这对我来说足够准确。

OF是签名数学相关的。当有符号数学溢出时,它被设置。当你做116 + -117时,那是积极的加负值。两个源值都已在8位有符号范围内(-128 .. + 127)。然后添加带负数的正数可以导致原始值之间的值。如果它们在它们之间,它肯定会再次合法的8位有符号值,所以根本不会发生任何溢出。

如果添加两个负值或两个正值,可能会发生溢出。然后,如果结果具有与任何源值不同的符号,则确实发生溢出(OF = 1)。即阳性+阳性的阴性结果是OF = 1,阴性+阴性的阳性/零结果是OF = 1。每隔一个组合是OF = 0.

在这种特殊情况下,116 + -117 = -1→所有符合8位有符号值都没有任何问题,OF = 0.

SF是最高位的结果,因为无符号8位值0..127在带符号8位中的解释方式相同,但128..255在带符号8位中被解释为-128 ..- 1,其中顶部位是负值信号,其值可以是 - (256 - unsigned_8b_value)。在你的例子中 - (256 - 255)= -1,SF = 1(最高位11111111(顶部=最左边,一个编码值2 7 = 128)。

在之前的问题中,您已经获得了http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt,这很好地解释了这一切?你读完了吗?