Posted on 5 Comments

Was versteht man unter Maschinensprache?

Was versteht man unter Maschinensprache?

blank

Bei der Arbeit mit Computern taucht immer wieder der Ausdruck „Maschinensprache“ auf. Viele Anwender haben jedoch nur eine grobe Vorstellung davon, worum es sich hierbei handelt. Außerdem kommt es dabei häufig zu Verwechslungen – beispielsweise mit einer Programmiersprache. Wenn man jedoch selbst damit beginnt, Programme zu schreiben, ist es wichtig, sich mit diesem Begriff auseinanderzusetzen. Denn nur, wenn man genau weiß, was es hiermit auf sich hat, kann man die internen Abläufe dieses Geräts verstehen. Dieses Verständnis ist sehr wichtig, um Programme mit einer korrekten und effizienten Funktionsweise zu erstellen.

Maschinensprache – der Code für die Ausführung eines Programms

Wenn man ein Computerprogramm ausführt, wird dabei in der Regel eine grafische Benutzeroberfläche angezeigt. Hier kann man verschiedene Texte oder Grafiken erkennen. Dabei ist meistens auch eine Interaktion möglich – beispielsweise indem man einen bestimmten Button anklickt oder Text in ein entsprechendes Feld einträgt. Daraufhin führt der Computer eine bestimmte Aktion durch und Sekundenbruchteile später erscheint das Ergebnis.

Doch was ist hierbei passiert? Um diesen Vorgang zu verstehen, ist es notwendig, den Ablauf des Programms nachzuvollziehen. Hierbei wird es zunächst in den Arbeitsspeicher geladen. Daraufhin werden die darin enthaltenen Anweisungen ausgelesen und an den Prozessor weitergeleitet. Dieser führt dann die entsprechende Aktion aus. In unserem Beispiel handelt es sich um eine Ausgabe auf dem Bildschirm. Das bedeutet, dass der Prozessor die entsprechenden Daten, die für die Darstellung notwendig sind, an den Bildschirm übermittelt. Wenn der Anwender daraufhin einen Wert eingibt, wird diese Eingabe ebenfalls von der Tastatur an den Prozessor weitergeleitet. Zusammen mit den Befehlen aus dem Programm entsteht wieder eine neue Ausgabe, die der Prozessor erneut an den Bildschirm weiterleitet.

Nun stellt sich die Frage, wie diese Befehle aufgebaut sind. Diese bestehen aus elektrischen Impulsen. Dabei handelt es sich um die einzelnen Bits. In der Informatik werden diese häufig mit den Zahlen 0 und 1 repräsentiert. Wenn ein entsprechender elektrischer Impuls auftritt, wird dies mit dem Wert 1 symbolisiert. Ist kein Impuls vorhanden, wird dies durch den Wert 0 repräsentiert. Ein Prozessor verarbeitet jedoch keine einzelnen Bits, sondern immer einen größeren Block. Wie viele Bits dieser enthält, hängt jedoch vom Prozessortyp ab. Früher kamen beispielsweise 8-Bit-Prozessoren zum Einsatz. Das bedeutet, dass ein einzelner Befehl, der an den Prozessor übermittelt wird, aus 8 Bits besteht. In diesem Fall spricht man von einer 8-Bit-Architektur. In der Zwischenzeit hat die Länge der Befehle jedoch stark zugenommen. Mittlerweile ist eine 64-Bit-Architektur üblich. Das hat erheblich zur Leistungsfähigkeit der Computer beigetragen.

Bei diesen Befehlen, die an den Prozessor übermittelt werden, handelt es sich um Maschinensprache. Diese umfasst daher einzelne Kommandos, die aus binären Informationen bestehen.

Abhängigkeit von der Prozessorarchitektur

Wenn Sie sich mit der Maschinensprache befassen, müssen Sie berücksichtigen, dass die Befehle, die diese enthält, nicht einheitlich sind. Sie hängen stets vom verwendeten Prozessor ab. Das zeigt sich bereits daran, dass die einzelnen Prozessoren mit einer unterschiedlichen Anzahl an Bits arbeiten. 8-Bit-Prozessoren, die vor vielen Jahrzehnten zum Einsatz kamen, können nur Befehle mit einer Länge von 8 Bits verarbeiten. Computer mit einer 16-Bit-Architektur verwenden hingegen Befehle mit einer Länge von 16 Bits. Dementsprechend unterscheiden sich auch die Befehle von 32- und 64-Bit-Prozessoren in ihrer Länge.

Dabei kann es jedoch nicht nur zu Unterschieden hinsichtlich der Länge kommen. Darüber hinaus kann eine bestimmte Bitfolge bei verschiedenen Prozessoren ganz unterschiedliche Auswirkungen haben. Das hängt von der internen Gestaltung ab. Jeder Hersteller entwickelt hierbei ein eigenes System. Auf welche Weise die Prozessoren die Befehle verarbeiten, hat einen großen Einfluss auf deren Leistungsfähigkeit. Daher entwickeln die Chipproduzenten immer neue Methoden, um die Bauweise zu optimieren. Da jedes Unternehmen hierbei eine unterschiedliche Vorgehensweise wählt, unterscheiden sich auch die entsprechenden Befehle. Selbst bei verschiedenen Baureihen des gleichen Herstellers müssen die verwendeten Befehle nicht identisch sein. Nur wenn es sich exakt um dasselbe Modell handelt, ist sichergestellt, dass auch die gleichen Befehle zum Einsatz kommen.

Die Befehle, die ein bestimmter Prozessor unterstützt, sind in dessen Befehlssatz festgehalten. Dieser führt alle Anweisungen auf, die der Prozessor durchführen kann. Der Befehlssatz enthält die Informationen darüber, wie die Maschinensprache aufgebaut sein muss, damit ein Programm auf dem entsprechenden Prozessor ausgeführt werden kann.

Unterschiedliche Arten von Befehlen

In den bisherigen Abschnitten wurde gezeigt, dass es sich bei der Maschinensprache um eine Sammlung aus Befehlen in Binärcode handelt, die der Prozessor ausführen kann. Dabei wurde aber noch nicht beschrieben, um welche Art von Befehlen es sich hierbei handeln kann. Grundsätzlich gilt, dass jeder Befehl in Maschinensprache ein eindeutiges Ergebnis zur Folge hat. Welche Aktion eine bestimmte Bitfolge genau auslöst, hängt jedoch stets von der Prozessorarchitektur ab.

Trotz der Unterschiede, die zwischen den verschiedenen Prozessoren bestehen, gibt es auch einige Gemeinsamkeiten. Beispielsweise lassen sich die einzelnen Befehle immer in verschiedene Gruppen einteilen.

Von großer Bedeutung sind arithmetische Befehle. Diese erlauben es, grundlegende Rechenoperationen durchzuführen – beispielsweise Zahlen zu addieren, zu subtrahieren, zu multiplizieren und zu dividieren.

Auch Vergleichsbefehle sind für den Ablauf eines Computerprogramms von großer Bedeutung. Diese vergleichen zwei Werte miteinander. Auf diese Weise ist es möglich, herauszufinden, ob sie identisch sind oder welcher der beiden Werte größer ist.

Hinzu kommen Ladebefehle. Diese ermöglichen es, einen bestimmten Wert aus einer Speicherzelle auszulesen und in den Prozessor zu laden.

Darüber hinaus gibt es Schreibbefehle. Diese erlauben es, Daten in einen Speicherbereich zu schreiben.

Ebenfalls von großer Bedeutung für den Programmablauf sind Sprungbefehle. Diese machen es möglich, zu einem vorherigen oder zu einem späteren Teil des Programmcodes zu springen.

Die Zusammenstellung der verschiedenen Arten von Befehlen zeigt auch, dass diese häufig nicht alleine stehen. Wenn der Prozessor beispielsweise einen Schreibbefehl ausführen soll, muss er nicht nur wissen, dass er die Daten in den Speicher schreiben soll. Darüber hinaus muss er die Information darüber erhalten, an welchem Speicherort er diese ablegen soll. Außerdem muss er wissen, um welche Inhalte es sich dabei handelt. Die Befehlsarchitektur legt daher auch genau fest, auf welche Weise diese zusätzlichen Informationen übermittelt werden.

Darstellung in Binär- oder in Hexadezimalcode

Es wurde bereits gesagt, dass es sich bei der Maschinensprache um Binärcode handelt, den wir mit den Ziffern 0 und 1 darstellen können. Wenn wir nun jedoch einige Werte in Maschinensprache festhalten wollen, wäre dies jedoch ausgesprochen umständlich. Für einen einzigen Befehl in einer 64-Bit Architektur müssten wir dafür 64 Ziffern schreiben.

Wenn man einen Befehl in Maschinensprache darstellen will, ist es deshalb nicht üblich, den Binärcode zu verwenden. Wenn man davon ausgeht, dass es sich hierbei um einen Zahlenwert im Binärsystem handelt, kann man diesen jedoch auch in andere Zahlensysteme überführen. Doch selbst wenn wir hierfür die Dezimalschreibweise verwenden, bringt dies noch einen erheblichen Aufwand mit sich. Daher ist es üblich, den Binärcode im Hexadezimalsystem anzugeben. Dieses verwendet neben den Ziffern von 0 bis 9 auch die Buchstaben von A bis F. Diese repräsentieren die Zahlen von 10 bis 15. Der Wert F entspricht demnach der Zahl 15 im Dezimalsystem. Der Ausdruck 10 hat im Hexadezimalsystem den Wert 16. Das Hexadezimalsystem ist hierbei nicht beliebig gewählt. Dieses ist ausgesprochen praktisch, da man damit 1 Byte – die Grundeinheit aller Computersysteme, die 8 Bits entspricht – stets mit zwei Stellen darstellen kann.

Um zu zeigen, wie stark diese Schreibweise einen Ausdruck verkürzen kann, soll nun ein beliebiges Byte in den drei verschiedenen Schreibweisen dargestellt werden. Daran wird deutlich, wie praktisch das Hexadezimalsystem hierfür ist.

Binärcode | Dezimalschreibweise | Hexadezimalschreibweise
10010110 150 96

Vom Programmcode zur Maschinensprache

Bei Maschinensprache denken viele Menschen zunächst an den Programmcode, den wir erstellen, wenn wir ein Computerprogramm schreiben. Es ist jedoch sehr wichtig, zwischen diesen beiden Sprachen zu unterscheiden. Bei einem Computerprogramm können unterschiedliche Programmiersprachen zum Einsatz kommen. Diese enthalten verschiedene Befehle, die meistens der englischen Sprache entlehnt sind. Auf diese Weise ist es für einen Programmierer relativ einfach möglich, beim Lesen des Programmcodes den Verlauf nachzuvollziehen. Die Maschinensprache –also der Binärcode – ist für den Menschen hingegen beinahe unverständlich. Ein Programm in Maschinensprache nachzuvollziehen, ist selbst bei viel Übung ausgesprochen schwierig.

Nun könnte man sich die Frage stellen, weshalb überhaupt diese schwierige Maschinensprache erforderlich ist, wenn man doch auch eine deutlich einfachere Programmiersprache verwenden kann. Dabei muss man jedoch beachten, dass sich die Programmiersprache nicht direkt auf dem Prozessor ausführen lässt. Dieser kann die Befehle nicht verarbeiten.

Damit man ein Programm ausführen kann, ist es daher immer zunächst notwendig, es in die Maschinensprache zu übersetzen. Zu diesem Zweck kommt ein spezielles Übersetzungsprogramm zum Einsatz. Dieses muss immer auf die verwendete Befehlssatzarchitektur ausgerichtet sein. Das bedeutet, dass sich ein Programm, das einmal übersetzt ist, nicht beliebig auf einen Computer mit einer anderen Architektur übertragen lässt.

Bei diesem Übersetzungsprogramm kann es sich entweder um einen Compiler oder um einen Interpreter handeln. Beide Alternativen übernehmen die gleiche Aufgabe – sie übersetzen den Programmcode in Maschinensprache. Der Unterschied besteht darin, dass der Compiler dabei ein ausführbares Programm erzeugt. Dieses wird direkt in Maschinensprache abgespeichert, sodass man es ohne weitere Hilfsmittel ausführen kann. Der Interpreter übernimmt die Übersetzung hingegen direkt während der Ausführung. Dabei entsteht kein ausführbares Programm. Der Übersetzungsprozess wird bei jeder Ausführung aufs Neue ausgeführt. Daher kann man solche Programme – die auch als Scripts bezeichnet werden – nicht ohne einen Interpreter ausführen.

Maschinensprache und Assemblersprache – die Unterschiede

Neben gewöhnlichen Programmiersprachen und der Maschinensprache gibt es noch eine Zwischenstufe – die Assemblersprache. Diese verwendet ebenfalls Begriffe, die der natürlichen Sprache entlehnt sind. Allerdings entspricht jeder Befehl in der Assemblersprache genau einem Befehl in der Maschinensprache. Es handelt sich dabei lediglich um eine andere Schreibweise. Die Strukturen sind dabei jedoch identisch.

Das stellt einen wichtigen Unterschied zu einer gewöhnlichen Programmiersprache dar. Diese weist Strukturen auf, die vollkommen unabhängig von der Struktur der Maschinensprache sind. Ein einziger Befehl in einer gewöhnlichen Programmiersprache kann Hunderte Befehle in der Maschinensprache nach sich ziehen – und damit auch in der Assemblersprache.

Obwohl die Assemblersprache die gleiche Struktur aufweist wie die Maschinensprache, lässt sie sich nicht direkt ausführen. Auch hierbei ist es notwendig, die einzelnen Befehle in den Binärcode zu überführen. Dafür kommt ein Assembler zum Einsatz. Dieser übernimmt im Prinzip die gleiche Aufgabe wie ein Compiler bei einer Programmiersprache. Da er jedoch die Struktur der Befehle im Programmcode vollständig übernehmen kann, ist dieser deutlich einfacher aufgebaut.

Ein Beispiel für ein Programm in Maschinensprache

Nun stellt sich noch die Frage, wie man die Maschinensprache sichtbar machen kann. Dies ist mit einem sogenannten Hex-Editor möglich. Dieser stellt den Binärcode einer Datei – bei ausführbaren Programmen also die Maschinensprache – in der oben beschriebenen Hexadezimalschreibweise dar. Auf diese Weise kann man sich anschauen, wie das Programm in Maschinensprache aussieht. Theoretisch kann man dabei auch den Code verändern. Allerdings sind sehr umfangreiche Kenntnisse erforderlich, wenn man auf diese Weise die Funktionsweise eines ausführbaren Programms beeinflussen will. Selbst erfahrene Programmierer sind dazu meistens nicht in der Lage.

Hex-Editoren sind in vielen verschiedenen Ausführungen kostenfrei im Internet erhältlich. Wenn Sie die Funktionsweise selbst ausprobieren möchten, können Sie sich beispielsweise unter folgendem Link ein entsprechendes Programm herunterladen: https://mh-nexus.de/en/downloads.php?product=HxD20

Das probieren wir zum Abschluss nun kurz aus. Dazu schreiben wir ein einfaches Programm in der Programmiersprache C. Dabei handelt es sich um ein Hallo-Welt-Programm, dessen einzige Aufgabe darin besteht, eine kurze Begrüßung auszugeben:

#include <stdio.h>
int main(){
  printf("Hallo Welt!");
  return 0;
}

Dieses kompilieren wir nun, sodass eine ausführbare Datei entsteht – die unter Windows durch die Endung .exe erkenntlich ist. Diese rufen wir nun mit dem Hex-Editor auf. Das Ergebnis ist im folgenden Screenshot zu sehen.

Beim hier dargestellten Bildbereich handelt es sich lediglich um einen kleinen Ausschnitt des Programmcodes. Mann könnte hierbei noch weit nach unten scrollen und würde dabei auf endlose Zahlenreihen stoßen, die nur schwer zu verstehen sind.

Das macht deutlich, dass selbst für ein solch einfaches Programm ein sehr umfangreicher Code in Maschinensprache erforderlich ist. Daran erkennt man, wie hilfreich die Verwendung einer Programmiersprache ist. Diese macht den Code nicht nur einfacher verständlich. Darüber hinaus gestaltet sie ihn wesentlich kürzer.

Ähnliche Produkte

5 Kommentare zu “Was versteht man unter Maschinensprache?

  1. Zu DOS Zeiten gab es einmal ein Programm das es möglich machte in den Programmcode zu schauen und dort auch Veränderungen anzubringen. Das waren halt noch einfachere Zeiten.
    Ich bin dem BMU Verlag dankbar, dass er es möglich macht die Programmstruktur zu verstehen und bin schon auf die Fortsetzungen
    gespannt.
    DI Friedrich Thiele, 11.05.2020

  2. Danke für den sehr interessanten Beitrag, er macht Lust auf mehr Information zum Thema!

    Ein Assembler Buch für die aktuelle 64-Bit-Architektur unter Windows – das wäre eine Innovation. Die Bücher am Markt sind alle sehr veraltet und noch aus 16-Bit DOS Zeiten. Den PC und sein Betriebssystem von Grund auf kennenzulernen und zu Programmieren findet sicher regen Zuspruch bei den an der Informatik interessierten Leser/innen!

    So könnte der BMU Verlag sich mit einem Assemblerbuch vom Mitbewerb durch Fachkompetenz abheben.

    1. Hallo mike,

      danke für den Kommentar, wir werden das prüfen!

      Viele Grüße,
      Michael Bonacina

  3. sehr gut strukturiert und einfach erklärt !

    1. Hallo Jochen,

      Vielen Dank für Ihr Feedback!

      Wir bemühen uns, unseren Lesern nützliche Infos nicht nur in Büchern zu liefern.

      Mit freundlichen Grüßen,

      Olena Zakrytna

      BMU Media GmbH

Schreibe einen Kommentar