Kapitel 6 - Maschinensprache und Assembler

Durch das Studium von Maschinensprache und Befehlsdecoder der Hack-CPU lernen wir, wie das Konzept der Speicherprogrammierung physikalisch auf Basis der sequentiellen Logik realisiert werden kann. Den Übergang zu symbolischer Programmierung liefert die Assemblersprache, welche die Maschinensprache mit Hilfe von Opcodes menschenlesbar macht. Ein Assembler als Übersetzungsprogramm liefert noch weitere Komfortfunktionen, wie Sprunglabel und Variablennamen. Optional schauen wir uns mit dem Mororola 68000 noch kurz die Assemblersprache eines realen Prozessors im Vergleich an.

Inhalt

Abschnitt 1 - Hack-Maschinensprache

Folien 1-20

Anweisungen in der Hack-Maschinensprache sind 16 Bit lang, und unterteilen sich in A- und C-Anweisungen (Adress und Compute). Wir schauen uns die Semantik der Maschinensprache an, d.h. welche Sequenz von Bits welche Anweisung codieren soll, und wie diese Semantik mittels einer geeigneten Implementation des Befehlsdecoders auf der Architektur der Hack-CPU realisiert wird. Der Befehlsdecoder berechnet dabei Boolesche Funktionen der Instruktionsbits, und leitet die Ergebnisse auf die Steuerleitungen der Funktionseinheiten der CPU weiter.


Index

00:00 Einleitung, Inhalt des Kapitels
02:48 Konzepte der Hack-Maschinensprache, was tut der Assembler?
06:10 Semantik der Maschinensprache, Hardware-Plattform und Programmausführung auf der Hack-CPU
10:50 A-Anweisungen der Hack-Maschinensprache
13:40 Elemente des Befehlsdecoders für A-Anweisungen
19:30 C-Anweisungen der Hack-Maschinensprache
29:00 Elemente des Befehlsdecoders für C-Anmeisungen
34:00 ... Decoder für die Zielregister
41:23 ... Decoder für die Sprungbefehle
44:35 Beispiele für Maschinensprachebefehle
53:10 Zusammenfassung und Ausblick

Anmerkungen und Errata

44:00 Ich hatte hier bei der Aufnahme eine viel zu komplizierte Form hingeschrieben, daher hier eine einfachere Variante für JGE. In Worten: JGE bedeutet, daß loadPC gesetzt werden soll, falls

Insgesamt führt das zur Formel:
$$
loadPC = \dots \vee \bigl( in[15] \wedge \bar{j_2} \wedge j_1 \wedge j_0 \wedge ( zr \vee \bar{ng} ) \bigr) \vee \dots
$$
Die drei Punkte links und rechts deuten an, daß noch Terme von den anderen Zeilen der Tabelle hinzukommen, da diese andere Bedingungen beschreiben, unter denen loadPC gesetzt wird. Die fertige Formel läßt sich dann natürlich stark vereinfachen, wenn man nach dem gleichen Schema die anderen Zeilen implementiert. Mit einem schlaueren Ansatz können Sie aber auch direkt eine einfache Formel für die ganze Tabelle hinschreiben - finden Sie den?


Abschnitt 2 - Hack-Assemblersprache und Assembler-Übersetzung

Folien 21-46

In diesem Abschnitt lernen wir die Hack-Assemblersprache kennen, die eine eins-zu-eins-Abbildung der Maschinensprache in symbolische Form darstellt, und für Menschen damit eine deutlich lesbarere Entsprechung ist. Wir lernen, wie die Opcodes in Assembler mit den C- und A-Anweisungen zusammenhängen, und wie man sowohl manuell als auch automatisiert von Assembler in Maschinensprache (und umgekehrt) übersetzen kann. Der Hack-Assembler bietet dabei noch einige Komfortfunktionen, zum Bespiel vordefinierte und benutzerdefinierte Sprungziele und Variablennamen in symbolischer Form, die bei der Übersezung automatisch Speicherzellen zugewiesen werden. Der Assembler muß dazu eine Symboltabelle anlegen, welche eine zweistufige Übersetzung notwendig macht.


Index

00:00 Einleitung, physikalische und symbolische Programmierung
05:05 Verhältnis von Maschienensprache zu Assemblersprache
10:30 Befehlsübersicht (Opcodes) C-Anweisungen der Hack-Assemblersprache
13:45 Manuelle Übersetzung von Assembler in Maschinensprache
16:37 A-Anweisungen, kurze Assembler-Beispiele zur Adressierung
20:00 Symbole in der Hack-Assemblersprache, Programmlabel
22:38 Vordefinierte Symbole für RAM-Speicherzellen
26:00 Anlegen von benutzerdefinierten Symbole für Variablen, Symboltabelle
29:03 Typische Hochsprachenkonstrukte in Assembler: Bedingte Anweisungen und Schleifen
35:20 Vorsicht vor sich widersprechenden Verwendungen des A-Registers
37:10 Automatische Übersetzung von Assemblerprogrammen: der Assembler
40:10 Anlegen der Symboltabelle, zweistufige Übersetzung
45:40 Ergebnis der Übersetzung, Implementation des Assemblers im Hack-System
48:30 Zusammenfassung und Ausblick

Anmerkung

45:05 Auf den Slides steht (und so ist es vermutlich korrekt), dass die Speicherzellen für die Variablen erst im zweiten Durchlauf zugewiesen werden, im Vortrag habe ich gesagt, daß dies bereits im ersten Durchlauf geschieht. Tatsächlich ist es egal, in welchem der beiden Durchläufe man es macht, außer, daß sich an der Reihenfolge der Einträge etwas ändert (allerdings würde man in der Praxis sowieso getrennte Hashtabellen für Label und Variablen in der Implementierung des Assemblers nehmen).


Abschnitt 3 - Hack-CPU vs. Motorola 68000

Folien 47-57

Dieser Abschnitt der Vorlesung ist komplett optional und muß nur bei Interesse angeschaut werden. Wir vergleichen die Assemblersprache des Hack-Systems mit einem richtigen Prozessor, dem Motorola 68000, und ich plaudere ein wenig über die Architektur des Commodore Amiga als Beispiel für einen Rechner auf Basis des M68k.


Index

00:00 Einleitung, Hack-CPU vs. Motorola 68000
01:39 Exkurs: Beispiel-Computer mit Motorola 68k - der Commodore Amiga und seine Architektur
08:19 Zurück zum Vergleich Hack-CPU vs. Motorola 68000
09:50 Aufbau der Assemblerbefehle des M68k
12:40 Methoden der indirekten Adressierung
15:13 Beispiel-Assemblerprogramme
19:27 Assemblerprogramme unter Linux und Windows
22:58 Über den Nutzen der Assemblerprogrammierung
25:40 Zusammenfassung und Ausblick