Das vorliegende Buch ist der erste von zwei Bänden, die zusammen eine Ausarbei tung der Software Vorlesungen bilden, die ich jeweils im zweiten Studienjahr im Ne benfach Informatik an der Universität Ulm anbiete. Die Vorlesungen führen in ma schinennahe Programmierung ein. Dabei bedeutet maschinennahe Programmie rung eigentlich nur zum Teil die Beherrschung aller Bestandteile einer spezifischen Maschine. Viel wichtiger erscheint mir, daß darüber hinaus auch das Betriebssy stem, in unserem Fall also UNIX,l als Teil der gegebenen Maschine betrachtet wer den muß. Ich spreche deshalb lieber von systemnaher Programmierung. Im ersten Band werden die Werkzeuge vorgestellt, mit denen man typischerweise systemnahe Programmierung betreibt. Im zweiten Band wird dann mit diesen Werk zeugen der Umgang mit einem Betriebssystem erprobt. Beide Bände zusammen il lustrieren den Unterbau, auf dem die sogenannte problemorientierte Programmie rung erfolgt. Dem angehenden Software-Ingenieur soll in diesen Vorlesungen auch ein Gefühl für die Machbarkeit und Effizienz seiner problemorientierten Programme vermittelt werden. Der Leser sollte eine höhere Programmiersprache, zum Beispiel Pascal, einfache Datenstrukturen und problemorientierte Programmierung bereits einigermaßen be herrschen. Die Programmbeispiele beziehen sich ohne ausführliche Erklärungen auf Algorithmen, die üblicherweise in einer Vorlesung über problemorientierte Program mierung und Datenstrukturen besprochen werden.
Klappentext
Das vorliegende Buch ist der erste von zwei Bänden, die zusammen eine Ausarbeitung der Software Vorlesungen bilden, die ich jeweils im zweiten Studienjahr im Nebenfach Informatik an der Universität Ulm anbiete. Die Vorlesungen führen in maschinennahe Programmierung ein. Dabei bedeutet maschinennahe Programmierung eigentlich nur zum Teil die Beherrschung aller Bestandteile einer spezifischen Maschine. Viel wichtiger erscheint mir, daß darüber hinaus auch das Betriebssystem, in unserem Fall also UNIX,l als Teil der gegebenen Maschine betrachtet werden muß. Ich spreche deshalb lieber von systemnaher Programmierung. Im ersten Band werden die Werkzeuge vorgestellt, mit denen man typischerweise systemnahe Programmierung betreibt. Im zweiten Band wird dann mit diesen Werkzeugen der Umgang mit einem Betriebssystem erprobt. Beide Bände zusammen illustrieren den Unterbau, auf dem die sogenannte problemorientierte Programmierung erfolgt. Dem angehenden Software-Ingenieur soll in diesen Vorlesungen auch ein Gefühl für die Machbarkeit und Effizienz seiner problemorientierten Programme vermittelt werden. Der Leser sollte eine höhere Programmiersprache, zum Beispiel Pascal, einfache Datenstrukturen und problemorientierte Programmierung bereits einigermaßen beherrschen. Die Programmbeispiele beziehen sich ohne ausführliche Erklärungen auf Algorithmen, die üblicherweise in einer Vorlesung über problemorientierte Programmierung und Datenstrukturen besprochen werden.
Inhalt
1 Rechnerarchitekturen.- 1.1 Architektur im Großen.- 1.2 Architektur im Kleinen.- 1.3 Typische Maschinen.- 1.3.1 0-Adreß-Maschine.- 1.3.2 1-Adreß-Maschine.- 1.3.3 2-Adreß-Maschine.- 1.3.4 Registermaschine.- 1.3.5 3-Adreß-Maschine.- 1.4 Adressierung.- 1.4.1 Direkte Adressen.- 1.4.2 Indirekte Adressen.- 1.4.3 Indexadressen.- 1.4.4 Relative Adressen.- 1.4.5 Stack-Adressen.- 1.5 Sprungbefehle.- 1.6 Werkzeuge zur Programmierung.- 2 Assembler-Programmierung.- 2.1 Aufgaben eines Assemblers.- 2.2 Euklid's Algorithmus.- 2.3 Quellformat.- 2.4 Assembler-Anweisungen.- 2.5 Algebraische Formeln.- 2.6 Vektorrechnung.- 2.7 Kontrollstrukturen.- 2.7.1 Sprungbefehle und Condition Codes.- 2.7.2 Einfache Kontrollstrukturen.- 2.7.3 Kompliziertere Bedingungen.- 2.8 Unterprogramme.- 2.9 Funktionsweise eines Assemblers.- 2.10 Ausblick.- 3 Programmierung mit Makros.- 3.1 Begriffe und Einsatzgebiete.- 3.2 Definition von Konstanten.- 3.3 Funktionsweise eines Makroprozessors.- 3.4 Standards und Makrobüchereien.- 3.5 Ersatz von Befehlen.- 3.6 Schnittstellen.- 3.7 Makros als Variablen.- 3.8 Spracherweiterungen.- 3.9 Kontrollstrukturen.- 3.9.1 Definition.- 3.9.2 Anwendungsbeispiel.- 3.9.3 Implementierung.- 3.10 Ausblick.- 4 Die Programmiersprache C.- 4.1 Entwicklungsgeschichte.- 4.2 Das Prinzip der L-Werte.- 4.3 Ein erstes Beispiel.- 4.4 Übersetzuna und Ausführuna.- 4.5 Quellformat.- 4.6 Programmstruktur.- 4.6.1 Vereinbarungen.- 4.6.2 Funktinnen.- 4.6.3 Der gute Ton.- 4.7 Ein- und Ausgabe.- 4.7.1 Ausgabe printf.- 4.7.2 Eingabe scanf.- 4.8 Parameterübergabe.- 4.9 Euklid's Alaorithmus.- 4.9.1 Skalare int Variablen.- 4.9.2 Steuerzeichen.- 4.9.3 Einfache Anweisungen.- 4.9.4 Einfache Kontrollstrukturen.- 4.10 Operatoren.- 4.11 Funktionen.- 4.12 Maximum einer Liste von Zahlen.- 4.12.1 Vektoren, konventionell betrachtet.- 4.12.2 Der C Preprozessor.- 4.12.3 Die for Schleife.- 4.12.4 Ein Vektor als Parameter.- 4.12.5 Initialisierung von Variablen.- 4.12.6 Inkrement- und Dekrementoperatoren.- 4.13 Ausblick.- 5 Vektoren, Zeichenketten und Zeiger.- 5.1 Begriffe.- 5.2 Deklaratoren.- 5.3 Ein primitiver Textspeicher.- 5.4 Der Datentyp char.- 5.5 Die Speicherklassen register und auto.- 5.6 7eicheneinaabe.- 5.7 Zeichen sind Integer-Werte.- 5.8 Das Resultat einer Zuweisung.- 5.9 Logische Verknüpfungen.- 5.10 Zeigerwerte und Zeichenketten.- 5.11 Einfache Zeigeroperationen.- 5.12 Zeichenfunktionen.- 5.13 Zeiger als Parameter.- 5.14 Arithmetik mit Zeigern.- 5.15 Operationen mit Zeichenketten.- 5.16 Parameter im Hauptprogramm.- 5.16.1 Das Kommando echo.- 5.16.2 Die Verarbeitung von Optionen.- 5.16.3 Beliebig viele Optionen.- 5.16.4 Ein Makro mit Parameter.- 5.16.5 Optionen und Texte gemischt.- 5.17 Umwandlungen : Zeiger sind keine Integer.- 5.18 Mehrdimensionale Vektoren.- 6 Modulare Programmierung.- 6.1 Problemstellung.- 6.2 Das Hauptprogramm.- 6.3 Externe Vereinbarungen.- 6.4 Sortieralgorithmen.- 6.4.1 Der bubble sort Algorithmus.- 6.4.2 Der quick sort Algorithmus.- 6.5 Ein Datenmodul für Zahlen.- 6.5.1 Eigene Datentypen typedef.- 6.5.2 Die Speicherklasse static.- 6.5.3 Restliche Überlegungen.- 6.5.4 Gleitkommaoperationen.- 6.5.5 Bedingte Übersetzung.- 6.6 Ein Datenmodul für Worte.- 6.7 Dynamische Speicherverwaltung.- 6.8 Programmanagement.- 6.8.1 Quellen verwalten make.- 6.8.2 Der Büchereimanager ar.- 6.8.3 make für Fortgeschrittene.- 6.8.4 make und Büchereien.- 7 Strukturen, Varianten und Bit-Felder.- 7.1 Begriff und Zweck.- 7.2 Sprachliche Konzepte.- 7.2.1 Strukturen.- 7.2.2 Operationen mit Strukturen.- 7.2.3 Bit-Felder.- 7.2.4 Varianten.- 7.3 Datenerfassung mit Masken.- 7.3.1 Terminal-Operationen mask/crt.c.- 7.3.2 Problemstellung mask/mask.h.- 7.3.3 Initialisierung mask/schirm.c.- 7.3.4 Traversierung zur Ausgabe mask/put.c.- 7.3.5 Traversierung zur Eingabe mask/get.c.- 7.4 Verarbeitung von Formeln.- 7.4.1 Problemstellung.- 7.4.2 Definitionen calc/calc.h.- 7.4.3 Hauptprogramm calc/calc.c.- 7.4.4 Eingabe calc/getsym.c.- 7.4.5 Syntaxanalyse calc/ausdruck.c.- 7.4.6 Ausgabe calc/infix.c.- 7.4.7 Bewertung calc/eval.c.- 7.5 Ausblick.- Anhang A Computer-Arithmetik.- A.1 Übersicht.- A.2 Natürliche Zahlen.- A.2.1 Addition.- A.2.2 Basisumwandlungen.- A.3 Zahlen mit Vorzeichen.- A.4 Komplementdarstellungen.- A.5 Basis-1-Komplement.- A.5.1 Umwandlunaen und Umkehr des Vorzeichens.- A.5.2 Addition.- A.6 Basiskomplement.- A.6.1 Addition.- A.6.2 Umkehr des Vorzeichens und Umwandlungen.- A.6.3 Beispiele.- A.7 Andere Darstellungen.- A.7.1 Basiskomplement mit umgekehrtem Vorzeichen.- A.7.2 Dezimal codierte Darstellung.- Anhang B Details zum nad Prozessor.- B.1 Übersicht.- B.2 Aufruf des nad Systems.- B.3 Quellformat.- B.4 Assembler-Anweisungen.- B.5 Allgemein verfügbare Befehle.- B.6 0-Adreß-Maschine.- B.7 1-Adreß-Maschine.- B.8 2-Adreß-Maschine.- B.9 3-Adreß-Maschine.- B.10 Reaistermaschine.- B.11 Adressen.- B.12 Arithmetische Ausdrücke.- Anhang C Details zum tec Prozessor.- C.1 Über…