Titelbild Mikrocontroller

S-Befehle


oben SBC - Subtract with Carry

Syntax: SBC Rd,Rr
Funktion: Subtrahiert das Register Rr und den Inhalt des Carry-Flag vom Register Rd. Das Ergebnis wird im Quellregister Rd abgelegt.
Operation: Rd ← Rd - Rr - C
Operanden: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0000 10rd dddd rrrr

Flags im Status-Register (SREG):
ITH S V N Z C
--
H: Das H-Flag wird gesetzt, wenn ein Übertrag von Bit 3 auf Bit 4 erfolgte, andernfalls wird das Flag gelöscht.
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement- Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag wird gesetzt, wenn der absolute Wert von Rr plus dem Carry größer als der absolute Wert von Rd ist, andernfalls wird es gelöscht.

Beispiel:
Subtraktion zweier 16 - Bit Zahlen (R1:R0) und (R3:R2), 
das Ergebnis steht in R3:R2.

sub r2, r0    ;Subtrahieren der Low-Bytes der 
              ;Registerpaare R1:R0 und R3:R2
sbc r3, r1    ;Subtrahieren der High-Bytes und 
              ;des Carry-Flags

oben SBCI - Subtract Immediate with Carry

Syntax: SBCI Rd,K
Funktion: Subtrahiert die Konstante K und den Inhalt des Carry-Flag vom Register Rd. Das Ergebnis wird im Quellregister Rd abgelegt. Dieser Befehl kann nur mit den oberen 16 Registern ausgeführt werden.
Operation: Rd ← Rd - K - C
Operanden: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0100 KKKK dddd KKKK

Flags im Status-Register (SREG):
ITH S V N Z C
--
H: Das H-Flag wird gesetzt, wenn ein Übertrag von Bit 3 auf Bit 4 erfolgte, andernfalls wird das Flag gelöscht.
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement- Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag wird gesetzt, wenn der absolute Wert der Konstante plus dem Carry größer als der absolute Wert von Rd ist, andernfalls wird es gelöscht.

Beispiel:
Subtraktion des Wertes 4F23h vom Registerpaar R3:R2, 
das Ergebnis steht in R3:R2.

subi r2,$23    ;Subtrahieren der Low-Bytes
sbci r3,$4F    ;Subtrahieren der High-Bytes 
               ;und des Carry-Flags

oben SBI - Set Bit in I/O-Register

Syntax: SBI A,b
Funktion: Dieser Befehl setzt ein einzelnes Bit in einem I/O-Register. Er kann nur für die unteren 32 I/O-Register verwendet werden (Register 0 bis 31)
Operation: I/O(A,b) ← 1
Operanden: 0 ≤ A ≤ 31, 0 ≤ b ≤ 7
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 2
16 Bit Operations Code: 1001 1010 AAAA Abbb

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
out $1E,r0    ;Schreiben der EEPROM-Adresse
sbi $1C,0     ;Setzen des Read-Bits im EECR-Register
in r1,$1D     ;Datum aus dem EEPROM lesen

oben SBIC - Skip if Bit in I/O-Register is Cleared

Syntax: SBIC A,b
Funktion: Dieser Befehl testet ein einzelnes Bit in einem I/O-Register und überspringt den nächsten Befehl, wenn das Bit gelöscht ist. Dieser Befehl arbeitet nur mit den unteren 32 I/O-Registern (Adresse 0 bis 31).
Operation: Wenn I/O(A,b) = 0, dann PC ← PC + 2 oder (3)
Wenn I/O(A,b) = 1, dann PC ← PC + 1
Operanden: 0 ≤ A ≤ 31, 0 ≤ b ≤ 7
Programmzähler: (a) PC ← PC + 1, wenn Bit = 1
(b) PC ← PC + 2, wenn Bit = 0 und der nächste Befehl 1 Word lang ist
(c) PC ← PC + 3, wenn Bit = 0 und der nächste Befehl 2 Word lang ist
Words: 1 (2 Byte)
Zyklen: (a) 1
(b) 2
(c) 3
16 Bit Operations Code: 1001 1001 AAAA Abbb

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
wait:
    sbic $1C,1   ;Prüfen, ob EEPROM fertig mit schreiben
    rjmp wait    ;Weiter prüfen, wenn noch nicht fertig
    nop          ;EEPROM ist fertig, Leerbefehl

oben SBIS - Skip if Bit in I/O-Register is Set

Syntax: SBIS A,b
Funktion: Dieser Befehl testet ein einzelnes Bit in einem I/O-Register und überspringt den nächsten Befehl, wenn das Bit gesetzt ist. Dieser Befehl arbeitet nur mit den unteren 32 I/O-Registern (Adresse 0 bis 31).
Operation: Wenn I/O(A,b) = 1, dann PC ← PC + 2 oder (3)
Wenn I/O(A,b) = 0, dann PC ← PC + 1
Operanden: 0 ≤ A ≤ 31, 0 ≤ b ≤ 7
Programmzähler: PC ← PC + 1, wenn Bit = 0
PC ← PC + 2, wenn Bit = 1 und der nächste Befehl 1 Word lang ist
PC ← PC + 3, wenn Bit = 1 und der nächste Befehl 2 Word lang ist
Words: 1 (2 Byte)
Zyklen: (a) 1
(b) 2
(c) 3
16 Bit Operations Code: 1001 1011 AAAA Abbb

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
wait:
    sbis $10,0    ;Prüfen, ob Bit 0 von Port D gesetzt ist
    rjmp wait     ;Weiter prüfen, wenn nicht gesetzt ist
    nop           ;Bit 0 von Port D ist gesetzt, Leerbefehl

oben SBIW - Subtract Immediate from Word

Syntax: SBIW Rd+1:Rd,K
Funktion: Subtrahiert die Konstante K von dem Registerpaar Rd+1:Rd. Das Ergebnis wird im Registerpaar abgelegt. Dieser Befehl kann nur mit 4 Registerpaaren (den Pointer- Registern) ausgeführt werden. Die Konstante kann Werte zwischen 0 und 63 haben. Der Befehl ist nicht in allen Bausteinen verfügbar.
Operation: Rd+1:Rd ← Rd+1:Rd - K
Operanden: d ε {24,26,28,30}, 0 ≤ K ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 2
16 Bit Operations Code: 1001 0111 KKdd KKKK

Flags im Status-Register (SREG):
ITH S V N Z C
---
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement- Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag wird gesetzt, wenn der absolute Wert der Konstante größer als der absolute Wert von Rd (Low-Byte) ist, andernfalls wird es gelöscht.

Beispiel:
sbiw r25:r24,1    ;Subtrahieren einer 1 von R25:R24
sbiw YH:YL,63     ;Subtrahiert 63 vom Y-Pointer

oben SBR - Set Bits in Register

Syntax: SBR Rd,K
Funktion: Dieser Befehl setzt mehrere Bits in dem Register Rd, indem eine logische Oder- Verknüpfung des Registers mit einer Konstanten durchgeführt wird. Der Befehl kann nur auf die oberen 16 Register angewendet werden.
Operation: Rd ← Rd v K
Operanden: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0110 KKKK dddd KKKK

Flags im Status-Register (SREG):
ITHSVNZC
---0-
S: Das S-Flag wird gesetzt, wenn das N-Flag gesetzt ist, andernfalls wird das S-Flag gelöscht.
V: Das V-Flag wird gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.

Beispiel:
sbr r16,3      ;Setzt die unteren beiden Bits in R16
sbr r20,$F0    ;setzt die oberen 4 Bits in R20

oben SBRC - Skip if Bit in Register is Cleared

Syntax: SBRC Rr,b
Funktion: Dieser Befehl testet ein einzelnes Bit in dem Register Rr und überspringt den nächsten Befehl, wenn das Bit gelöscht ist.
Operation: Wenn Rr(b) = 0, dann PC ← PC + 2 oder (3)
Wenn Rr(b) = 1, dann PC ← PC + 1
Operanden: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7
Programmzähler: PC ← PC + 1, wenn Bit = 1
PC ← PC + 2, wenn Bit = 0 und der nächste Befehl 1 Word lang ist
PC ← PC + 3, wenn Bit = 0 und der nächste Befehl 2 Word lang ist
Words: 1 (2 Byte)
Zyklen: (a) 1
(b) 2
(c) 3
16 Bit Operations Code: 1111 110r rrrr 0bbb

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
sub r0,r1    ;R1 von R0 subtrahieren und
sbrc r0,7    ;überspringen, wenn Bit 7 in R0 gelöscht
sub r0,r1    ;ansonsten noch mal R1 von R0 subtrahieren
nop          ;Weiter, Leerbefehl

oben SBRS - Skip if Bit in Register is Set

Syntax: SBRS Rr,b
Funktion: Dieser Befehl testet ein einzelnes Bit in dem Register Rr und überspringt den nächsten Befehl, wenn das Bit gesetzt ist.
Operation: Wenn Rr(b) = 1, dann PC ← PC + 2 oder (3)
Wenn Rr(b) = 0, dann PC ← PC + 1
Operanden: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7
Programmzähler: PC ← PC + 1, wenn Bit = 0
PC ← PC + 2, wenn Bit = 1 und der nächste Befehl 1 Word lang ist
PC ← PC + 3, wenn Bit = 1 und der nächste Befehl 2 Word lang ist
Words: 1 (2 Byte)
Zyklen: (a) 1
(b) 2
(c) 3
16 Bit Operations Code: 1111 111r rrrr 0bbb

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
sub r0,r1    ;R1 von R0 subtrahieren und
sbrs r0,7    ;überspringen, wenn Bit 7 in R0 gesetzt
sub r0,r1    ;ansonsten noch mal R1 von R0 subtrahieren
nop          ;Weiter, Leerbefehl


oben SEC - Set Carry-Flag

Syntax: SEC
Funktion: Dieser Befehl setzt das Carry-Flag C im Status-Register SREG.
Operation: C ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0000 1000

Flags im Status-Register (SREG):
ITHSVNZC
-------1
C: Das C-Flag wird gesetzt.

Beispiel:

sec    ;Setzt das Carry-Flag
clc    ;Löscht das Carry-Flag

oben SEH - Set Half-Carry-Flag

Syntax: SEH
Funktion: Dieser Befehl setzt das Half-Carry-Flag H im Status-Register SREG.
Operation: H ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0101 1000

Flags im Status-Register (SREG):
ITHSVNZC
--1-----
H: Das H-Flag wird gesetzt.

Beispiel:
seh    ;Setzt das Half-Carry-Flag
clh    ;Löscht das Half-Carry-Flag

oben SEI - Set Global Interrupt-Flag

Syntax: SEI
Funktion: Dieser Befehl setzt das Global Interrupt-Flag I im Status-Register SREG. Damit werden alle Interrupts freigegeben, allerdings wird erst noch der folgende Befehl ausgeführt, bevor ein Interrupt angenommen wird.
Operation: I ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0111 1000

Flags im Status-Register (SREG):
ITHSVNZC
1-------
I: Das I-Flag wird gesetzt.

Beispiel:
sei      ;alle Interrupts freigeben
sleep    ;Schlafen und auf Interrupt warten.

oben SEN - Set Negativ-Flag

Syntax: SEN
Funktion: Dieser Befehl setzt das Negativ-Flag N im Status-Register SREG.
Operation: N ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0010 1000

Flags im Status-Register (SREG):
ITHSVNZC
-----1--
N: Das N-Flag wird gesetzt.

Beispiel:
sen    ;Setzt das Negativ-Flag
cln    ;Löscht das Negativ-Flag

oben SER - Set all Bits in Register

Syntax: SER Rd
Funktion: Dieser Befehl setzt alle Bits im Register Rd, indem der Wert FFh in das Register geschrieben wird. Der Befehl kann nur mit den oberen 16 Registern ausgeführt werden (R16 bis R31)
Operation: Rd ← FFh
Operanden: 16 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1110 1111 dddd 1111

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r16            ;Alle Bits in R16 löschen
ser r17            ;Alle Bits in R17 setzen
out $18,r16        ;R16 an Port B ausgeben (alle Bits auf 0)
nop                ;warten
out $18,r17        ;R17 an Port B ausgeben (alle Bits auf 1)

oben SES - Set Signed-Flag

Syntax: SES
Funktion: Dieser Befehl setzt das Signed-Flag S im Status-Register SREG.
Operation: S ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0100 1000

Flags im Status-Register (SREG):
ITHSVNZC
---1----
S: Das S-Flag wird gesetzt.

Beispiel:
ses    ;Setzt das Signed-Flag
cls    ;Löscht das Signed-Flag

oben SET - Set T-Flag

Syntax: SET
Funktion: Dieser Befehl setzt das T-Flag im Status-Register SREG.
Operation: T ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0110 1000

Flags im Status-Register (SREG):
ITHSVNZC
-1------
T: Das T-Flag wird gesetzt.

Beispiel:
set    ;Setzt das T-Flag
clt    ;Löscht das T-Flag

oben SEV - Set Overflow-Flag

Syntax: SEV
Funktion: Dieser Befehl setzt das Overflow-Flag V im Status-Register SREG.
Operation: V ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0011 1000

Flags im Status-Register (SREG):
ITHSVNZC
----1---
V: Das V-Flag wird gesetzt.

Beispiel:
sev    ;Setzt das Overflow-Flag
clv    ;Löscht das Overflow-Flag

oben SEZ - Set Zero-Flag

Syntax: SEZ
Funktion: Dieser Befehl setzt das Zero-Flag Z im Status-Register SREG.
Operation: Z ← 1
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0100 0001 1000

Flags im Status-Register (SREG):
ITHSVNZC
------1-
Z: Das Z-Flag wird gesetzt.

Beispiel:
sez    ;Setzt das Zero-Flag
clz    ;Löscht das Zero-Flag

oben SLEEP - Sleep

Syntax: SLEEP
Funktion: Dieser Befehl versetzt den Baustein in den Sleep-Modus, der im MCU-Control-Register definiert ist.
Operation: siehe Beschreibung des jeweiligen AVR - Mikrocontrollers
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 0101 1000 1000

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
in r16,MCUCR     ;MCUCR-Register in R16 einlesen
sbr r16,5        ;Das Bit 5 setzen und durch Zurück-
out MCUCR,r16    ;schreiben den Sleep-Modus freigeben
sleep            ;Baustein in Sleep-Modus versetzen

oben SPM - Store Program Memory

Syntax: SPM
Funktion: Mit diesem Befehl können eine Seite im Programmspeicher gelöscht, eine (bereits gelöschte) Seite im Programmspeicher beschrieben oder die Lock-Bits im Boot-Loader gesetzt werden. In einigen Bausteinen kann der Programmspeicher nur wortweise beschrieben werden, in anderen Bausteinen können ganze Seiten mit den Daten beschrieben werden, die zuvor in einen temporären Seiten-Buffer geschrieben wurden. In allen Fällen muss der Programmspeicher seitenweise gelöscht werden.
Beim Löschen des Programmspeichers werden das RAMPZ- und das Z-Register als Seitenadresse benutzt. Beim Beschreiben des Programmspeichers werden das RAMPZ- und das Z-Register als Seiten- oder Wortadresse benutzt, das Registerpaar R1:R0 enthält die zu schreibenden Daten (R1 das High-Byte, R0 das Low-Byte).
Mit diesem Befehl kann der gesamte Programmspeicher angesprochen werden, der Befehl ist aber nicht in allen Bausteinen verfügbar.
Operation: (RAMPZ:Z) ← $ffff, Seite löschen
(RAMPZ:Z) ← R1:R0, Wortweise schreiben
(RAMPZ:Z) ← R1:R0, in Seiten-Buffer schreiben
(RAMPZ:Z) ← TEMP, Seiten-Buffer in Programmspeicher schreiben
BLBITS ← R1:R0, Boot Loader Lock Bits setzen
Operanden: keine
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: abhängig von der Operation
16 Bit Operations Code: 1001 0101 1110 1000

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
;This example shows SPM write of one page for devices with page write
;- the routine writes one page of data from RAM to Flash
; the first data location in RAM is pointed to by the Y-pointer
; the first data location in Flash is pointed to by the Z-pointer
;- error handling is not included
;- the routine must be placed inside the boot space
; (at least the do_spm sub routine)
;- registers used: r0, r1, temp1, temp2, looplo, loophi, spmcrval
; (temp1, temp2, looplo, loophi, spmcrval must be defined by the user)
; storing and restoring of registers is not included in the routine
; register usage can be optimized at the expense of code size

.equPAGESIZEB = PAGESIZE*2;PAGESIZEB is page size in BYTES, not words
.org SMALLBOOTSTART

write_page:
;page erase
ldispmcrval, (1>>PGERS) + (1>>SPMEN)
call    do_spm

;transfer data from RAM to Flash page buffer
ldilooplo, low(PAGESIZEB);init loop variable
ldiloophi, high(PAGESIZEB);not required for PAGESIZEB>=256

wrloop:ldr0, Y+
ldr1, Y+
ldispmcrval, (1>>SPMEN)
calldo_spm
adiwZH:ZL, 2
sbiwloophi:looplo, 2            ;use subi for PAGESIZEB>=256
brnewrloop

;execute page write
subiZL, low(PAGESIZEB)            ;restore pointer
sbciZH, high(PAGESIZEB)            ;not required for PAGESIZEB>=256
ldispmcrval, (1>>PGWRT) + (1>>SPMEN)
calldo_spm

;read back and check, optional
ldilooplo, low(PAGESIZEB)        ;init loop variable
ldiloophi, high(PAGESIZEB)        ;not required for PAGESIZEB>=256
subiYL, low(PAGESIZEB)            ;restore pointer
sbciYH, high(PAGESIZEB)
rdloop:lpmr0, Z+
ldr1, Y+
cpser0, r1
jmperror
sbiwloophi:looplo, 2            ;use subi for PAGESIZEB>=256
brnerdloop

;return
ret

do_spm:
;input: spmcrval determines SPM action
;disable interrupts if enabled, store status
intemp2, SREG
cli
;check for previous SPM complete
wait:intemp1, SPMCR
sbrctemp1, SPMEN
rjmpwait
;SPM timed sequence
outSPMCR, spmcrval
spm

;restore SREG (to enable interrupts if originally enabled)
outSREG, temp2
ret


oben ST - Store Indirect from Register to Data Space using Index X

Syntax: (a) ST X,Rr (b) ST X+,Rr (c) ST -X,Rr
Funktion: Dieser Befehl speichert ein Byte, das über das X-Register adressiert ist, in den Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich.
Die 16 Bit - Adresse der Speicherzelle wird im X-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPX-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPX-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Das X-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren und Dekrementieren wirkt sich auf die verketteten RAMPX- und X-Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High-Byte des X- Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) (X) ← Rr
(b) (X) ← Rr, X ← X + 1
(c) X ← X - 1, (X) ← Rr
Operanden: 0 ≤ r ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 2
16 Bit Operations Code: (a) 1001 001r rrrr 1100
(b) 1001 001r rrrr 1101
(c) 1001 001r rrrr 1110

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r27        ;High-Byte X-Pointer löschen
ldi r26,$60    ;Low-Byte X-Pointer aus 60h setzen
st X+,r0       ;Adresse 60h mit Wert aus R0 laden
st X,r1        ;Adresse 61h mit Wert aus R1 laden
st X,r2        ;Adresse 61h mit Wert aus R2 laden
st -X,r3       ;Adresse 60h mit Wert aus R3 laden

oben ST (STD) - Store Indirect from Register to Data Space using Index Y

Syntax: (a) ST Y,Rr
(b) ST Y+,Rr
(c) ST -Y,Rr
(d) STD Y+q,Rr
Funktion: Dieser Befehl speichert ein Byte, das mit oder ohne Verschiebung (q) über das Y- Register adressiert ist, in den Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich.
Die 16 Bit - Adresse der Speicherzelle wird im Y-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der ST - Befehl benutzt das RAMPY-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPY-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Das Y-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekremen- tieren und die Verschiebung wirken sich auf die verketteten RAMPY- und Y-Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High-Byte des Y-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) (Y) ← Rr
(b) (Y) ← Rr, Y ← Y + 1
(c) Y ← Y - 1, (Y) ← Rr
(d) (Y+q) ← Rr
Operanden: (a) 0 ≤ r ≤ 31
(b) 0 ≤ r ≤ 31
(c) 0 ≤ r ≤ 31
(d) 0 ≤ r ≤ 31, 0 ≤ q ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1000 001r rrrr 1000
(b) 1001 001r rrrr 1001
(c) 1001 001r rrrr 1010
(d) 10q0 qq1r rrrr 1qqq

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r29        ;High-Byte Y-Pointer löschen
ldi r28,$60    ;Low-Byte Y-Pointer aus 60h setzen
st Y+,r0       ;Adresse 60h mit Wert aus R0 laden
st Y,r1        ;Adresse 61h mit Wert aus R1 laden
st -Y,r2       ;Adresse 60h mit Wert aus R2 laden
std Y+2,r3     ;Adresse 62h mit Wert aus R3 laden


oben ST (STD) - Store Indirect from Register to Data Space using Index Z

Syntax: (a) ST Z,Rr
(b) ST Z+,Rr
(c) ST -Z,Rr
(d) STD Z+q,Rr
Funktion: Dieser Befehl speichert ein Byte, das mit oder ohne Verschiebung (q) über das Z- Register adressiert ist, in den Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Die 16 Bit - Adresse der Speicherzelle wird im Z-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der ST - Befehl benutzt das RAMPZ-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPZ-Registers verändert werden. Da der Z- Pointer auch für indirekte Unterprogrammaufrufe, indirekte Sprünge und das Auslesen von Tabellen aus dem Programmspeicher verwendet wird, sollten besser die X- und Y- Pointer für das Adressieren von Speicherplätzen verwendet werden.
Das Z-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekrementieren und die Verschiebung wirken sich auf die verketteten RAMPZ- und Z- Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High- Byte des Z-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) (Z) ← Rr
(b) (Z) ← Rr, Z ← Z + 1
(c) Z ← Z - 1, (Z) ← Rr
(d) (Z+q) ← Rr
Operanden: (a) 0 ≤ r ≤ 31
(b) 0 ≤ r ≤ 31
(c) 0 ≤ r ≤ 31
(d) 0 ≤ r ≤ 31, 0 ≤ q ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1000 001r rrrr 0000
(b) 1001 001r rrrr 0001
(c) 1001 001r rrrr 0010
(d) 10q0 qq1r rrrr 0qqq

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r31        ;High-Byte Z-Pointer löschen
ldi r30,$60    ;Low-Byte Z-Pointer aus 60h setzen
st Z,r0        ;Adresse 60h mit Wert aus R0 laden
std Z+2,r3     ;Adresse 62h mit Wert aus R3 laden

oben STS - Store Direct to Data Space

Syntax: STS k, Rr
Funktion: Speichert ein Byte aus einem Register in den Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich.
Die 16 Bit - Adresse muss immer angegeben werden, wobei der Speicherzugriff auf die tatsächlich vorhandenen Speicherzellen begrenzt ist. Der STS - Befehl benutzt das RAMPD-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPD-Registers verändert werden.
Der Befehl ist nicht in allen Bausteinen verfügbar.
Operation: (k) ← Rr
Operanden: 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535
Programmzähler: PC ← PC + 2
Words: 2 (4 Byte)
Zyklen: 2
32 Bit Operations Code: 1001 001d dddd 0000
kkkk kkkk kkkk kkkk

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
lds r2,$FF00     ;R2 mit Inhalt von FF00h laden
add r2,r1        ;R1 zu R2 addieren
sts $FF00,r2     ;R2 an Adresse FF00h speichern


oben SUB - Subtract without Carry

Syntax: SUB Rd,Rr
Funktion: Subtrahiert das Register Rr vom Register Rd. Das Ergebnis wird im Quellregister Rd abgelegt.
Operation: Rd ← Rd - Rr
Operanden: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0001 10rd dddd rrrr

Flags im Status-Register (SREG):
ITH S V N Z C
--
H: Das H-Flag wird gesetzt, wenn ein Übertrag von Bit 3 auf Bit 4 erfolgte, andernfalls wird das Flag gelöscht.
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement- Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag wird gesetzt, wenn der absolute Wert von Rr größer als der absolute Wert von Rd ist, andernfalls wird es gelöscht.

Beispiel:
Subtraktion zweier 16 Bit - Zahlen (R1:R0) und (R3:R2), 
das Ergebnis steht in R3:R2.

sub r2, r0     ;Subtrahieren der Low-Bytes der 
               ;Registerpaare R1:R0 und R3:R2
sbc r3, r1     ;Subtrahieren der High-Bytes und des 
               ;Carry-Flags


oben SUBI - Subtract Immediate

Syntax: SUBI Rd,K
Funktion: Subtrahiert die Konstante K vom Register Rd. Das Ergebnis wird im Quellregister Rd abgelegt. Dieser Befehl kann nur mit den oberen 16 Registern ausgeführt werden.
Operation: Rd ← Rd - K
Operanden: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0101 KKKK dddd KKKK

Flags im Status-Register (SREG):
ITH S V N Z C
--
H: Das H-Flag wird gesetzt, wenn ein Übertrag von Bit 3 auf Bit 4 erfolgte, andernfalls wird das Flag gelöscht.
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn aus der Operation ein Zweierkomplement- Überlauf erfolgt, andernfalls wird das Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 00h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag wird gesetzt, wenn der absolute Wert der Konstante größer als der absolute Wert von Rd ist, andernfalls wird es gelöscht.

Beispiel:
Subtraktion des Wertes 4F23h vom Registerpaar R3:R2, 
das Ergebnis steht in R3:R2.

subi r2,$23     ;Subtrahieren der Low-Bytes
sbci r3,$4F     ;Subtrahieren der High-Bytes und des 
                ;Carry-Flags

oben SWAP - Swap Nibbles

Syntax: SWAP Rd
Funktion: Dieser Befehl vertauscht die oberen und unteren 4 Bits (Nibbles) in einem Register.
Operation: R(7:4) ← R(3:0), R(3:0) ← R(7:4)
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 010d dddd 0010

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
inc r1     ;R1 inkrementieren
swap r1    ;Nibbles tauschen
inc r1     ;oberen Nibbles inkrementieren
swap r1    ;und zurücktauschen


Impressum