繁体   English   中英

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

[英]Sign, Carry, and Overflow Flag (Assembly)

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

如果使用ADD指令将val2加1,那么进位和符号标志的值是多少?

如果使用ADD指令将val4递增1,那么溢出和符号标志的值是多少?

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

想象一下它是一种模拟时钟。 在真实时钟中,“六五十五”(55)和“五到七”(-5)的时间是相同的。 这只是你定义的一个问题,时钟本身并不知道你的定义并且循环和循环运行......与CPU相同。 看下面的“CPU时钟”:

CPU时钟(加法)

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

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

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

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

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

CPU时钟(减法)

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

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

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

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

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

例子:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM