• Keine Ergebnisse gefunden

N¨ utzliche Befehle

Im Dokument Rechnertechnologien (Seite 13-16)

ldi (Load Immediate) –ldi Rd,k.

dmuss hierbei zwischen 16 und 31 (beides inklusive) liegen. K kann Werte von 0 bis 255 annehmen.

Dieser Befehl schreibtkin das angegebene Register.

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com

mov (move) –mov Rd,Rr

rundd k¨onnen Werte zwischen 0 und 31 annehmen. Der Befehl Speichert den Inhalt ausRrinRd.

in/out –in Rd,aoderout a,Rr

dundrk¨onnen Jeweils die Werte 0 bis 31 annehmen und spricht die entsprechenden Register an.akann zwischen 0 und 63 variieren und spricht die 64 I/O-Register an. 0 entspricht hierbei der Adresse 0x20, 1 der Adresse 0x21 usw.. Auch der Stackpointer (Adressen 0x5E und 0x5D) kann so angesprochen werden.

Es werden dementsprechend Daten aus einem der normalen Register in ein I/O-Register geladen oder anders herum.

lds (load directly from data storage) –lds Rd,k

dkann zwischen 0 bis 1, undkzwischen 0 bis 65535 variieren. Bei diesem Befehl werden in das angegebene Register die Daten geladen, die an der spezifizierten Stelle liegen.

sts (store directly to data storage) –sts k,Rr

F¨urrundkgelten die selben Werte wie oben. Bei diesem Befehl werden auf die spezifizierte Adresse die Daten aus dem angegebenen Register geschrieben.

ld und st (load/store indirect) –ld Rd,(+/-)X/Y/Z(+/-)oderst (+/-)X/Y/Z(+/-),Rr dreicht von 0 bis 31. Hier wird die Adresse, die in dem angegebenen Indexregister steht gelesen/beschrieben. Zus¨atzlich kann ein + oder - hinzugef¨ugt werden, das die Adresse um 1 erh¨oht/erniedrigt und wieder im Indexregister speichert. Je nachdem, ob der Operator vor oder nach dem Register steht, wird diese ¨Anderung vor oder nach dem Lesen der Adresse durchgef¨uhrt.

ldd und std (load/store indirect with displacement) –ldd Rd,X/Y/Z+qoderstd X/Y/Z+q,Rr d reicht von 0 bis 31 und q von 0 bis 63. Hier wird die Adresse, die in dem angegebenen Indexregister+qsteht gelesen/beschrieben. Anders als beim Increment/

Decrement wird die im Indexregister gespeicherte Adresse hierbei nicht gespeichert.

lpm (load from program memory) –lpm Rd,X/Y/Z

dkann zwischen 0 und 31 liegen.lpml¨adt ein Byte aus dem Programmspeicher, auf das das angegebene Indexregister zeigt, und speichert es in das Zielregister.

So k¨onnen vorbelegte Konstanten aus dem Programmspeicher in den SRAM gespeichert werden. Da der Programmspeicher 16-Bit-Worte nutzt, Indexregister allerdings nur ein Byte ansprechen, kann entweder das untere, oder das obere Byte angesprochen werden. Dies wird verdeutlicht, indem das LSB des Indexregisters

= 0 (unteres Byte), oder = 1 (h¨oheres Byte) ist.

jumps – jmp koderijmpoderrjmp k

Die Adresse des Programcounters wird ver¨andert. Beijmpdarf kbis ¨uber 4 Mio.

steigen und kann somit alle m¨oglichen Adressen direkt ansprechen, an der ein Befehl stehen kann. Beiijmpwird zu der ADresse gesprungen, die im Z-Register steht. Beirjmp kann kWErte zwischen -2.000 und 2.000 annehmen. Hier wird

der Wert von k auf den aktuellen PC addiert. So wirdrelativ zum aktuellen Wert gesprungen.

calls –call kodericalloderrcall k

call funktioniert ebenso wie jmp, allerdings springt es nach dem Ausf¨uhren der Subroutine auf die alte Stelle zur¨uck (hierf¨ur wird eine R¨ucksprungadresse auf den Stack gelegt). Bei call, kann k bis zu ca. 64.000 anwachsen (bei max.

Programmspeicher von 128KB), oder bis zu ca. 4 Mio. (bei max. Programmspeicher von 8MB). Ansonsten funktionieren die anderen Befehle analog zu den jmp-Befehlen.

ret und reti (return und return from interrupt) – retoderreti

Dieser vefehl liest eine Adresse vom Stack und springt dort hin. Bei return from interrupt werden interrupts wieder zugelassen.

eor(und cls) (exclusive or (clear)) –eor Rd,Rr

rund d reichen von 0 bis 31. Diese BEfehl f¨uhrt ein exklusives bitweises Oder zwischen den beiden Registern aus und speichert das Ergebnis inRd. Der Befehl cls Rdmacht eigentlich nichts anderes alseor Rd,Rd.

nop (no operation) –nop Dieser Befehl macht nichts.

inc/dec (increment/decrepemt) –inc Rdoderdec Rd

Dieser Befehl erh¨oht/erniedrigt den Inhalt des Registers um 1. Ergebnisse ¨uber die Rechnung werden im SREG gespeichert.

add (addition) –add Rd,Rr

Dieser Befehl addiert die Werte inRdundRrund speichert sie inRr. Informationen

¨

uber die Rechnung werden im Statusregister abgelegt.

adc (add with carry) –adc Rd,Rr

Dieser befehl addiert die Ihalte aus den beiden Registern,sowie das Carry-Flag aus dem SREG, und speichert das Ergebnis in Rd. Informationen werden im SREG gespeichert.

cpi (compare with immediate) –cpi Rd,k

d kann zwischen 16 und 31, k zwischen 0 und 256 liegen. Der Befehl zieht k von dem Inhalt ausRdab und speichert die informationen ¨uber die Rechnung im SREG.

cpc (compare with carry) –cpi Rd,Rr

Hier k¨onnen alle Register ge¨ahlt werden. Der Inhalt dieser Register und die Carry-Flag aus dem SREG werden voneinander abgezogen und Informationen

¨

uber diese Rechnung im SREG gespeichert.

breq/brne/brcs (branch if (not) equal/carry set) – breq koderbrne koderbrcs k Der Program-Counter wird um k (zwischen -64 und 63) erh¨oht/erniedrigt, wenn

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com das Zero-Flag im SREG gesetzt (breq) bzw. nicht gesetzt (brne) ist oder, wenn das Carry-Flag gesetzt ist (brcs).

.EQU (equals) – .EQU var-name=1-Byte-value

Legt eine ”Variable”fest. Beim Assembler-Vorgang wird jedes Vorkommen des Variablennamens durch den Wert ersetzt.

.DEF (define) –.DEF var-name=register

Hiermit wird einem Register ein symbolischer Name zugewiseen. dies kann mittels .UNDEFwieder aufgel¨ost werden.

.DSEG (Data segment) –.DSEG

beginnt ein Data-Segment. Diese Segmente enthalten meist nur .BYTE-Befehle und labels (name:). Variablen im DSEG sind in der Regel 8 Bit groß.

.CSEG (Code segment) –.CSEG

Beginnt ein Code-Segment. Hier steht der eigentliche Code des Assembler-Programms.

Variablen im CSEg sind in der Regel 16 Bit groß.

.Byte (byte) –var-name:.BYTE k

unter der Variable wird der Adresswert f¨ur eine k-Byte große variable abgelegt.

.DW (define constant word(s)) –var-name:.DW 2-byte-value(,2-byte-value,...) Mit diesem Befehl k¨onnen eine oder mehrere konstante Werte definiert und im entsprechenden Segment gespeichert werden. Ebenfalls git es.DBoder.DD, die nur ein Byte, oder ein ”Double-Word”(4 byte) definieren.

.org (origin) –.org value

Dieser Befehl gibt die Startadresse des Segments an.

Im Dokument Rechnertechnologien (Seite 13-16)