Schleife - Denkfehler

  • mc71 schrieb:

    Von der Logik des Befehlskürzels hast Du recht- branch if equal (bzw. branch if not equal) bezieht sich auf einen vorangehenden compare-Befehl. Andere Prozessoren würden so einen Befehl jump if zero-flag set 'jp z, adresse' nennen.
    Man kann es sich evtl. so einprägen:
    BNE steht für "Branch if Not Equal zero".
    BEQ steht für "Branch if EQual zero".
    Die Befehle reagieren also darauf, ob das letzte Ergebnis im Rechenregister eine Null war oder nicht. Und was die Vergleichsbefehle CMP/CPX/CPY machen, ist nichts anderes, als die Differenz zwischen Register und Argument auszurechnen. Der Ergebniswert wird nirgendwo gespeichert, es werden nur die Flags entsprechend gesetzt:
    Register und Argument sind gleich -> Differenz ist Null -> Zero-Flag wird gesetzt -> BEQ verzweigt, BNE nicht.
    Register und Argument sind ungleich -> Differenz ist nicht Null -> Zero-Flag wird gelöscht -> BNE verzweigt, BEQ nicht.
    Yes, I'm the guy responsible for the ACME cross assembler
  • Squidward schrieb:

    Besonders cmp #0 wird gerne vor bne/beq weggelassen, da überflüssig.
    Na, da muss ich aber wiedersprechen: ist nicht zwingend überflüssig. Bei mir kommt es z.B. vor dass ich erst an A was "mache" dann aber "cpx #0; b**" brauche (oder war es andersherum).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von alx ()

  • alx schrieb:

    Squidward schrieb:

    Besonders cmp #0 wird gerne vor bne/beq weggelassen, da überflüssig.
    Na, da muss ich aber wiedersprechen: ist nicht zwingend überflüssig. Bei mir kommt es z.B. vor dass ich erst an A was "mache" dann aber "cpx #0; b**" brauche (oder war es andersherum).
    Naja, das versteht sich ja von selbst, dass ich mir den Accu-Vergleich damit zurückholen kann, wenn ich zuvor noch was "anderes" mache...
    "...please come again - when I´m not working!"
  • Besonders cmp #0 wird gerne vor bne/beq weggelassen, da überflüssig. Das zeigt schon, daß nicht grundsätzlich vor jedem Branch (direkt) ein Compare stehen muss.

    Ich habe mir angewöhnt sowas so zu schreiben:

    ;cmp #0
    bne ....

    So bleibt der Code besser lesbar und man erkennt am ; daß ein Befehl überflüssig ist.
    Wer den C64 nicht ehrt ist des x64ers nicht wert.