Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Seiteneffekte

Die Programmierung auf Assemblerebene birgt eine Menge von Fehlermöglichkeiten, die besonders von unerfahrenen Programmierern nicht oder zu wenig erkannt werden. Einer dieser Programmfehler, die oft erst sehr spät erkannt werden, sind so genannte Seiteneffekte. Darunter versteht man Wirkungen eines Unterprogramms, die neben dem eigentlichen Ziel des Unterprogramms ungewollt auftreten und meist in der aktuellen Applikation nicht in Erscheinung treten. Erst wenn man das Unterprogramm an einer anderen Programmstelle nochmals verwendet, kommt es vielleicht zu einem seltsamen Verhalten des Gesamtprogramms (z.B. läuft das Programm bei gleichen Anfangsbedingungen nicht immer gleich ab).

Solche Seiteneffekte beruhen oft auf veränderten Flags oder Registern, die dann im Hauptprogramm unterschiedliche Verhaltensweisen auslösen können. Auch ist die Veränderung von globalen Variablen oft die Ursache von Seiteneffekten. Einzige Abhilfe gegen solche unerwartete Effekte ist entweder, das jeweilige Unterprogramm rigoros zu dokumentieren, was sehr zeitaufwendig sein kann, oder sich zur Gewohnheit zu machen, Registerinhalte nur dann zu verändern, wenn dies aus der Funktion eines Unterprogramms erwartet wird. Benötigt man Register oder Variable nur innerhalb eines Unterprogramms, so sollte man diese zu Beginn eines Unterprogramms am Stack sichern und am Ende des Unterprogramms wieder vom Stack restaurieren.

Das folgende Programmbeispiel zeigt eine verbesserte Version des kleinen, oben gezeigten Delay-Programms, das nun keine Register mehr ändert. Dazu werden alle im Unterprogramm benötigten Register auf dem Stack gesichert (PUSH) und am Ende wieder hergestellt (POP).

DELAY:      PUSH        HL          ;HL sichern
            PUSH        AF          ;AF sichern
DEL1:       DEC         HL          ;Parameter dekrementieren
            LD          A,L         ;Überprüfung ob gleich 0
            OR          H
            JR          NZ,DEL1     ;Wiederholung bis HL=0
            POP         AF          ;AF wiederherstellen
            POP         HL          ;HL wiederherstellen
            RET


Last Update: 2008-05-31