Syntax: |
RCALL k
|
Funktion: |
Dieser Befehl springt zu einem Unterprogramm, das innerhalb des Bereiches von PC-
2k+1 bis PC+2k (Word) liegen kann. Die Rücksprungadresse, also die Adresse des
Befehls, der auf den RCALL-Befehl folgt, wird in den Stack gesichert. Bei der
Assemblerprogrammierung werden anstatt der relativen Adresse Labels verwendet. Bei
Bausteinen, die über maximal 8k Bytes (4k Word) Programmspeicher verfügen, kann der
ganze Adressbereich von jeder Stelle aus angesprochen werden.
|
Operation: |
(a) PC ← PC + k + 1, STACK ← PC + 1, SP ← SP - 2 bei 16-Bit Adressen
(b) PC ← PC + k + 1, STACK ← PC + 1, SP ← SP - 3 bei 22-Bit Adressen
|
Operanden: |
-2K ≤ k < 2K
|
Programmzähler: |
PC ← PC + 1
|
Words: |
1 (2 Byte)
|
Zyklen: |
3 (bei 16-Bit Adressen)
4 (bei 22-Bit Adressen)
|
16 Bit Operations Code: |
1101 kkkk kkkk kkkk
|
Flags im Status-Register (SREG):
Beispiel:
rcall sprung ;Unterprogramm ab Label sprung aufrufen
sprung:
push r3 ;R3 in Stack sichern
push r4 ;R4 in Stack sichern
... ;das eigentliche Unterprogramm
pop r4 ;Alten Wert von R4 aus dem Stack zurückholen
pop r3 ;Alten Wert von R3 aus dem Stack zurückholen
ret ;Rücksprung
Syntax: |
RET
|
Funktion: |
Dieser Befehl beendet ein Unterprogramm. Die Rücksprungadresse wird aus dem Stack
geladen.
|
Operation: |
(a) PC(15:0) ← STACK bei 16-Bit Adressen SP ← SP + 2
(b) PC(21:0) ← STACK bei 22-Bit Adressen Sp ← SP + 3
|
Operanden: |
keine
|
Programmzähler: |
Siehe Operation
|
Words: |
1 (2 Byte)
|
Zyklen: |
4 (bei 16-Bit Adressen)
5 (bei 22-Bit Adressen)
|
16 Bit Operations Code: |
1001 0101 0000 1000
|
Flags im Status-Register (SREG):
Beispiel:
call sprung ;Unterprogramm ab Label sprung aufrufen
sprung:
push r3 ;R3 in Stack sichern
... ;das eigentliche Unterprogramm
pop r3 ;Alten Wert von R3 aus dem Stack zurückholen
ret ;Beenden Unterprogramm und Rücksprung
Syntax: |
RETI
|
Funktion: |
Dieser Befehl beendet eine Interruptroutine. Die Rücksprungadresse wird aus dem Stack
geladen und das Global Interrupt-Flag wird gesetzt. Zu beachten ist, dass das Status-
Register beim Aufruf der Interruptroutine nicht automatisch gesichert wird.
|
Operation: |
(a) PC(15:0) ← STACK bei 16-Bit Adressen SP ← SP + 2
(b) PC(21:0) ← STACK bei 22-Bit Adressen Sp ← SP + 3
|
Operanden: |
keine
|
Programmzähler: |
Siehe Operation
|
Words: |
1 (2 Byte)
|
Zyklen: |
4 (bei 16-Bit Adressen)
5 (bei 22-Bit Adressen)
|
16 Bit Operations Code: |
1001 0101 0001 1000
|
Flags im Status-Register (SREG):
I: |
Das I-Flag wird gesetzt, damit werden alle Interrupts global freigegeben.
|
Beispiel:
call sprung ;Unterprogramm ab Label sprung aufrufen
interrupt1:
push r3 ;R3 in Stack sichern
... ;die eigentliche Interrupt-Routine
pop r3 ;Alten Wert von R3 aus dem Stack zurückholen
reti ;Beenden die Interrupt-Routine und Rücksprung
;zum unterbrochenen Hauptprogramm
Syntax: |
RJMP k
|
Funktion: |
Dieser Befehl springt zu einer Adresse, die innerhalb des Bereiches von PC-2k+1 bis
PC+2k (Word) liegen kann. Bei der Assemblerprogrammierung werden anstatt der
relativen Adresse Labels verwendet. Bei Bausteinen, die über maximal 8k (4k Word)
Bytes Programmspeicher verfügen, kann der ganze Adressbereich von jeder Stelle aus
angesprochen werden.
|
Operation: |
PC ← PC + k + 1
|
Operanden: |
-2K ≤ k < 2K
|
Programmzähler: |
PC ← PC + 1
|
Words: |
1 (2 Byte)
|
Zyklen: |
2
|
16 Bit Operations Code: |
1100 kkkk kkkk kkkk
|
Flags im Status-Register (SREG):
Beispiel:
cpi r16,$42 ;Register R16 mit 42h vergleichen
brne fehler ;Sprung, wenn R16 ungleich 42h
rjmp ok ;Sprung, wenn R16 gleich 42h
fehler:
inc r16 ;R16 um eins erhöhen
...
ok:
nop ;Weiter, Leerbefehl
Syntax: |
ROL Rd
|
Funktion: |
Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach links geschoben.
Das Carry-Bit wird in das Bit 0 geschoben, das Bit 7 wird in das Carry-Flag geschoben.
In Kombination mit dem LSL - Befehl können so Mehrbyte-Zahlen mit 2 multipliziert
werden. Dieser Befehl arbeitet unabhängig vom Vorzeichen des Wertes in Rd.
|
Operation: |
|
Operanden: |
16 ≤ d ≤ 31
|
Programmzähler: |
PC ← PC + 1
|
Words: |
1 (2 Byte)
|
Zyklen: |
1
|
16 Bit Operations Code: |
0001 11dd dddd dddd
|
Flags im Status-Register (SREG):
H: |
Das H-Flag enthält nach dem Linksschieben das ursprüngliche Bit 3 des
Registers Rd.
|
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 nach dem Linksschieben entweder das N-Flag
oder das C-Flag gesetzt ist. Wenn beide Bits gleich sind, wird das V-Flag
gelöscht.
|
N: |
Das N-Flag wird gesetzt, wenn das MSB (Bit 7) des Ergebnisses gesetzt ist,
andernfalls wird es gelöscht.
|
Z: |
Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag
gelöscht.
|
C: |
Das C-Flag enthält nach dem Linksschieben das ursprüngliche Bit 7 des Rd
Registers.
|
Beispiel:
Multiplizieren des Registerpaares R16:R17 mit 2.
lsl r16 ;Multipliziert das Register R16
;durch Linksschieben mit 2.
rol r17 ;Multiplizieren des Registers R17
;incl Carry mit 2.
Syntax: |
ROR Rd
|
Funktion: |
Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach rechts
geschoben. Das Carry-Bit wird dabei in das Bit 7 geschoben, das Bit 0 wird
anschließend in das Carry-Bit geschoben. In Kombination mit dem ASR - Befehl kann
eine Division durch 2 mit vorzeichenbehafteten Mehrbyte - Werten vorgenommen
werden. Das Carry-Flag kann benutzt werden, um das Ergebnis zu runden.
|
Operation: |
|
Operanden: |
0 ≤ d ≤ 31
|
Programmzähler: |
PC ← PC + 1
|
Words: |
1 (2 Byte)
|
Zyklen: |
1
|
16 Bit Operations Code: |
1001 010d dddd 0111
|
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 entweder das N-Flag oder das C-Flag gesetzt ist.
Wenn beide Bits gleich sind, wird das V-Flag gelöscht.
|
N: |
Das N-Flag wird gesetzt, wenn das MSB (Bit 7) des Ergebnisses gesetzt ist,
andernfalls wird es gelöscht.
|
Z: |
Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag
gelöscht.
|
C: |
Das C-Flag wird gesetzt, wenn das Bit 0 im Register Rd vor dem Schieben
gesetzt war. War das Bit 0 vorher gelöscht, so wird auch das Carry-Flag gelöscht.
|
Beispiel:
lsr r19 ;Division des Registerpaares R19:R18
ror r18 ;durch 2. R19:R18 sind ohne Vorzeichen.
brcc zero0 ;Sprung, wenn Carry 0 ist.
oder:
asr r17 ;Division des Registerpaares R17:R16
ror r16 ;durch 2. R17:R16 sind mit Vorzeichen.
brcc zero1 ;Sprung, wenn Carry 0 ist.