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?