Flagi procesora

0

Mam działanie (-5) + 7
Po tym działaniu flagi procesora ustawią się na:
Z - 0, S - 0, C - 0, O - 0?
A dla (-7) + 5
Z - 0, S - 1, C - 0, O - 0?

Jeżeli źle to prosiłbym o przykłady. Nie rozumiem jak działa flaga O i C, prosił bym o wytłumaczenie

1

Nie wiem, jak jest w innych procesorach, ale w 8051 i Z80 działanie jest następujące w pseudokodzie, gdzie do rejestru A dodaje lub odejmuje się wartość Val, a C ma wartość 0 lub 1 ustalana na podstawie flagi C w momencie wejścia do funkcji. Obie wartości przy odczycie są traktowane jako liczba 8-bitowa bez znaku, a potem zamieniane na int:

Dodawanie:

    if ((A + Val) > 255)
    {
        FlagC = 1;
        if (((A & 127) + (Val & 127) + C) < 128)
        {
            FlagOV = 1;
        }
        else
        {
            FlagOV = 0;
        }
    }
    else
    {
        FlagC = 0;
        if (((A & 127) + (Val & 127) + C) < 128)
        {
            FlagOV = 0;
        }
        else
        {
            FlagOV = 1;
        }
    }

Odejmowanie:

    if ((A - Val) < 0)
    {
        FlagC = 1;
        if (((Val + C) & 127) > (A & 127))
        {
            FlagOV = 0;
        }
        else
        {
            FlagOV = 1;
        }
    }
    else
    {
        FlagC = 0;
        if (((Val + C) & 127) > (A & 127))
        {
            FlagOV = 1;
        }
        else
        {
            FlagOV = 0;
        }
    }

Generalnie, posiadam napisany przez siebie emulator DSM-51 (procesor 8051) i emulator CA80 (procesor Z80), w obu emulatorach przy dodawaniu i odejmowaniu flago C i OV (w Z80 nie ma OV, natomiast P raz zapamiętuje parzystość, a raz zapamiętuje przepełnienie). Dokładnie, to algorytm napisałem na potrzeby emulatora DSM-51, a później zaczerpnąłem do CA80. W emulatorze DSM-51 uruchamiałem dużo programów napisanych w C i działały poprawnie. W obu emulatorach uruchamiałem różne programy, które działały poprawnie i nie stwierdziłem błędów spowodowanych błędnym ustawianiem flag C i P/OV przy dodawaniu i odejmowaniu.

0

Nie chodzi mi o kod tylko ogólnie jak to działa.
Z wiki dla flagi C:

Wskazuje, że wynik operacji zawiera się w większej niż dostępna liczbie bitów (flaga ta może być ustawiona przed operacjami arytmetycznymi jako dodatkowy argument pewnych instrukcji, np. „dodawania z przeniesieniem”).

Kiedy bd miał 1 a kiedy 0. I co to jest dodawanie z przeniesieniem

2

@shimizu wyobraź sobie że dodajesz liczby 1 bitowe i na wynik też masz raptem 1 bit.
0+0 = 0 ok
1+0 = 1 ok
0+1 = 1 ok
1+1 = ? i brakło miejsca :( ale nic to, bo flaga carry ustawi sie na 1 wskazując na to że masz 1 bit przeniesienia.

Gdzie tu sens? Ano jak sie zastanowisz to zauważysz że do zapisania wyniku dodawania dwóch liczb X-bitowych możesz potrzebować w pesymistycznym przypadku właśnie X+1 bitów, jeśli np. jeden ze składników miał same bity 1 a drugi jakieś niezerowe.

0

-5 w U2 to bd 1111 1001
7 w U2 to bd 0000 0101
(na szybko przepisuje a nie bd sprawdzał)

czyli po dodaniu 1 0000 0010 i dlatego ze ta jedynka wyskoczył przed to flaga C bd 1. Tak?
@Shalom po raz kolejny mi pomagasz. Dzięki Wielkie :)

0

@shimizu nie chce mi sie sprawdzać czy dobrze policzyłeś, ale o to właśne chodzi ;)

0

a mam jeszcze pytanie na temat flagi O (nadmiar) w tym przypadku tez bd równa jeden?

1

Bardzo możliwe że tak ;) Overflow oznacza że "przekęciła" ci się liczba i jest związane z systemami liczbowymi gdzie masz liczby dodatnie i ujemne. Wyobraź sobie że masz liczby kodwane w U2 i są to dwie dodatnie liczby. Dodajesz je i może się okazać że obie był dodatnie (więc pierwszy bit był 0!) a teraz ten bit wskoczy na 1 i nagle wynik będzie ujemny co jest lekko nielogiczne. Np.
01 + 01 = 10
Zauważ że nie nastąpiło "carry" ponieważ wszystko nadal mieści się w zakresie naszych 2-bitowych liczb, ale jednak wynik niewątpliwie jest błędny więc ustawi się overflow flag.

1 użytkowników online, w tym zalogowanych: 0, gości: 1