02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!