[英]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时钟”:
我选择了一个4位时钟,但每个其他位组(BYTE,WORD,DWORD等)的原理相同。
在时钟从15跳到0之后,进位标志将被置位。在这种情况下,是无符号溢出的标志。
时钟从7跳到-8后,将设置溢出标志。 它标记有符号的溢出。
符号标志标记可以解释为负数的值。
如果向下计数,标志的行为会略有不同:
试图总结大多数评论中已经讨论过的内容......
x86,以及到目前为止我见过的所有其他处理器架构,都没有签名和无符号数字的真实概念。 您的解释确定16位值8000h
是+32768(无符号)还是-32768(有符号)。
没有单独的有符号和无符号指令可以加减; 再次, 您决定7FFFh + 0001h
是有效(无符号)加法还是溢出(因为7FFFh
是16位二进制补码中的最大有符号整数)。
为了帮助您作为程序员,算术运算为两种解释设置标志。 操作完成后,您将测试相应的标志。 经验法则:
例子:
7FFFh + 1
符号(OF置位)时7FFFh + 1
溢出,而无符号时(CF = 0)溢出; 签名后结果8000h为负(SF = 1) FFFFh + 1
溢出,签名时不溢出(OF = 0); 结果0000h不是负数(SF = 0) 1.specify平台标志可以在不同的平台上设置不同
2.那么使用的指令有多宽?
8000h
+0001h
------
8001h -> Carry=0,Sign16=1
7FFFh
+0001h
------
8000h -> Carry=0,Sign16=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.