标志寄存器中的符号标志、进位标志和溢出标志(汇编)

3
.data
val1 BYTE 10h
val2 WORD 8000h
val3 DWORD 0FFFFh
val4 WORD 7FFFh

如果使用ADD指令将val2增加1,那么Carry和Sign标志的值将是什么?

如果使用ADD指令将val4增加1,那么Overflow和Sign标志的值将是什么?

我回答了这两个问题,但都回答错误。为什么答案是它们呢?


1
我都回答了。你回答了什么? - Michael
我在第二个问题中再次选择了0。答案显示两个都是1。 - user3682802
这并不影响加法的结果。而符号标志位则根据结果的最高位设置。 - Michael
这本书说:“当算术运算的结果为负数时,标志位被设置为符号标志位。”现在你可以理解我的困惑了。将符号标志位设置为最高有效位有什么好处呢? - user3682802
@Jester,感谢您为此问题设置赏金,以便将其分配给一个值得的答案。我认为rkbh的动画GIF价值千言万语,因此他得到了我的支持。 - Michael Petch
显示剩余6条评论
3个回答

23

将其想象成一种模拟时钟。在实际时钟中,“六点五十五分”(55)和“七点前五分”(-5)是相同的。这只是您定义的问题,时钟本身并不知道您的定义,会不停地转动...... CPU也是如此。请看下面的“CPU时钟”:

CPU-clock (Addition)

我选择了一个4位时钟,但对于每组其他位(BYTE、WORD、DWORD等),原理都是相同的。

在时钟从15跳到0之后,进位标志将被设置。在这种情况下,它是无符号溢出的标志。

当时钟从7跳到-8时,溢出标志将被设置。它标记有符号溢出。

符号标志标记可解释为负数的值。

如果向下计数,则标志的行为略有不同:

CPU-clock (Subtraction)


1

尝试总结大部分评论中讨论的内容...

x86以及我迄今为止见过的所有处理器架构都没有真正意义上的有符号和无符号数字概念。它是的解释决定16位值8000h是+32768(无符号)还是-32768(有符号)。

没有单独的有符号和无符号加减指令;同样,决定7FFFh + 0001h是有效的(无符号)加法,还是溢出(因为7FFFh是16位二进制补码表示法中的最大有符号整数)。

为帮助您作为程序员,算术操作会为两种解释设置标志。完成操作后,测试相应的标志。经验法则:

  • 对于有符号数字,请测试溢出符号标志
  • 对于无符号数字,请测试进位标志;它更像是“无符号溢出”

示例:

  • 7FFFh + 1在有符号情况下会溢出(OF被设置),而无符号情况下不会溢出(CF=0);当有符号时,结果8000h是负数(SF=1)
  • FFFFh + 1在无符号情况下会溢出(CF被设置),而有符号情况下不会溢出(OF=0);结果0000h不是负数(SF=0)

0

1. 指定平台标志可以在不同的平台上设置不同的值。

2. 同时,使用的指令有多少位宽?

 8000h
+0001h
------
 8001h -> Carry=0,Sign16=1

 7FFFh
+0001h
------
 8000h -> Carry=0,Sign16=1
  • 大多数CPU不使用有符号数字,而是使用二进制补码表示

第二个问题要求检查溢出标志,而不是进位标志。 - Michael
是的,抱歉。它仍然显示OF = 1...你在答案中加入了Carry。 - user3682802
太棒了。我已经读了这一章4遍,它从来没有提到过这一点。ALU是inc使用的寄存器吗? - user3682802
1
"如果我没记错的话,加法溢出和进位是一样的。" 实际上并不是这样。当你将两个带有相同符号的数字相加并得到一个带有不同符号的结果时,就会发生溢出。 - Michael
@user3682802:你似乎在关注一些并不重要的事情。如果你有一个字节为0x80,再加上1,结果将是0x81。由于结果的最高位被设置了,所以符号标志将被设置。你想将结果(0x81)视为129还是-127取决于你自己(通过检查不同的标志)。 - Michael
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接