317
|
Synopsis: [ AVR Befehlssatz ] [ wikipedia.org/wiki/Pipeline-Architektur ] Problem: Es soll ein Ausdruck mit AT90S2313 berechnet werden: b = (a - 3) * 2 + (a % 4). % ist die Modulo-Funktion. Folgender Quellcode ist schon gegeben: |
.include "2313def.inc" .def a = R16 ;R16 als Variable a .def b = R17 ;R17 als Variable b .def tmp1 = R18 ;R18 als Hilfs-Variable .def tmp2 = R19 ;R19 als Hilfs-Variable ldi a,11 ;lade 11 in a |
Nehmen Sie den AVR Befehlssatz zur Hand. Für die Berechnung ist ein 8-Bit-Zahlenraum ausreichend.
Welcher Befehl ist für Differenz (a-3) am geeignetsten und warum?
Immediate (engl.) bedeutet soviel wie unmittelbar, unverzüglich. Der zweite Operand steht nicht in einem Register sondern ist bereits im Befehl enthalten.
Bei RISC-Architekturen wird versucht die Länge, den Speicherplatz der Befehle gleich gross zu machen, das hat entscheidende Vorteile beim Pipelining. AVR-Befehle haben eine Länge von 16 Bit d.h. einen 16 Bit-Op-Code (Operation-Code). In den 16 Bit muss der Operator und die Operanden kodiert werden, das hat leider Konsequenzen:
| Syntax | Benennung | Operation | Operanden | 16 Bit-Op-Code |
|---|---|---|---|---|
| subi Rd, K8 | Subtract Immediate | Rd:=Rd - K8 | 16 ≤ d ≤ 31, 0 ≤ K8 ≤ 255 | 0101 KKKK dddd KKKK |
Bei einem 8 Bit µC sollte ein Immediate-Operand auch 8 Bit Breite (K8) haben. Somit bleiben von den 16 Bit nur noch 8 übrig für die Kodierung des Operators und des Registers. Atmel hat sich entschieden 4 Bit für die Register-Adressierung zu verwenden (dddd), somit wurden nicht alle 32 sondern nur die oberen 16 Register für Immediate-Operationen verfügbar (beachte die * hinter den Beschreibungen im Befehlssatz).
Wie kann ohne Multiplikations-Unit mit 2 multipliziert werden?
Betrachten Sie folgende Befehle und überlegen Sie ob sie für eine Multipikation mit 2 geeignet sind: LSL, LSR, ROL, ROR, ASR
Es gibt keinen % Operator im Befehlssatz. Der Modulo-Operator (%) ermittelt den Rest einer Division. Betrachte folgende Beispiele auf Bit-Ebene und lass Dich erleuchten:
| n | n2 | n % 4 | (n % 4)2 | Berechnung |
|---|---|---|---|---|
| 1 | 0001 | 1 | 0001 | 1 / 4 = 0 Rest 1 |
| 2 | 0010 | 2 | 0010 | 2 / 4 = 0 Rest 2 |
| 5 | 0101 | 1 | 0001 | 5 / 4 = 1 Rest 1 |
| 10 | 1010 | 2 | 0010 | 10 / 4 = 2 Rest 2 |
Mit welchem logischen Befehl lässt sich genau so eine Berechnung erreichen?
Erstellen Sie ein Programm zur Berechnung des Problem-Ausdrucks und testen Sie Ihre Lösung mit sinnvollen Werten!
Ermitteln Sie die Ausführungszeit Ihres Berechnungs-Programms in Taktzyklen.
Erstellen Sie ein Programm zur Berechnung von b = (a + 2) / 4 und testen Sie Ihre Lösung mit sinnvollen Werten!
Erstellen Sie ein Programm zur Berechnung von b = a % 2 und testen Sie Ihre Lösung mit sinnvollen Werten!
Erstellen Sie ein Programm zur Berechnung von b = a * 3 und testen Sie Ihre Lösung mit sinnvollen Werten!
© Oliver Mezger 27.06.2006 MezData.de Den Kontakt herstellen...