Assembler, kleines Verständnisproblem

  • Sonstige

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von OlafSt.

    Assembler, kleines Verständnisproblem

    Heyho Community,
    ich bin derzeit dran ein CrackMe zu lösen und bin auf folgende Zeilen im Debugger gestoßen, die ich mal kommentiert habe, so wie ich sie verstehe:

    Quellcode

    1. MOVZX EAX,BYTE PTR DS:[ESI] ;Kopiere das Byte an stelle DS:[ESI] in das EAX-Register
    2. SUB EAX,30 ;Subtrahiere dem EAX-Register 30h (Wenn das Byte auch 30h war, dann setze das Zero-Flag)
    3. ADD EBX,EAX ;Addiere EBX das Ergebnis der Subtraktion
    4. SHL EBX,4 ;Multipliziere den Wert im EBX-Register mit 16
    5. INC ESI ;Erhöhre ESI um eins
    6. DEC EDX ;Ziehe EDX eins ab
    7. JNZ SHORT 004011D0 ;Wenn das Zero-Flag nicht gesetzt ist, dann springe]


    So nun zu meinem Problem: Wenn das Byte 30h ist, dann wird die Subtraktion das Zero-Flag setzen. Aber nach dem Inkrementieren wird das Zero-Flag aber auf 0 gesetzt! In der Dokumentation des 8086 steht aber ausdrücklich, dass INC keine Auswirkungen auf die Flags hat. Wieso wird das Zero-Flag denn trz auf 0 gesetzt?!

    Liebe Grüße :)
    Wo viel kopiert wird, wird wenig kapiert.
    Andreas Tenzer
    (Dt. Philosoph, * 1954)

    Thunderbolt schrieb:

    Moin,

    Zeile 2: Nicht 0x30 oder 30h (alternative Schreibweise), sondern 30.

    Inc und Dec dürfen Flags ändern, und zwar: Overflow, Sign, Zero, Adjust und Parity.


    Danke für deine Antwort! Ich habe da mal einen Auszug aus meiner Quelle genommen:
    Im Gegensatz zur Addition von Eins direkt mit dem ADD- oder ADC-Kommando verändert der INC-Befehl weder das Carry- noch das Zero-Flag und ist schneller.

    Quelle: i8086.de/asm/8086-88-asm-inc.html

    Das gleiche steht ebenfalls bei DEC. Magst du mir mal deine Quelle schicken?
    Wo viel kopiert wird, wird wenig kapiert.
    Andreas Tenzer
    (Dt. Philosoph, * 1954)
    Ich fände es spannend, was sich wohl in dem Buffer bei [ESI] mit der Länge EDX befindet... :) Ich bin mir ziemlich sicher, das das lauter ASCII-Codierte Zahlen sind ("1", "2" usw.). Und ich wäre keineswegs überrascht, wenn die Anzahl dieser Zeichen irgendwie durch 4 teilbar ist...

    Ach herrje, da kommt der Cracker wieder durch :love: