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