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