Forum: Mikrocontroller und Digitale Elektronik Assembler: Vergleich von 16bit Werten auf Gleichheit


von Michi (Gast)


Lesenswert?

Hallo Forum,

ich versuche gerade zu verstehen warum der compilierte Code meines 
Compilers funktioniert. (Warum? Debugging, irgendwo ist ein Wurm drin)
Wenn ich 2 16-Bit-Werte auf Gleichheit vergleichen möchte dann macht 
mein Compiler genau das was hier steht:
http://www.avr-roboter.de/controller/befehle/beschreibung/c.html#cpc
1
;Vergleich zweier 16-Bit Register (R3:R2) und (R1:R0)
2
3
    cp r2,r0    ;Vergleicht die Low-Bytes der Register miteinander.
4
    cpc r3,r1    ;Vergleicht die High-Bytes der Register miteinander
5
    brne ungleich    ;Verzweigung zum Label ungleich, wenn R3:R2 ≠ R1:R0 ist.
6
7
ungleich: nop        ;Ziel der Verzweigung, Leerbefehl

kleines Gedankenexperiment:
R3:R2 = 258 = 0b100000010 => r2 = 2; r3 = 1
R1:R0 = 257 = 0b100000001 => r0 = 1; r1 = 1

dann rechnet er also: r2 - r0 = 1 => Carry- und Zero-Flags gelöscht
weiter:       r3 - r1 - Carry = 0 => Carry-Flag gelöscht, Zero-Flag 
gesetzt.
"brne" sieht ein gesetztes Zero-Flag und verzweigt nicht, obwohl es 
sollte?!
Wo mach ich den Fehler?
Ich sitzte jetzt geschlagene 2 Stunden vor dem Problem aber ich komme 
nicht drauf!
Könnt ihr mir helfen?

von Micha (Gast)


Lesenswert?

Das schau mal im Instruction Set Manual nach 
http://www.atmel.com/images/doc0856.pdf

Da steht bei cpc über das zero-flag:
Previous value remains unchanged when the result is zero; cleared 
otherwise

Das ist die Lösung des Rätsels

von Michi (Gast)


Lesenswert?

Danke, das war's... verdammt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.