CPC (AVR) geht nicht wie erwartet

OP #494822
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich möchte das Ergebnis einer Addition (in Assembler) auf einen 
Maximalwert begrenzen:

add Tmp0, Tmp1
cpc MaxWert, Tmp0
brcc SprungmarkeFertig
mov Tmp0, MaxWert

Nach cpc ist das Carry gesetzt, wenn das Ergebnis der Addition größer 
als MaxWert ist.
Wenn aber bei der Addition ein Überlauf auftritt (0xF0 + 0x20 = 0x10 + 
Carry) funktioniert das nicht mehr. Dabei sollte doch cpc genau dieses 
Carry mit beachten.

Wo liegt mein Fehler?
Danke!
Michael
Gast #494990
Lesenswert?
• ▲
▼
RTFM.

CPC berechnet

tmp0 - maxwert - carry

(wobei carry nur 1 oder 0 sein kann). Effektiv ist ein cp(c) Befehl 
identisch mit einem sub(c), nur dass das Egebnis nicht geschrieben wird.

Da du ja in einem Register nur 8 Bit unter kriegst, hat cpc keinen Sinn. 
cpi ist das mittel der Wahl. CPC ist nur sinnvoll bei 16 Bit 
Vergleichen, siehe Assembler Dokumentation für CPC.

MFG
Falk
OP #495109
Lesenswert?
• ▲
▼
Hallo Falk!
RTFM hab ich schon:

This instruction performs a compare between two registers Rd and Rr and 
also takes into account the previous carry.

 Rd - Rr - C
Also anderherum!

hier:
 MaxWert - Tmp0 - C
(Wobei MaxWert auch ein Registerinhalt ist. Hatte ich vergessen 
anzugeben.)

Wenn man eine Addition durchführt und danach das Carry mit 
berücksichtigt hat man eben neun Bits zur Verfügung. Soweit die Theorie.

Noch ne Idee?
#495163
Lesenswert?
• ▲
▼
Michael Schmidt wrote:
>
> Wenn man eine Addition durchführt und danach das Carry mit
> berücksichtigt hat man eben neun Bits zur Verfügung. Soweit die Theorie.

Nix Theorie.
Das ist so.

Effektiv versuchst du ja einen 9 Bit Wert mit einem 8 Bit
Wert zu vergleichen. Ergo: Kann das mit einem Befehl der
nur 8 Bit berücksichtigt nichts werden (Der CPC berücksichtigt
schon das Carry, aber anders als du es hier brauchst).

>
> Noch ne Idee?

gleich nach der Addition testen, ob Carry gesetzt ist.
Ist es dass, dann ist das Ergebnis auf jeden Fall schon
mal größer als dein zulässiger Maximalwert (der ja 8
Bit gross ist).
Ist es nicht gesetzt, blieb also die Addition im 8 Bit
Raum, dann verglichst du noch mit dem MaxWert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.