Maschinensprache i8086/ Was ist Maschinensprache
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
Analyse:
Bootloader
Der Unterschied zwischen Maschinensprache und Assembler
[Bearbeiten]Ein Prozessor ist dazu gemacht, Programme zu verarbeiten. Dafür muss er Befehle entgegen nehmen und ausführen. Die Befehle, die ein Prozessor unterstützt, sind vom jeweiligen Hersteller festgelegt. Ihr Aufbau hängt zusätzlich noch von dem internen Aufbau des Prozessors ab. Dieser Befehlssatz ist die Maschinensprache.
Die einzige Codierung, die ein digitaler Prozessor direkt versteht, besteht aus Binärzahlen. Die Maschinensprache wird deshalb in Form binärer Zahlen gespeichert und verarbeitet. Darum bezeichnet man ausführbare Dateien im Englischen auch als "Binaries".
Maschinencode binär
[Bearbeiten]Als Beispielprogramm sehen Sie die ersten 8 Byte des 1. Sektors jeder Festplatte, den Beginn des sogenannten „Urladeprogramms“. In der ersten Spalte steht die Speicheradresse (Hexadezimal), in der zweiten Spalte der Inhalt des Speicherplatzes, und zwar in binärer Darstellung:
0000 11111010 0001 00110011 0002 11000000 0003 10001110 0004 11010000 0005 10111100 0006 00000000 0007 01111100
Maschinencode hexadezimal
[Bearbeiten]Die binäre Programmdarstellung ist sehr unpraktisch. Die Kolonnen von Einsen und Nullen sind unübersichtlich, sehr aufwendig zu schreiben und nehmen unverhältnismäßig viel Platz auf dem Papier ein. Deshalb ist es üblich, die gleichen Daten in hexadezimaler Darstellung aufzulisten. Sie sehen hier vom gleichen Programm den Anfang, und zwar nicht nur acht Byte, sondern die ersten 32 Byte:
0000 FA 33 C0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC 0010 BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07
Maschinencode hexadezimal, gruppiert
[Bearbeiten]Ein Programm in diesem Code zu verstehen oder gar zu entwerfen, ist extrem schwierig. Man sieht es den Bytefolgen nicht an, ob es sich um Programmcode oder Daten handelt - es gibt keinen erkennbaren Unterschied. Ein weiteres Problem: Ein Befehl kann aus einem oder auch fünf Byte bestehen. Das jeweils erste Byte nennt man OP-Code (Operations-Code). Je nach OP-Code können eine bestimmte Zahl Bytes nachfolgen: Adressen, Konstanten, Sprungabstände u.a. Wenn man die Bytefolgen so ordnet, so dass jeder Befehl mit seinen Daten auf einer eigenen Zeile steht, erhält man folgendes:
FA 33 C0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07
Etwa so würde ein Programmierer sein Programm aufschreiben, wenn er keine anderen Hilfsmittel als eine Liste der Befehlscodes hat.
Mnemonics
[Bearbeiten]Um die Programmierung von Computern zu vereinfachen, kam bald die Idee auf, Abkürzungen für die Gruppen von Einsen und Nullen zu verwenden, aus denen die Maschinensprache besteht. Die Übersetzung dieser Abkürzungen in Einsen und Nullen kann der Computer selbst durchführen. Ein solches Übersetzungsprogramm heißt „Assembler“.
Der erste Befehl des Beispielprogramms ist „CLEAR INTERRUPT“, auf Deutsch „Unterbrechungsleitungen zeitweilig sperren“. Aus den Anfangsbuchstaben wird die Abkürzung „CLI“ gebildet. Die ist für einen Programmierer leichter zu merken als das hexadezimale FA bzw. das binäre 11111010. Solche Abkürzungen werden als Mnemonische Bezeichnungen, Kurzbezeichnung Mnemonics, bezeichnet.
- Wie kommen diese Abkürzungen zustande?
Der Hersteller des Prozessors, z. B. Intel, liefert zu jedem neuen Prozessor ein sehr umfangreiches Handbuch mit. Darin ist für jeden einzelnen Befehl ein langer Name, ein Kurzname (Mnemonic) und eine Beschreibung aufgeführt. Als Programmierer muss man diese zwei- bis dreihundert Befehle auswendig lernen. Die Mnemonics werden möglichst kurz gewählt, um den Schreibaufwand beim Programmieren gering zu halten. So wird das englische Wort „move“ (bewegen, transportieren) immer zu „mov“ verkürzt. "Addition" wird zu "add" verkürzt usw.
Wie übersetzt der Computer diese Abkürzungen?
Es musste sich nur ein Programmierer finden, der die Liste von 300 Mnemonics mit dem entsprechenden Binärcode zusammenstellt, z. B.
- CLI 11111010
- STI 11111011
usw.
DEBUG
[Bearbeiten]Dann braucht man noch ein Programmstück, das die Mnemonics in Binärcode umwandelt und umgekehrt. Dieses Programmstück ist eins der Bestandteile des Programms „DEBUG“.
Microsoft legte vor Windows 7 jedem Betriebssystem ein Hilfsprogramm mit dem Namen DEBUG bei. Dieses Programm ist in der Lage, die Bytes zu gruppieren und um symbolische Kurzbezeichnungen, sogenannte Mnemonics, zu ergänzen.
Unter Verwendung von Mnemonics sieht das obige Beispiel dann so aus:
0000 FA CLI 0001 33C0 XOR AX,AX 0003 8ED0 MOV SS,AX 0005 BC007C MOV SP,7C00 0008 8BF4 MOV SI,SP 000A 50 PUSH AX 000B 07 POP ES 000C 50 PUSH AX 000D 1F POP DS 000E FB STI 000F FC CLD 0010 BF0006 MOV DI,0600 0013 B90001 MOV CX,0100 0016 F2 REPNZ 0017 A5 MOVSW 0018 EA1D060000 JMP 0000:061D 001D BEBE07 MOV SI,07BE
CLI bedeutet "Clear Interrupt" (Interrupts sperren). Das bedeutet: eventuelle Unterbrechungen stehen in einer Warteschlange, bis mit "STI" die Unterbrechungen wieder zugelassen werden.
XOR bedeutet "exclusives oder" (ein Logikfunktion) und bewirkt hier das Löschen des AX-Registers.
MOV SS,AX heißt "Kopiere Inhalt des Registers AX nach Register SS".
Als Register bezeichnet man die Speicherplätze im Prozessorkern.
(Die Register der CPU werden später erläutert.)
Unter Nutzung dieser Mnemonics kann man mit DEBUG auch kleine Programme eingeben und testen.
Das vollständige Urladerprogramm finden Sie hier
Lesen Sie weiter: Was ist Assembler