Overflow flag setting explanation

In Kip Irwin's book, he talks about the mechanism for setting the overflow flag, he writes:

The processor uses an interesting mechanism to determine the state of a stream overflow after an addition or subtraction operation. The Carry flag is an exclusive ORed with a high share of results. The resulting value is placed in the upper flag.

I wrote a simple program that shows that adding 5 to 127 in the al register sets an overflow flag:

0111 1111 + 0000 0101 = 1000 0100 carry flag = 0, high bit = 1, overflow = 1

However, adding 5 to 255 in the al-register does not set the overflow flag:

1111 1111 + 0000 0101 = 0000 0100 carry flag = 1, high bit = 0, overflow = 0

Why is the overflow flag set in the second example not a conditional statement, i.e. carry flag = 1 and high bit = 0?

+4
3

, 255 + 5, , . -1 + 5, 4. : . @Jester, .

8086 :

, 6 7 ( ), Carry. , 6 7, .

:

XOR- 7 ( ).

1 ( Carry), , , b7 0.

+7

, / 3 .

#include <stdio.h>
int main ( void )
{
    unsigned int ra;
    unsigned int rb;
    unsigned int rc;
    unsigned int rd;
    unsigned int re;
    unsigned int cy;
    unsigned int ov;
    unsigned int ovx;
    unsigned int ovy;
    int sa;
    int sb;
    int sc;
    int sd;
    for(ra=0;ra<8;ra++)
    {
        for(rb=0;rb<8;rb++)
        {
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
            printf(" :");
            if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
            if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
            sc = sa + sb;
            //printf("%u(%2d) + %u(%2d)",ra,sa,rb,sb);
            printf("%2d + %2d = %2d",sa,sb,sc);
            printf("  :");
            rc=rb;
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
            printf(" + 0 = ");
            rd=ra+rc+0;
            if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
            re=(ra&3)+(rc&3)+0;
            ov=0;
            if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
            ovy=0;
            if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
            ovx = ((rd>>3)&1) ^ ((re>>2)&1);
            printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
            printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
            if(sc>3) printf("X");
            if(sc<(-4)) printf("X");
            printf("\n");
        }
    }
    for(ra=0;ra<8;ra++)
    {
        for(rb=0;rb<8;rb++)
        {
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" - ");
            printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
            printf(" :");
            if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
            if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
            sc = sa - sb;
            //printf("%u(%2d) - %u(%2d)",ra,sa,rb,sb);
            printf("%2d - %2d = %2d",sa,sb,sc);
            printf(" : ");
            rc=(~rb)&7;
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
            printf(" + 1 = ");
            rd=ra+rc+1;
            if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
            re=(ra&3)+(rc&3)+1;
            ov=0;
            if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
            ovx = ((rd>>3)&1) ^ ((re>>2)&1);
            ovy=0;
            if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
            printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
            printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
            sc = sa - sb;
            if(sc>3) printf("X");
            if(sc<(-4)) printf("X");
            printf("\n");
        }
    }
}

000 + 000 : 0 +  0 =  0  :000 + 000 + 0 = 000 C 0 O 0 0 0 
000 + 001 : 0 +  1 =  1  :000 + 001 + 0 = 001 C 0 O 0 0 0 
000 + 010 : 0 +  2 =  2  :000 + 010 + 0 = 010 C 0 O 0 0 0 
000 + 011 : 0 +  3 =  3  :000 + 011 + 0 = 011 C 0 O 0 0 0 
000 + 100 : 0 + -4 = -4  :000 + 100 + 0 = 100 C 0 O 0 0 0 
000 + 101 : 0 + -3 = -3  :000 + 101 + 0 = 101 C 0 O 0 0 0 
000 + 110 : 0 + -2 = -2  :000 + 110 + 0 = 110 C 0 O 0 0 0 
000 + 111 : 0 + -1 = -1  :000 + 111 + 0 = 111 C 0 O 0 0 0 
001 + 000 : 1 +  0 =  1  :001 + 000 + 0 = 001 C 0 O 0 0 0 
001 + 001 : 1 +  1 =  2  :001 + 001 + 0 = 010 C 0 O 0 0 0 
001 + 010 : 1 +  2 =  3  :001 + 010 + 0 = 011 C 0 O 0 0 0 
001 + 011 : 1 +  3 =  4  :001 + 011 + 0 = 100 C 0 O 1 1 1 X
001 + 100 : 1 + -4 = -3  :001 + 100 + 0 = 101 C 0 O 0 0 0 
001 + 101 : 1 + -3 = -2  :001 + 101 + 0 = 110 C 0 O 0 0 0 
001 + 110 : 1 + -2 = -1  :001 + 110 + 0 = 111 C 0 O 0 0 0 
001 + 111 : 1 + -1 =  0  :001 + 111 + 0 = 000 C 1 O 0 0 0 
010 + 000 : 2 +  0 =  2  :010 + 000 + 0 = 010 C 0 O 0 0 0 
010 + 001 : 2 +  1 =  3  :010 + 001 + 0 = 011 C 0 O 0 0 0 
010 + 010 : 2 +  2 =  4  :010 + 010 + 0 = 100 C 0 O 1 1 1 X
010 + 011 : 2 +  3 =  5  :010 + 011 + 0 = 101 C 0 O 1 1 1 X
010 + 100 : 2 + -4 = -2  :010 + 100 + 0 = 110 C 0 O 0 0 0 
010 + 101 : 2 + -3 = -1  :010 + 101 + 0 = 111 C 0 O 0 0 0 
010 + 110 : 2 + -2 =  0  :010 + 110 + 0 = 000 C 1 O 0 0 0 
010 + 111 : 2 + -1 =  1  :010 + 111 + 0 = 001 C 1 O 0 0 0 
011 + 000 : 3 +  0 =  3  :011 + 000 + 0 = 011 C 0 O 0 0 0 
011 + 001 : 3 +  1 =  4  :011 + 001 + 0 = 100 C 0 O 1 1 1 X
011 + 010 : 3 +  2 =  5  :011 + 010 + 0 = 101 C 0 O 1 1 1 X
011 + 011 : 3 +  3 =  6  :011 + 011 + 0 = 110 C 0 O 1 1 1 X
011 + 100 : 3 + -4 = -1  :011 + 100 + 0 = 111 C 0 O 0 0 0 
011 + 101 : 3 + -3 =  0  :011 + 101 + 0 = 000 C 1 O 0 0 0 
011 + 110 : 3 + -2 =  1  :011 + 110 + 0 = 001 C 1 O 0 0 0 
011 + 111 : 3 + -1 =  2  :011 + 111 + 0 = 010 C 1 O 0 0 0 
100 + 000 :-4 +  0 = -4  :100 + 000 + 0 = 100 C 0 O 0 0 0 
100 + 001 :-4 +  1 = -3  :100 + 001 + 0 = 101 C 0 O 0 0 0 
100 + 010 :-4 +  2 = -2  :100 + 010 + 0 = 110 C 0 O 0 0 0 
100 + 011 :-4 +  3 = -1  :100 + 011 + 0 = 111 C 0 O 0 0 0 
100 + 100 :-4 + -4 = -8  :100 + 100 + 0 = 000 C 1 O 1 1 1 X
100 + 101 :-4 + -3 = -7  :100 + 101 + 0 = 001 C 1 O 1 1 1 X
100 + 110 :-4 + -2 = -6  :100 + 110 + 0 = 010 C 1 O 1 1 1 X
100 + 111 :-4 + -1 = -5  :100 + 111 + 0 = 011 C 1 O 1 1 1 X
101 + 000 :-3 +  0 = -3  :101 + 000 + 0 = 101 C 0 O 0 0 0 
101 + 001 :-3 +  1 = -2  :101 + 001 + 0 = 110 C 0 O 0 0 0 
101 + 010 :-3 +  2 = -1  :101 + 010 + 0 = 111 C 0 O 0 0 0 
101 + 011 :-3 +  3 =  0  :101 + 011 + 0 = 000 C 1 O 0 0 0 
101 + 100 :-3 + -4 = -7  :101 + 100 + 0 = 001 C 1 O 1 1 1 X
101 + 101 :-3 + -3 = -6  :101 + 101 + 0 = 010 C 1 O 1 1 1 X
101 + 110 :-3 + -2 = -5  :101 + 110 + 0 = 011 C 1 O 1 1 1 X
101 + 111 :-3 + -1 = -4  :101 + 111 + 0 = 100 C 1 O 0 0 0 
110 + 000 :-2 +  0 = -2  :110 + 000 + 0 = 110 C 0 O 0 0 0 
110 + 001 :-2 +  1 = -1  :110 + 001 + 0 = 111 C 0 O 0 0 0 
110 + 010 :-2 +  2 =  0  :110 + 010 + 0 = 000 C 1 O 0 0 0 
110 + 011 :-2 +  3 =  1  :110 + 011 + 0 = 001 C 1 O 0 0 0 
110 + 100 :-2 + -4 = -6  :110 + 100 + 0 = 010 C 1 O 1 1 1 X
110 + 101 :-2 + -3 = -5  :110 + 101 + 0 = 011 C 1 O 1 1 1 X
110 + 110 :-2 + -2 = -4  :110 + 110 + 0 = 100 C 1 O 0 0 0 
110 + 111 :-2 + -1 = -3  :110 + 111 + 0 = 101 C 1 O 0 0 0 
111 + 000 :-1 +  0 = -1  :111 + 000 + 0 = 111 C 0 O 0 0 0 
111 + 001 :-1 +  1 =  0  :111 + 001 + 0 = 000 C 1 O 0 0 0 
111 + 010 :-1 +  2 =  1  :111 + 010 + 0 = 001 C 1 O 0 0 0 
111 + 011 :-1 +  3 =  2  :111 + 011 + 0 = 010 C 1 O 0 0 0 
111 + 100 :-1 + -4 = -5  :111 + 100 + 0 = 011 C 1 O 1 1 1 X
111 + 101 :-1 + -3 = -4  :111 + 101 + 0 = 100 C 1 O 0 0 0 
111 + 110 :-1 + -2 = -3  :111 + 110 + 0 = 101 C 1 O 0 0 0 
111 + 111 :-1 + -1 = -2  :111 + 111 + 0 = 110 C 1 O 0 0 0 
000 - 000 : 0 -  0 =  0 : 000 + 111 + 1 = 000 C 1 O 0 0 0 
000 - 001 : 0 -  1 = -1 : 000 + 110 + 1 = 111 C 0 O 0 0 0 
000 - 010 : 0 -  2 = -2 : 000 + 101 + 1 = 110 C 0 O 0 0 0 
000 - 011 : 0 -  3 = -3 : 000 + 100 + 1 = 101 C 0 O 0 0 0 
000 - 100 : 0 - -4 =  4 : 000 + 011 + 1 = 100 C 0 O 1 1 1 X
000 - 101 : 0 - -3 =  3 : 000 + 010 + 1 = 011 C 0 O 0 0 0 
000 - 110 : 0 - -2 =  2 : 000 + 001 + 1 = 010 C 0 O 0 0 0 
000 - 111 : 0 - -1 =  1 : 000 + 000 + 1 = 001 C 0 O 0 0 0 
001 - 000 : 1 -  0 =  1 : 001 + 111 + 1 = 001 C 1 O 0 0 0 
001 - 001 : 1 -  1 =  0 : 001 + 110 + 1 = 000 C 1 O 0 0 0 
001 - 010 : 1 -  2 = -1 : 001 + 101 + 1 = 111 C 0 O 0 0 0 
001 - 011 : 1 -  3 = -2 : 001 + 100 + 1 = 110 C 0 O 0 0 0 
001 - 100 : 1 - -4 =  5 : 001 + 011 + 1 = 101 C 0 O 1 1 1 X
001 - 101 : 1 - -3 =  4 : 001 + 010 + 1 = 100 C 0 O 1 1 1 X
001 - 110 : 1 - -2 =  3 : 001 + 001 + 1 = 011 C 0 O 0 0 0 
001 - 111 : 1 - -1 =  2 : 001 + 000 + 1 = 010 C 0 O 0 0 0 
010 - 000 : 2 -  0 =  2 : 010 + 111 + 1 = 010 C 1 O 0 0 0 
010 - 001 : 2 -  1 =  1 : 010 + 110 + 1 = 001 C 1 O 0 0 0 
010 - 010 : 2 -  2 =  0 : 010 + 101 + 1 = 000 C 1 O 0 0 0 
010 - 011 : 2 -  3 = -1 : 010 + 100 + 1 = 111 C 0 O 0 0 0 
010 - 100 : 2 - -4 =  6 : 010 + 011 + 1 = 110 C 0 O 1 1 1 X
010 - 101 : 2 - -3 =  5 : 010 + 010 + 1 = 101 C 0 O 1 1 1 X
010 - 110 : 2 - -2 =  4 : 010 + 001 + 1 = 100 C 0 O 1 1 1 X
010 - 111 : 2 - -1 =  3 : 010 + 000 + 1 = 011 C 0 O 0 0 0 
011 - 000 : 3 -  0 =  3 : 011 + 111 + 1 = 011 C 1 O 0 0 0 
011 - 001 : 3 -  1 =  2 : 011 + 110 + 1 = 010 C 1 O 0 0 0 
011 - 010 : 3 -  2 =  1 : 011 + 101 + 1 = 001 C 1 O 0 0 0 
011 - 011 : 3 -  3 =  0 : 011 + 100 + 1 = 000 C 1 O 0 0 0 
011 - 100 : 3 - -4 =  7 : 011 + 011 + 1 = 111 C 0 O 1 1 1 X
011 - 101 : 3 - -3 =  6 : 011 + 010 + 1 = 110 C 0 O 1 1 1 X
011 - 110 : 3 - -2 =  5 : 011 + 001 + 1 = 101 C 0 O 1 1 1 X
011 - 111 : 3 - -1 =  4 : 011 + 000 + 1 = 100 C 0 O 1 1 1 X
100 - 000 :-4 -  0 = -4 : 100 + 111 + 1 = 100 C 1 O 0 0 0 
100 - 001 :-4 -  1 = -5 : 100 + 110 + 1 = 011 C 1 O 1 1 1 X
100 - 010 :-4 -  2 = -6 : 100 + 101 + 1 = 010 C 1 O 1 1 1 X
100 - 011 :-4 -  3 = -7 : 100 + 100 + 1 = 001 C 1 O 1 1 1 X
100 - 100 :-4 - -4 =  0 : 100 + 011 + 1 = 000 C 1 O 0 0 0 
100 - 101 :-4 - -3 = -1 : 100 + 010 + 1 = 111 C 0 O 0 0 0 
100 - 110 :-4 - -2 = -2 : 100 + 001 + 1 = 110 C 0 O 0 0 0 
100 - 111 :-4 - -1 = -3 : 100 + 000 + 1 = 101 C 0 O 0 0 0 
101 - 000 :-3 -  0 = -3 : 101 + 111 + 1 = 101 C 1 O 0 0 0 
101 - 001 :-3 -  1 = -4 : 101 + 110 + 1 = 100 C 1 O 0 0 0 
101 - 010 :-3 -  2 = -5 : 101 + 101 + 1 = 011 C 1 O 1 1 1 X
101 - 011 :-3 -  3 = -6 : 101 + 100 + 1 = 010 C 1 O 1 1 1 X
101 - 100 :-3 - -4 =  1 : 101 + 011 + 1 = 001 C 1 O 0 0 0 
101 - 101 :-3 - -3 =  0 : 101 + 010 + 1 = 000 C 1 O 0 0 0 
101 - 110 :-3 - -2 = -1 : 101 + 001 + 1 = 111 C 0 O 0 0 0 
101 - 111 :-3 - -1 = -2 : 101 + 000 + 1 = 110 C 0 O 0 0 0 
110 - 000 :-2 -  0 = -2 : 110 + 111 + 1 = 110 C 1 O 0 0 0 
110 - 001 :-2 -  1 = -3 : 110 + 110 + 1 = 101 C 1 O 0 0 0 
110 - 010 :-2 -  2 = -4 : 110 + 101 + 1 = 100 C 1 O 0 0 0 
110 - 011 :-2 -  3 = -5 : 110 + 100 + 1 = 011 C 1 O 1 1 1 X
110 - 100 :-2 - -4 =  2 : 110 + 011 + 1 = 010 C 1 O 0 0 0 
110 - 101 :-2 - -3 =  1 : 110 + 010 + 1 = 001 C 1 O 0 0 0 
110 - 110 :-2 - -2 =  0 : 110 + 001 + 1 = 000 C 1 O 0 0 0 
110 - 111 :-2 - -1 = -1 : 110 + 000 + 1 = 111 C 0 O 0 0 0 
111 - 000 :-1 -  0 = -1 : 111 + 111 + 1 = 111 C 1 O 0 0 0 
111 - 001 :-1 -  1 = -2 : 111 + 110 + 1 = 110 C 1 O 0 0 0 
111 - 010 :-1 -  2 = -3 : 111 + 101 + 1 = 101 C 1 O 0 0 0 
111 - 011 :-1 -  3 = -4 : 111 + 100 + 1 = 100 C 1 O 0 0 0 
111 - 100 :-1 - -4 =  3 : 111 + 011 + 1 = 011 C 1 O 0 0 0 
111 - 101 :-1 - -3 =  2 : 111 + 010 + 1 = 010 C 1 O 0 0 0 
111 - 110 :-1 - -2 =  1 : 111 + 001 + 1 = 001 C 1 O 0 0 0 
111 - 111 :-1 - -1 =  0 : 111 + 000 + 1 = 000 C 1 O 0 0 0

( - )

011 + 001 : 3 +  1 =  4  :011 + 001 + 0 = 100 C 0 O 1 1 1 X

1 + 3 (001 + 011) = 100, -4, 1 + 3 = -4, , + 4 . x86 8- 127 + 1 (0x7F + 0x01). , 128 ( ) 126 + 2, 125 + 3 124 + 4 . .

010 + 010 : 2 +  2 =  4  :010 + 010 + 0 = 100 C 0 O 1 1 1 X

. 1. , c = a-b c = a + (-b), , , c = a + ((~ b) +1 ) c = a + ~ b + 1. c = a + b + 0. 1 0 lsbit.

: c = a + b + cin, c = a + ~ b + ~ cin. . , ( , x86 ), "" "" . , ( cin sbb)

(?).

    ov=0;
    if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
    ovx = ((rd>>3)&1) ^ ((re>>2)&1);
    ovy=0;
    if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;

ov , , , msbit .

ovx - msbit

ovy - , , , N + 1 ( 32- , ? , , msbits).

X , , . true () (). , , -4 +3 - +3 , -4, X , , .

, , , , , . ( ) ( ) , HDL ( , vs )

booloean, , , , , .

+3

Well, one of the things that I saw in your numbers is the number "0111 1111" + "0000 0101" are both positive, because the first digit on the left side is 0, but in the second example, the first number "1111 1111" means that it is negative, and the second is “0000 0101”, which also means that it is positive! Remember: OF (overflow flag), when it is set, both numbers have the same sign. in the second, due to 2 differences, the sign of the numbers OF = 0;

0
source

Source: https://habr.com/ru/post/1614781/


All Articles