Hallo, ich habe mal gelesen, dass für ein Vergleich von 16Bit Werten das CP in kompination mit dem CPC genommen werden kann. Aber irgendwie komme ich damit nicht klar. In meinen Registern sind folgende Werte: XH=0x05 XL=0x74 R16=0x08 R17=0x71 Jetzt ist ja mein X Register kleiner als die anderen (R16[High] & R17[Low]). Wenn ich jetzt das mache: CP XH, R16 CPC XL, R17 BRGE OK Springt er zu "OK" obwohl er das eigentlich nicht machen sollte. Kann mir einer sagen warum?
Ich vermute, aufgrund der Assembler-Mnemonics, dass es um AVRs geht. Der Fehler ist, dass Du einen möglichen Übertrag aufgrund der Subtraktion der HIGH-Bytes erzeugst und nicht, wie Du des auch bei der schriftlichen Subtraktion tust, beginnend mit den niederwertigen Stellen. Die Reihenfolge der Befehle ist also richtig, aber nicht die der Operanden.
Noch eine kleine Anmerkung: Da der AVR 16-Bit-Werte in Little-Endian darstellt (so ist bspw. XL=R26 und XH=R27 und nicht umgekehrt), würde ich dieser Konvention folgen und beim Registerpaar R16 und R17 das Low-Byte in R16 legen. Man muss das nicht unbedingt, es hilft aber, Verwirrung zu mindern.
Yalu X. schrieb: > Da der AVR 16-Bit-Werte in Little-Endian darstellt (so ist bspw. XL=R26 > und XH=R27 und nicht umgekehrt), würde ich dieser Konvention folgen und > beim Registerpaar R16 und R17 das Low-Byte in R16 legen. Man muss das > nicht unbedingt, es hilft aber, Verwirrung zu mindern. Es ist darüber hinaus auch deswegen sinnvoll, weil man durch eine einheitliche "endianess" bei der Registerverwendung oft Takte und oder zumindest Codespace durch den Einsatz von movw oder adiw/sbiw sparen kann. Deswegen sollte man nach Möglichkeit auch vorzugsweise Registerpaare verwenden, bei denen das "niedrigwertigere" Register eine gerade Zahl hat. Also z.B. R25:R24 statt R24:R23. Klar, man versucht natürlich zuerst mal ganz ohne mov/movw auszukommen, aber nicht immer kann das gelingen. Es ist halt leider nicht jedes Register(paar) mit den gleichen Fähigkeiten gesegnet.
c-hater schrieb: > zumindest Codespace durch den Einsatz von movw oder adiw/sbiw sparen > kann. Deswegen sollte man nach Möglichkeit auch vorzugsweise > Registerpaare verwenden, bei denen das "niedrigwertigere" Register eine > gerade Zahl hat. Also z.B. R25:R24 statt R24:R23. Aha. a) Nur ist r24:r23 gar kein Registerpaar b) adiw/sbiw funktioniert nur bei oberen 4 Registerpaaren, also nur von r24:r25 bis ZL:ZH c) Bei Registerpaaren hat das "niedrigwertigere" Register immer eine gerade Zahl, ansonsten ist das gar kein Registerpaar. d) Falls es sich um ein gültiges Registerpaar handelt, wird immer Low mit Low und High mit High ersetzt, unabhängig davon, wie man dieses Registerpaar auch schreibt:
1 | movw r16:r17, XL:XH |
2 | movw r17:r16, XL:XH |
3 | movw r16:r17, XH:XL |
4 | movw r17:r16, XH:XL |
ergeben dasselbe, nämlich r16 wird mit r26(XL) ersetzt und r17 wird mit r27(XH) ersetzt. Etwas klarer ? Bei weiteren Fragen deinerseits stehe ich gerne zur Verfügung, es ist endlich an der Zeit, dass du mal ein Paar Sachen über Assembler lernst.
:
Bearbeitet durch User
Marc V. schrieb: > es ist > endlich an der Zeit, dass du mal ein Paar Sachen über Assembler lernst. Aha. Jetz wissen wir: c-hater ist nicht der C-Hasser weil er Assembler liebt sondern weil er lieber in (Visual)BASIC, Java, .NET, Pörl und ähnlichen Sprachen programmiert. Diese bieten sich ja für Mikrocontroller-Programmierung besonders an .....
CP (oder SUB) ist der Vergleich (die Subtraktion) von zwei Bytes. CPC (oder SBC) muss nach der untersten Stelle genutzt werden, wenn die Zahlen aus mehr, als einem Byte bestehen, um den Übertrag (X hin, 1 im Sinn) zu berücksichtigen. Für ADD / ADC gilt das auch. Und wer das nicht von den niederwertigsten Bytes in Richtung höchstwertigsten Bytes durchzieht, kriegt auch ein Ergebnis, aber das ist nur in 0,0000001 von 100 Fällen nützlich. Ich glaube, das wurde mir schon in der 1. oder 2. Klasse Grundschule beigebracht. Damals (!) haben das alle Mitschüler mit IQ > 70 kapiert. Little oder Big Endian? Egal! Nicht egal: Von Little nach Big arbeiten, sonst BULLSHIT.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.