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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
C: |
Das C-Flag wird gesetzt.
|
Beispiel:
sec ;Setzt das Carry-Flag
clc ;Löscht das 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):
H: |
Das H-Flag wird gesetzt.
|
Beispiel:
seh ;Setzt das Half-Carry-Flag
clh ;Löscht das Half-Carry-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):
I: |
Das I-Flag wird gesetzt.
|
Beispiel:
sei ;alle Interrupts freigeben
sleep ;Schlafen und auf Interrupt warten.
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):
N: |
Das N-Flag wird gesetzt.
|
Beispiel:
sen ;Setzt das Negativ-Flag
cln ;Löscht das Negativ-Flag
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):
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)
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):
S: |
Das S-Flag wird gesetzt.
|
Beispiel:
ses ;Setzt das Signed-Flag
cls ;Löscht das Signed-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):
T: |
Das T-Flag wird gesetzt.
|
Beispiel:
set ;Setzt das T-Flag
clt ;Löscht das T-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):
V: |
Das V-Flag wird gesetzt.
|
Beispiel:
sev ;Setzt das Overflow-Flag
clv ;Löscht das Overflow-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):
Z: |
Das Z-Flag wird gesetzt.
|
Beispiel:
sez ;Setzt das Zero-Flag
clz ;Löscht das Zero-Flag
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
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
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):
Beispiel:
inc r1 ;R1 inkrementieren
swap r1 ;Nibbles tauschen
inc r1 ;oberen Nibbles inkrementieren
swap r1 ;und zurücktauschen