CPC (AVR) geht nicht wie erwartet

OP #494822
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
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
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?
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.