beginner_de
beginner_de
beginner_de
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Avr-Asm-Tutorial S. 90<br />
Aber gemach! Das wäre nur korrekt, wenn bei <strong>de</strong>r hintersten Ziffer, wie in unserem Fall, entwe<strong>de</strong>r<br />
schon beim ersten Addieren o<strong>de</strong>r später beim Addieren <strong>de</strong>r 6 tatsächlich ein Überlauf in die nächste<br />
Ziffer auftrat. Wenn das nicht so ist, dann darf die 6 nicht addiert wer<strong>de</strong>n. Woran ist zu merken, ob<br />
dabei ein Übertrag von <strong>de</strong>r niedrigeren in die höhere Ziffer auftrat? Am Halbübertrags-Bit im Status-Register.<br />
Dieses H-Bit zeigt für einige Instruktionen an, ob ein solcher Übertrag aus <strong>de</strong>m unteren<br />
in das obere Nibble auftrat. Dasselbe gilt analog für das obere Nibble, nur zeigt hier das Carry-<br />
Bit <strong>de</strong>n Überlauf an. Die folgen<strong>de</strong>n Tabellen zeigen die verschie<strong>de</strong>nen Möglichkeiten an.<br />
ADD R1,R2 (Half)Carry-Bit ADD Nibble,6 (Half)Carry-Bit Korrektur<br />
0 0 6 wie<strong>de</strong>r abziehen<br />
1 0 keine<br />
0 1 keine<br />
1 1 (geht gar nicht!)<br />
Nehmen wir an, die bei<strong>de</strong>n gepackten BCD-Zahlen seien in R2 und R3 gespeichert, R1 soll <strong>de</strong>n<br />
Überlauf aufnehmen und R16 und R17 stehen zur freien Verfügung. R16 soll zur Addition von 0x66<br />
dienen (das Register R2 kann keine Konstanten addieren), R17 zur Subtraktion <strong>de</strong>r Korrekturen am<br />
Ergebnis. Dann geht das Addieren von R2 und R3 so:<br />
LDI R16,0x66<br />
LDI R17,0x66<br />
ADD R2,R3<br />
BRCC NoCy1<br />
INC R1<br />
ANDI R17,0x0F<br />
NoCy1:<br />
BRHC NoHc1<br />
ANDI R17,0xF0<br />
NoHc1:<br />
ADD R2,R16<br />
BRCC NoCy2<br />
INC R1<br />
ANDI R17,0x0F<br />
NoCy2:<br />
BRHC NoHc2<br />
ANDI R17,0xF0<br />
NoHc2:<br />
SUB R2,R17<br />
Die einzelnen Schritte: Im ersten Schritt wer<strong>de</strong>n die bei<strong>de</strong>n Zahlen addiert. Tritt dabei schon ein<br />
Carry auf, dann wird das Ergebnisregister R1 erhöht und eine Korrektur <strong>de</strong>s oberen Nibbles ist nicht<br />
nötig (die obere 6 im Korrekturspeicher R16 wird gelöscht). INC und ANDI beeinflussen das H-Bit<br />
nicht. War nach <strong>de</strong>r ersten Addition das H-Bit schon gesetzt, dann kann auch die Korrektur <strong>de</strong>s unteren<br />
Nibble entfallen (das untere Nibble wird Null gesetzt). Dann wird 0x66 addiert. Tritt dabei<br />
nun ein Carry auf, dann wird wie oben verfahren. Trat dabei ein Half-Carry auf, dann wird ebenfalls<br />
wie oben verfahren. Schließlich wird das Korrektur-Register vom Ergebnis abgezogen und die Berechnung<br />
ist fertig.