什么条件设置溢出和携带标志?

时间:2015-01-27 06:07:05

标签: assembly binary overflow

我一直在阅读和观看教程,但由于我的导师没有详细介绍,或者她的解释非常模糊,我只会感到更加困惑。

(旗帜中的值仅由我们决定。)

Example 1:


  1010 1010 0100 0101
- 0100 0110 0111 1000
  ___________________
  0110 0011 1100 1101

SF = 0
ZF = 0
PF = 0
CF = 1
OF = 1
AF = 1

为什么CFOF设置为1?根据我的理解,AF是在执行 b3借入时设置的,这意味着&#39}是需要借钱的人。我是对的吗?

Example 2:

  0110 0111 1011 0100
+ 1111 1010 1100 1110
_____________________
1 0110 0010 1000 0010

SF = 0
ZF = 0
PF = 0 
CF = 1 
OF = 1 
AF = 1

这里设置了AF,因为......?我认为AF仅在执行时(或需要借用时)设置?     另外,对于CF,据我所知,如果有一个MSB的进位,它也不能被设置,并且也是一个进位。它像XOR一样工作,只有一个条件可以成立。

这让我困惑了好几天了。是的,我仍然对这些标志如何工作的差异感到困惑,这取决于数字是签名还是未签名,因为我的导师从未向我们提及过。

1 个答案:

答案 0 :(得分:0)

示例1:

mov     ax, 1010101001000101b
mov     bx, 0100011001111000b
sub     ax, bx
  • CF = 0: CF未设置,因为没有从最高有效位(第15位)借入下一个更高位(第16位)。
  • OF = 1: OF用于2k数。当您将示例1中的2个数字解释为2k数字时,则第1个数字为负数,第2个数字为正数。从负数中减去正数就像添加2个负数一样。结果应为负数,但不是=> OF已设定。
  • AF = 1:您从最低半字节(最低4位)借用到下一个半字节(从第3位到第4位,当您调用最低位时位第0位)

       0101
     - 1000 
     ______
      11101
    

示例2:

mov     ax, 0110011110110100b   
mov     bx, 1111101011001110b   
add     ax, bx
  • CF = 1 CF已设置,因为您添加了两个16位数字,结果对于16位而言太大了。它是17位长(寄存器的大小为8,16,32,64位)。
  • OF = 0 OF未设置,因为您添加正2K数和负2k数。因此,您的结果会自动在这两个数字之间,这样就不会是太大或太负2k的数字 - >没有溢出。
  • PF = 1 最低有效字节中有偶数个1(有两个1)。
  • AF = 1 您有从第3位到第4位的进位:

      0100
    + 1110
    ______
     10010
    

以下是英特尔手册的解释:

EFLAGS寄存器的状态标志(位0,2,4,6,7和11)表示算术指令的结果, 例如ADD,SUB,MUL和DIV指令。状态标志功能是:
CF(位0)进位标志 - 设置算术运算是否从结果的最重要位产生进位或借位;否则清除。该标志表示无符号整数运算的溢出条件。它也用于多精度算术 PF(第2位)奇偶校验标志 - 设置结果的最低有效字节是否包含偶数个1位;否则清除。
AF(第4位)调整标志 - 如果算术运算产生结果的第3位的进位或借位,则置位;否则清除。该标志用于二进制编码的十进制(BCD)算术 ZF(第6位)零标志 - 如果结果为零则设置;否则清除。
SF(第7位)符号标志 - 设置等于结果的最高有效位,即有符号整数的符号位。 (0表示正值,1表示负值。)
OF(第11位)溢出标志 - 设置整数结果是否过大,正数或过小的负数(不包括符号位)以适合目标操作数;否则清除。该标志表示有符号整数(二进制补码)算术的溢出条件。