Bedingte Sprünge



  • Hallo,

    wertet ein bedigten Sprung immer CMP aus oder kann vorher auch eine andere Operation stehen, die ausgewertet wird, z.B. eine arithmetsche?

    Welche Operationen können durch bedingte Sprünge ausgewertet werden?

    Danke für Eure Hilfe!!!!!!!



  • Moin, Moin...

    Die bedingten Sprünge arbeiten mit den Flags im Statusregister zusammen. Wenn Du z.B. den Befehl jz benutzt, erfolgt der Sprung, wenn das Zero-Flag gesetzt ist. Wie dieses Flag vorher beeinflusst wurde, ist dabei völlig egal.

    or ax, ax
    jz label

    Obiger Code springt, wenn ax 0 enthält. Durch or ax,ax wird auch das Zero-Flag gesetzt, wenn ax=0 ist.

    Ciao...



  • Wenn die Flags gesetzt werden - klar, dann ist es egal, was dies auslöst... aber bei JG/JE/JL (...) muss vorher doch CMP stehen, oder?! Da werden ja auch nicht die Flags abgefragt...



  • Nein es gibt auch andere Befehle die die Flags setzten...

    MFG

    LordHoto



  • JG/JE/JL <--- die und auch alle anderen conditionalen sprünge arbeiten mit den flags.... und die können auf verschiedenste art gesetzt werden....
    das je "jmp if equal" heisst zielt zwar auf cmp ab aber je ist identisch mit jz und das heisst "jmp if zero" sprich wenn das zero flag gsetzt ist...



  • Wie in dem anderen Thread schon beschrieben: die Alternative zu LOOP:

    dec ecx
    jnz label
    

    Im Prinzip kannst du so ziemlich alle arithmetischen Instruktionen benutzen, die die Flags verändern. Muss halt nur Sinn machen 😃
    Neben CMP gibt es ja auch noch CMPSB/CMPSW/CMPSD, TEST und BT. Noch ein Beispiel: Du willst eine Zahl von einer anderen abziehen und testen ob das Ergebnis negativ ist:

    sub eax,edx
    js ist_negativ
    

    Da gibt es sicher noch etliche Beispiele für einen conditional jump ohne CMP ...


Anmelden zum Antworten