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. 32<br />

In einer Instruktion können auch zwei Register vorkommen. Die einfachste Instruktion dieser Art ist<br />

die KopierInstruktion MOV. Sie kopiert <strong>de</strong>n Inhalt <strong>de</strong>s einen Registers in ein an<strong>de</strong>res Register. Also<br />

etwa so:<br />

.DEF MeinLieblingsregister = R16<br />

.DEF NochEinRegister = R15<br />

LDI MeinLieblingsregister, 150<br />

MOV NochEinRegister, MeinLieblingsregister<br />

Die ersten bei<strong>de</strong>n Zeilen dieses großartigen Programmes sind Direktiven, die ausschließlich <strong>de</strong>m<br />

Assembler mitteilen, dass wir anstelle <strong>de</strong>r bei<strong>de</strong>n Registernamen R16 und R15 an<strong>de</strong>re Benennungen<br />

zu verwen<strong>de</strong>n wünschen. Sie erzeugen keinen Co<strong>de</strong>! Die bei<strong>de</strong>n Programmzeilen mit LDI und<br />

MOV erzeugen Co<strong>de</strong>, nämlich:<br />

000000 E906<br />

000001 2F01<br />

Die zweite Instruktion schiebt die 150 im Register R16 in das Rechenwerk und kopiert <strong>de</strong>ssen Inhalt<br />

in das Zielregister R15. MERKE:<br />

Das erstgenannte Register in <strong>de</strong>r Assemblerinstruktion ist immer das Zielregister, das das Ergebnis<br />

aufnimmt.<br />

(Also so ziemlich umgekehrt wie man erwarten wür<strong>de</strong> und wie man es ausspricht. Deshalb sagen<br />

viele, Assembler sei schwer zu erlernen!)<br />

6.2 Unterschie<strong>de</strong> <strong>de</strong>r Register<br />

Schlaumeier wür<strong>de</strong>n das obige Programm vielleicht eher so schreiben:<br />

.DEF NochEinRegister = R0<br />

LDI NochEinRegister, 150<br />

Und sind reingefallen: Nur die Register R16 bis R31 lassen sich hurtig mit einer Konstante la<strong>de</strong>n,<br />

die Register R0 bis R15 nicht! Diese Einschränkung ist ärgerlich, ließ sich aber bei <strong>de</strong>r Konstruktion<br />

<strong>de</strong>r Assemblersprache für die AVRs wohl kaum vermei<strong>de</strong>n.<br />

Es gibt eine Ausnahme, das ist das Nullsetzen eines Registers. Diese Instruktion<br />

CLR MeinLieblingsRegister<br />

ist für alle Register zulässig (aber nur, weil weil es eigentlich korrekt XOR<br />

MeinLieblingsregister,MeinLieblingsregister heißen müsste und gar kein echtes und ganz an<strong>de</strong>rs als<br />

LDI MeinLieblingsRegister,0 funktioniert).<br />

Diese zwei Klassen von Registern gibt es außer bei LDI noch bei folgen<strong>de</strong>n Instruktionen:<br />

• ANDI Rx,K ; Bit-Und eines Registers Rx mit einer Konstante K,<br />

• CBR Rx,M ; Lösche alle Bits im Register Rx, die in <strong>de</strong>r Maske M (eine Konstante) gesetzt sind,<br />

• CPI Rx,K ; Vergleiche das Register Rx mit <strong>de</strong>r Konstante K,<br />

• SBCI Rx,K ; Subtrahiere die Konstante K und das Carry-Flag vom Wert <strong>de</strong>s Registers Rx und<br />

speichere das Ergebnis im Register Rx,

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!