| Inhalt von Kapitel 2 |  | 2.2 Entwicklungswerkzeuge |

2.1/1

## 2 Einführung in die Assemblerprogrammierung und Software-Entwicklungswerkzeuge

## 2.1 Einleitung

Programmiersprachen können in der Informatik in zwei Klassen eingeteilt werden. 1) Bei maschinenorientierten Sprachen (Assemblersprachen) bestehen die Programme aus prozessorspezifischen Befehlen. Dies bedeutet, das Programm läßt sich nur für einen speziellen Prozessortyp, höchstens für eine ganze Prozessorfamilie, verwenden. Im Gegensatz hierzu wird von "höheren" oder "problemorientierten" Programmiersprachen gesprochen, wenn die Programme aus Anweisungen bestehen, die unabhängig von einer bestehenden Prozessorfamilie definiert worden sind. Diese Sprachen sind hardwareunabhängig und orientieren sich an den zu bearbeitenden Problemfeldern. Vergleicht man diese beiden Klassen von Programmiersprachen, so zeigen sich folgende Unterschiede:

- Maschinenorientierte Programmiersprachen beinhalten einen speziellen auf den Prozessor oder die Prozessorfamilie zugeschnittenen Befehlsvorrat. Eine Portierung des Programms auf eine andere Prozessorfamilie oder auf einen Prozessor eines anderen Herstellers erfordert in der Regel ein völliges Neuschreiben des Programms. Hochsprachenprogramme hingegen können wegen ihres normierten Sprachumfanges leicht auf andere Systeme portiert werden.
- Programme, die in einer Assemblersprache geschrieben worden sind, sind schwerer zu verstehen, da der zugrundeliegende Algorithmus in einer "maschinengerechteren", hardwarenahen Beschreibung vorliegt (Laden von Operanden in Prozessorregister, Stackoperationen, usw). Dagegen lassen sich in Hochsprachen Algorithmen abstrakter formulieren und einfacher modellieren (imperative, funktionale, prädikative Sprachen).
- Um optimal in einer maschinenorientierten Sprache programmieren zu können, ist ein fundiertes Wissen über den logischen Aufbau des zugrundeliegenden Prozessors nötig. Bei höheren Programmiersprachen ist dies nicht notwendig, da diese hardwareunabhängig sind.
- Maschienenorientierte Programme können effizienter gestaltet werden, da sie die speziellen, leistungssteigernden Strukturen und Befehle des Prozessors optimal nutzen können. Nicht alle Aufgabenstellungen sind in einer höheren Programmiersprache effizient lösbar, dies gilt besonders für systemnahe und zeitkritische Abläufe (Betriebssysteme, Automatisierungs- und Industrieanwendungen).
- Hochsprachen stellen Kontrollkonstrukte für die Programmierung zur Verfügung. In maschinenorientierten Sprachen müssen diese nachgebildet werden.
- Hochsprachenprogramme werden durch Compiler und Interpreter auf das Zielsystem übersetzt, maschinenorientierte Programme durch einen Assembler.

2.1/2

Beiden Klassen ist gemeinsam, daß ein Programmierer, der Algorithmen in einer maschinenorientierten oder in einer höheren Programmiersprache exakt ausdrücken will, diese Sprache syntaktisch und semantisch beherrschen muß. Syntax ist hierbei die "Lehre vom Satzbau". Ein Programm muß, im Sinne der verwendeten Programmiersprache, grammatikalisch richtig geschrieben sein, damit der Übersetzer (Compiler, Assembler) das Programm lesen und korrekt auf das Zielsystem übersetzen kann. Syntaktische Fehler werden vom Übersetzer erkannt und durch Fehlermeldungen angezeigt. Semantik ist die "Lehre von der inhaltlichen Bedeutung" einer Sprache. Das heißt, alle Befehle, Anweisungen und Ausdrücke einer Sprache muß der Programmierer in ihren Aktionen, Auswirkungen und Einflußnahmen auf andere Teile der Sprache richtig verstanden haben, damit er ein korrekt arbeitendes Programm schreiben kann. Semantische Fehler werden von einem Übersetzerprogramm nicht erkannt.

Die Entwicklung von Programmen stellt, in der Sprache der Softwaretechnik (Software-Engineering), einen kreativen und ingenieurmäßig ablaufenden Prozeß unter Anwendung von "Prinzipien, Methoden und Techniken" für die Implementierung von Programmen und Programmsystemen dar. Ein Programm soll benutzerfreundlich, zuverlässig, wartbar, anpaßbar sowie erweiterbar sein. Der Lebenszyklus von Software wird meistens nach Bild 2.1-1 beschrieben.

Bild 2.1-1: | Software-Lebenszyklus |

2.1/3

Am Anfang der Entwicklung steht das "Problem", das vom Programmentwickler analysiert und in seiner Komplexität vollständig erkannt werden muß. Hieraus ergibt sich der erste Entwurf einer algorithmischen Lösung des Problems, die nach Anpassungen an die verwendete Programmiersprache in eine Implementierung mündet. Nach ausführlichen Tests und Dokumentation der Software wird das Programmsystem dem Anwender als korrekt arbeitendes Programm übergeben. Da die heutige Lebensdauer eines größeren Programmpaketes ca. 10 - 20 Jahre beträgt, wird das Paket nach Fertigstellung gepflegt, wiederholt erweitert und an die Wünsche der Anwender angepaßt.

Eine Verfeinerung des Abschnittes "Implementierung" von Bild 2.1-1 stellt das folgende Bild dar. Es zeigt einen allgemeinen Software-Entwicklungszyklus, in dem neben Assemblerprogrammen, C-Programme mit ihren Include-Dateien (H-Dateien) sowie Bibliotheken Verwendung finden. Hilfsdateien, wie z.B. "Make-Files", wurden nicht in das Bild aufgenommen.

Bild 2.1-2: | Software-Entwicklungszyklus |

2.1/4

Bei komfortablen Entwicklungsumgebungen (insbesondere bei Umgebungen, die Digitale Signalprozessoren unterstützen) können verschiedene Zielarchitekturen definiert werden. Dies muß vor dem Übersetzen und Linken der Programme erfolgen, damit die erzeugten Maschinenprogramme auf der gewünschten Architektur korrekt ablaufen. Nach Erstellung der Quellprogramme werden Assemblerprogramme assembliert und Hochsprachen-Programme kompiliert (Unterabschnitte 2.2.1 und 2.2.3).

Der Linker bindet alle Teilprogramme in der richtigen "Art und Weise" (Unterabschnitt 2.2.2) zu einem ausführbaren Programm zusammen. Der erzeugte Maschinencode kann dann auf einem Simulator, einem Emulator oder direkt auf der Zielarchitektur ausgetestet werden. Werden semantische Fehler festgestellt (syntaktische Fehler sollten bei der Übersetzung moniert worden sein), so ist das fehlerhafte Quellprogramm zu korrigieren und neu zu übersetzen. Nach einem erneuten Linken ist das Programm auf den behobenen Fehler und etwaige Seiteneffekte zu überprüfen. Wird das Programm als korrekt angenommen, kann es abgespeichert werden, oder in ein EPROM programmiert werden. Zum Beispiel befinden sich die Monitorroutinen des Praktikumsrechners in einem EPROM, das in den Adressbereich $E000 - $FFFF des Rechners eingeblendet wird.

Im folgenden Abschnitt wird eine kurze Übersicht über die in der Industrie verwendeten Entwicklungstools zur Erstellung von Software-Paketen gegeben. Auf die Beschreibung von Hilfsprogrammen, wie Editoren, Make-, Touch- und Grep-Programmen, wurde verzichtet. Abschnitt 2.3 führt in die Assemblerprogrammierung ein, während Abschnitt 2.4 die im Praktikum für den 6809-Prozessor verwendeten Entwicklungstools beschreibt. Abschnitt 2.5 diskutiert schließlich einige praktische Beispiele zur Assemblerprogrammierung.

| Inhalt von Kapitel 2 |  | 2.2 Entwicklungswerkzeuge |