Forum: Mikrocontroller und Digitale Elektronik CP & CPC als Vergleich von 16Bit Werten


von Armin A. (10110010)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Armin A. schrieb:
> Kann mir einer sagen warum?

 Ja.
 Normal vergleicht man Low zuerst.

von Theor (Gast)


Lesenswert?

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.

von Armin A. (10110010)


Lesenswert?

Dumme Fehler.
Danke hat geholfen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Nogrammer (Gast)


Lesenswert?

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 .....

von Jacko (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.