Assembler: Vergleich von 16bit Werten auf Gleichheit

Gast #2978579
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren