ICALL - Indirect Call to Subroutine
IJMP - Indirect Jump
IN - Load an I/O-Location to Register
INC - Increment
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 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
ldi r30,$00 ;Low-Byte Z-Pointer laden ldi r31,$10 ;High-Byte Z-Pointer laden icall ;Unterprogramm an Adresse 1000h aufrufen
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 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
ldi r30,$00 ;Low-Byte Z-Pointer laden ldi r31,$10 ;High-Byte Z-Pointer laden ijmp ;Sprung an Adresse 1000h
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 |
I | T | H | S | V | N | Z | C |
---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - |
in r30,$16 ;Liest die Eingangspins von Port B in das Register R30
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 |
I | T | H | 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. |
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