Titelbild Mikrocontroller

I-Befehle


oben ICALL - Indirect Call to Subroutine

Syntax: ICALL
Funktion: Dieser Befehl ruft ein Unterprogramm auf, das über den Z-Pointer adressiert wird. Da das Z-Register ein 16 Bit - Register ist, können auch in Bausteinen mit 22 Bit breiter Adresse nur die unteren 64k adressiert werden. Die Rücksprungadresse wird im STACK zwischengespeichert. Dieser Befehl ist nicht in allen Bausteinen verfügbar.
Operation: (a) bei 16 Bit Adressen
PC(15:0) ← Z(15:0)
STACK ← PC + 1
SP ← SP - 2
(b) bei 22 Bit Adressen
PC(15:0) ← Z(15:0), PC(21:16) ← 0
STACK ← PC + 1
SP ← SP - 3
Operanden: keine
Programmzähler: siehe Operation
Words: 1 (2 Byte)
Zyklen: (a) 3
(b) 4
16 Bit Operations Code: 1001 0101 0000 1001

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

Beispiel:
ldi r30,$00    ;Low-Byte Z-Pointer laden
ldi r31,$10    ;High-Byte Z-Pointer laden
icall        ;Unterprogramm an Adresse 1000h aufrufen

oben IJMP - Indirect Jump

Syntax: IJMP
Funktion: Dieser Befehl springt zu einer Adresse, die über den Z-Pointer adressiert wird. Da das Z- Register ein 16 Bit - Register ist, können auch in Bausteinen mit 22 Bit breiter Adresse nur die unteren 64k adressiert werden. Dieser Befehl ist nicht in allen Bausteinen verfügbar.
Operation: (a) PC(15:0) ← Z(15:0), bei 16 Bit Adressen
(b) PC(15:0) ← Z(15:0), PC(21:16) ← 0 bei 22 Bit Adressen
Operanden: keine
Programmzähler: siehe Operation
Words: 1 (2 Byte)
Zyklen: 2
16 Bit Operations Code: 1001 0100 0000 1001

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

Beispiel:
ldi r30,$00    ;Low-Byte Z-Pointer laden
ldi r31,$10    ;High-Byte Z-Pointer laden
ijmp        ;Sprung an Adresse 1000h

oben IN - Load an I/O-Location to Register

Syntax: IN Rd,A
Funktion: Dieser Befehl lädt Daten aus dem I/O-Speicher (Ports, Timer, etc) in das Register Rd.
Operation: Rd ← Rd,I/O(A)
Operanden: 0 ≤ d ≤ 31, 0 ≤ A ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1011 0AAd dddd AAAA

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

Beispiel:
in r30,$16    ;Liest die Eingangspins von Port B in das Register R30

oben INC - Increment

Syntax: INC Rd
Funktion: Dieser Befehl addiert eine 1 zum Inhalt des angegebenen Registers und legt das Ergebnis im Register ab. Das Carry-Flag wird dabei nicht verändert, so dass der Befehl in einem Schleifenzähler verwendet werden kann, ohne die eigentlichen Berechnungen zu beeinflussen.
Wenn mit vorzeichenlosen Werten gearbeitet wird, arbeiten nur die BREQ- und BRNE- Verzweigungsbefehle korrekt. Wenn mit Zweierkomplement-Werten gearbeitet wird, können alle vorzeichenbehaftete Verzweigungsbefehle verwendet werden.
Operation: Rd ← Rd + 1
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 010d dddd 0011

Flags im Status-Register (SREG):
ITH S V N Z C
----
S: Das S-Flag wird gesetzt, wenn entweder das V-Flag oder das N-Flag gesetzt ist. Wenn beide Bits 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. Ein Zweierkomplement- Überlauf kann nur auftreten, wenn Rd vor der Operation den Wert 80h hatte.
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:
    ldi r3,$00    ;Das Register R3 mit 00h laden
loop:
    inc r3        ;R3 um 1 erhöhen
    cpi r3,$7A    ;Vergleichen, ob R3 = 7Ah
    brne loop    ;Verzweigung zum Label loop, solange R3 ≠ 7Ah
    nop         ;Weiter, wenn R3 = 7Ah

Impressum