签名,携带和溢出标志(组装)

时间:2014-06-02 08:16:55

标签: assembly

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

如果使用ADD指令将val2递增1,则进位值将是多少 并签署标志?

如果使用ADD指令将val4加1,那么Over-的值是多少? 流和标志标志?

我回答了两个问题并且错了。为什么答案是什么?

3 个答案:

答案 0 :(得分:13)

想象一下它是一种模拟时钟。在一个真正的时钟中,时间"六五十五" (55)和"五到七" (-5)是相同的。这只是你定义的一个问题,时钟本身并不知道你的定义,而是绕着圆周运行......与CPU一样。请查看以下内容" CPU-clock":

CPU-clock (Addition)

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

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

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

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

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

CPU-clock (Subtraction)

答案 1 :(得分:1)

试图总结大多数评论中已经讨论过的内容......

x86,以及到目前为止我见过的所有其他处理器架构,都没有签名和无符号数字的真实概念。 您的解释确定16位值8000h是+32768(无符号)还是-32768(签名)。

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

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

  • 有签名的号码,测试溢出签名标志
  • 对于无符号数字,请测试进位标志;它或多或少地作为“无符号溢出”

示例:

    签名(OF设置)时
  • 7FFFh + 1溢出,而无符号时(CF = 0)溢出;签名后结果8000h为负(SF = 1)
  • FFFFh + 1在无符号(CF置位)时溢出,而不是在签名时溢出(OF = 0);结果0000h不是负数(SF = 0)

答案 2 :(得分:0)

1.specify平台标志可以在不同的平台上设置不同

2.那么使用的指令有多宽?

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

 7FFFh
+0001h
------
 8000h -> Carry=0,Sign16=1
  • 大多数CPU不处理已签名的数字而是使用2'os补码二进制表示