.data
val1 BYTE 10h
val2 WORD 8000h
val3 DWORD 0FFFFh
val4 WORD 7FFFh
如果使用ADD指令将val2增加1,那么Carry和Sign标志的值将是什么?
如果使用ADD指令将val4增加1,那么Overflow和Sign标志的值将是什么?
我回答了这两个问题,但都回答错误。为什么答案是它们呢?
.data
val1 BYTE 10h
val2 WORD 8000h
val3 DWORD 0FFFFh
val4 WORD 7FFFh
如果使用ADD指令将val2增加1,那么Carry和Sign标志的值将是什么?
如果使用ADD指令将val4增加1,那么Overflow和Sign标志的值将是什么?
我回答了这两个问题,但都回答错误。为什么答案是它们呢?
将其想象成一种模拟时钟。在实际时钟中,“六点五十五分”(55)和“七点前五分”(-5)是相同的。这只是您定义的问题,时钟本身并不知道您的定义,会不停地转动...... CPU也是如此。请看下面的“CPU时钟”:
我选择了一个4位时钟,但对于每组其他位(BYTE、WORD、DWORD等),原理都是相同的。
在时钟从15跳到0之后,进位标志将被设置。在这种情况下,它是无符号溢出的标志。
当时钟从7跳到-8时,溢出标志将被设置。它标记有符号溢出。
符号标志标记可解释为负数的值。
如果向下计数,则标志的行为略有不同:
尝试总结大部分评论中讨论的内容...
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)1. 指定平台标志可以在不同的平台上设置不同的值。
2. 同时,使用的指令有多少位宽?
8000h
+0001h
------
8001h -> Carry=0,Sign16=1
7FFFh
+0001h
------
8000h -> Carry=0,Sign16=1