我试图了解负值如何与不同的标志一起使用。 使用此代码:
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关闭?
感谢您的帮助。
答案 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,这很好地解释了这一切?你读完了吗?