Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

AVR-Assembly-Programmierung: Grundlagen für COMP9032 Lab 1

Lerne die Grundlagen der AVR-Assembly-Programmierung für COMP9032 Lab 1: Register, Befehle, signed/unsigned Zahlen, ASCII-Konvertierung, Schleifen und Makros – mit praktischen Beispielen und Tipps für Microchip Studio.

AVR-Assembly Programmierung COMP9032 Lab 1 signed binary to decimal AVR Befehle Assembly Tutorial Deutsch Mikrocontroller Programmierung Gcd Berechnung Assembly Makros AVR Assembly AVR Register Microchip Studio Assembly Embedded Systems Grundlagen AVR Assembler lernen unsigned integer AVR Assembly für Anfänger AVR Programmierung Beispiel Euklidischer Algorithmus Assembly

Einführung in die AVR-Assembly-Programmierung

Willkommen zum Tutorial für COMP9032 Lab 1 – Mikroprozessoren und Interfacing. In diesem Lab lernst du, wie du mit AVR-Assembly arbeitest, grundlegende AVR-Befehle anwendest und eigene Programme schreibst. Assembly ist zwar auf den ersten Blick komplex, aber es gibt dir die volle Kontrolle über die Hardware – ähnlich wie ein E-Sport-Profi, der jeden Tastendruck optimiert, um Millisekunden herauszuholen.

Warum Assembly heute noch relevant ist?

In Zeiten von KI-Apps und Hochsprachen wie Python mag Assembly altmodisch wirken. Doch in eingebetteten Systemen, Mikrocontrollern und energieeffizienten Geräten ist Assembly unverzichtbar. Stell dir vor, du entwickelst einen Fitness-Tracker, der mit einer Knopfzelle monatelang läuft – jede Instruktion zählt. Genau das trainierst du in diesem Lab.

Grundlagen der AVR-Architektur

AVR-Mikrocontroller haben einen RISC-Kern mit 32 8-Bit-Registern (R0 bis R31). Jedes Register kann direkt vom Prozessor angesprochen werden. Für deine Programme sind besonders die unteren Register (R0–R15) und die oberen (R16–R31) wichtig, da einige Befehle nur mit letzteren arbeiten.

Wichtige AVR-Befehle für Lab 1

  • MOV Rd, Rs – Kopiert den Wert von Quelle Rs nach Ziel Rd.
  • LDI Rd, K – Lädt eine 8-Bit-Konstante K in ein Register (nur R16–R31).
  • ADD Rd, Rs – Addiert Rs zu Rd.
  • SUB Rd, Rs – Subtrahiert Rs von Rd.
  • CPI Rd, K – Vergleicht Rd mit Konstanten K.
  • BRNE Label – Springt zu Label, wenn das Zero-Flag nicht gesetzt ist.
  • AND Rd, Rs – Bitweises UND.

Diese Befehle sind das Handwerkszeug, um Rechenoperationen wie signed binary to decimal conversion oder Gcd-Berechnung umzusetzen.

Task 1: Vorzeichenbehaftete Binärzahl in Dezimal-ASCII umwandeln

Deine erste Aufgabe: Ein signed binary number (z.B. 11111011 in R3) in eine Dezimaldarstellung mit Vorzeichen umwandeln und als ASCII-Zeichen in Registern speichern. Das Ergebnis „-5“ wird als zwei ASCII-Bytes (0x2D für '-' und 0x35 für '5') in R4:R5 abgelegt.

Vorgehen

  1. Prüfe das höchste Bit (Bit 7) des Registers: Ist es 1, ist die Zahl negativ. Setze ein Vorzeichenflag und bilde das Zweierkomplement (alle Bits invertieren + 1 addieren).
  2. Wandle den positiven Betrag in Dezimalziffern um: Teile wiederholt durch 10 und speichere die Reste als ASCII (Rest + 0x30).
  3. Füge das Minuszeichen hinzu, falls nötig.
  4. Speichere die Zeichen in aufsteigenden Registern (z.B. R4, R5, …).

Ein Beispiel mit der Zahl 5 (binär 00000101): Kein Vorzeichen, Division: 5/10 = 0 Rest 5 → '5' in R4. Fertig.

Dieser Prozess ähnelt dem Debuggen einer App: Du prüfst den Zustand (Vorzeichen), führst eine Transformation durch (Dezimalumwandlung) und speicherst das Ergebnis strukturiert.

Task 2: Ganzzahlige Quadratwurzel berechnen

Berechne a√a für ein 8-Bit-unsigned-Byte a, das Ergebnis wird abgerundet. Für a=5: 5√5 ≈ 11,18 → 11. Diese Berechnung ist nützlich in der Spieleentwicklung, z.B. um Distanzen in einer 2D-Welt zu approximieren.

Algorithmus in Assembly

Da AVR keine Multiplikation oder Wurzel als Befehl hat, musst du eine iterative Methode verwenden:

; Pseudocode: Ergebnis = 0; solange (Ergebnis+1)*(Ergebnis+1) ≤ a* a? ; Nein, besser: Berechne a*a, dann Wurzel durch Subtraktion ungerader Zahlen.

Praktischer: Verwende die Babylonische Methode oder einfaches Durchzählen. Für kleine Zahlen reicht eine Schleife, die solange zählt, bis das Quadrat des Zählers größer als a*a ist.

Tipp: Nutze die Register R16–R31 für Konstanten und Zwischenergebnisse, da du dort LDI verwenden kannst.

Task 3: GCD eines Arrays mit Makros

Der größte gemeinsame Teiler (GCD) von zwei Zahlen lässt sich mit dem euklidischen Algorithmus berechnen. Für ein Array von bis zu 15 Elementen (Länge in R0, Elemente in R1–R15) sollst du den GCD aller Zahlen ermitteln. Die Besonderheit: Du musst Makros verwenden, um den Code lesbarer zu machen.

Makros in AVR-Assembly

Makros sind wie Funktionen, die zur Compile-Zeit expandiert werden. Du definierst sie mit .macro und .endmacro. Beispiel:

.macro GCD_STEP
    mov temp, @0
    sub temp, @1
    brpl positive
    ; ...
.endmacro

Makros helfen, wiederkehrende Codeblöcke zu kapseln – ähnlich wie du in einer KI-App wiederkehrende Aufgaben in Funktionen auslagerst.

GCD-Algorithmus

  1. Lade das erste Element als aktuellen GCD.
  2. Durchlaufe die restlichen Elemente und berechne jeweils den GCD mit dem aktuellen Wert.
  3. Der euklidische Algorithmus: while (b != 0) { r = a % b; a = b; b = r; } – in Assembly realisierst du das mit Subtraktionen und Schleifen.

Beispiel: Array {12, 8, 4}: GCD(12,8)=4, GCD(4,4)=4 → Ergebnis 4.

Denke daran, die Register R0–R15 für die Array-Elemente zu nutzen und Hilfsregister aus R16–R31 zu wählen.

Praktische Tipps für Microchip Studio

  • Setze vor dem Testen die Registerwerte manuell über die Registeransicht (View → Registers).
  • Nutze Breakpoints und Step-Over, um den Programmfluss zu verfolgen.
  • Achte auf die Kommentare: Erkläre das „Warum“, nicht nur das „Wie“. Das hilft dir und anderen beim Verstehen.
  • Verwende konsistente Einrückungen und Labels, um die Lesbarkeit zu erhöhen.

Trend-Beispiel: Assembly in der Robotik

Stell dir vor, du programmierst einen autonomen Rasenmäher – ein Trendprodukt im Sommer 2026. Der Mikrocontroller muss Sensordaten in Echtzeit verarbeiten und Motoren ansteuern. Eine effiziente Assembly-Routine für die signed binary conversion könnte die Entfernung zu einem Hindernis in eine Dezimalzahl umwandeln, die dann auf einem Display angezeigt wird. Oder die Gcd-Berechnung wird genutzt, um die optimale Anzahl von Umdrehungen für die Räder zu synchronisieren.

Häufige Fehler und wie du sie vermeidest

  • Vergessen des Vorzeichenbits: Bei signed Zahlen immer Bit 7 prüfen.
  • Registerkonflikte: Verwende nicht versehentlich dasselbe Register für zwei Zwecke.
  • Endlosschleifen: Setze Schleifenzähler korrekt und vergiss nicht die Abbruchbedingung.
  • Makro-Expansion: Achte darauf, dass Makros nicht zu groß werden und die Lesbarkeit beeinträchtigen.

Zusammenfassung

In diesem Lab lernst du die essenziellen Grundlagen der AVR-Assembly-Programmierung: von der signed binary number conversion über unsigned integer arithmetic bis hin zur GCD-Berechnung mit Makros. Diese Fähigkeiten sind nicht nur für die Prüfung wichtig, sondern auch für reale Anwendungen in der Embedded Systems-Entwicklung. Nimm dir Zeit, die Konzepte zu verstehen, und scheue dich nicht, im Simulator zu experimentieren. Viel Erfolg!