Maschinensprache i8086/ Was ist Maschinensprache

Aus Wikibooks

Theorie:  EinleitungMaschinenspracheAssemblerZahlensystemeRAM-AdressenBWSDebugCPU-RegisterEinfache BefehleStringbefehleInterruptsI/O-Ports
Versuch:  BWS1BWS2Hallo WeltBootsektorMBR
Nützlich: BefehlslistePAUSEFilter
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