MezData-Logo 317 Creative Commons License Lösungen Button :AVR: Rechnen in Assembler

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

Arithmetische Befehle

Nehmen Sie den AVR Befehlssatz zur Hand. Für die Berechnung ist ein 8-Bit-Zahlenraum ausreichend.

FrageWelcher Befehl ist für Differenz (a-3) am geeignetsten und warum?

Immediate-Adressierung

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).

FrageWie kann ohne Multiplikations-Unit mit 2 multipliziert werden?

Bit-Befehle

FrageBetrachten Sie folgende Befehle und überlegen Sie ob sie für eine Multipikation mit 2 geeignet sind: LSL, LSR, ROL, ROR, ASR

Logische Befehle taugen auch zum Rechnen

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

FrageMit 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!

Rechen-Befehle kosten Zeit

FrageErmitteln Sie die Ausführungszeit Ihres Berechnungs-Programms in Taktzyklen.

 Übung und Training

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...