CMP und overflow-flag



  • Bin ein Anfänger in Assembler hab nur ein Bisschen was darüber gelesen.
    In welchem Fall würde bei CMP x,y das overflow-flag gesetzt? Ich hab mit vielen zahlen rumexpermentiert aber das overflow-flag war immer auf 0.
    Mit diesem Prog hab ich das getestet:

    void main()
    {
    
        int x=???;
        int y=???;
        int overflow=0;
        __asm
        {
            MOV EAX,x
            MOV EBX,y
            CMP EAX,EBX
    
            JO overflowflag
            JMP ende
    
            overflowflag:
            MOV overflow,1
            ende:
    
        }
    
        printf("overflow-flag: %i",overflow);
    
    }
    

    Für die Fragezeichen hab ich natürlich zahlen eingesetzt 😉

    MfG

    [ Dieser Beitrag wurde am 06.01.2003 um 18:30 Uhr von JokerXXL editiert. ]



  • Tja, gewusst wie 😃
    Cmp ist im Grunde eine Subtraktions-Anweisung, bei der nur die Flags gesetzt und das Ergebnis ignoriert wird.
    Das OverflowFlag wird bei solchen Rechenoperationen bei einem Integer-Overflow gesetzt. (Grenze zwischen -/+ wird nicht bei 0 ueberschritten => bei einem 8Bit short int ist das der uebergang von -128 zu +127 d.h. von 80h zu 7Fh)
    Folglich setzt der 8Bit-Vergleich von 9Eh (1. Operand) und 25h (2. Operand) das OF, da 9Eh-25h = 79h oder signed dezimal: -97 - 37 = +121 😉

    Etwas veraenderter Beispielcode:

    MOV al,0x9E
            MOV bl,0x25
            CMP al,bl
    
            JO overflowflag
            JMP ende
    
            overflowflag:
            MOV overflow,1
            ende:
    


  • Hmm, danke 🙂
    Nächte Frage:
    Es gibt: JA und JG usw...
    Das bedeutet ja dann, dass man vor dem Vergleich wissen muss, ob in den variablen negative oder positive Zahlen stehen.
    Gibt es keine Möglichkeit beliebige Zahl x mit einer beliebigen Zahl y zu vergleichen, ohne dass man weiß, ob sie negativ oder positiv sind?

    MfG



  • Dafür müsstest du JG verwenden, da nur JA von vorzeichenlosen Zahlen ausgeht.

    Der Unterschied liegt darin, dass JG von vorzeichenbehafteten Zahlen ausgeht, JA von vorzeichenlosen.
    Wenn du 2 positive 32Bit-Zahlen hast, beide unter 2^31, sollte es AFAIK keinen Unterschied machen. Zahlen über 2^31 sind logischerweise vorzeichenlos. Zahlen <0 sehen nämlich genauso aus wie Zahlen >2^31.

    [ Dieser Beitrag wurde am 06.01.2003 um 19:55 Uhr von cd9000 editiert. ]



  • Axo, danke 🙂


Anmelden zum Antworten