<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Maschinensprache</id>
	<title>Maschinensprache - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Maschinensprache"/>
	<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Maschinensprache&amp;action=history"/>
	<updated>2026-04-08T03:03:23Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Demo Wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://demowiki.knowlus.com/index.php?title=Maschinensprache&amp;diff=2420&amp;oldid=prev</id>
		<title>imported&gt;Trustable: wikilinks</title>
		<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Maschinensprache&amp;diff=2420&amp;oldid=prev"/>
		<updated>2025-03-06T10:03:20Z</updated>

		<summary type="html">&lt;p&gt;wikilinks&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Weiterleitungshinweis|Maschinenprogramm|Dessen im Detail abweichende Bedeutung wird unten ebenfalls behandelt.}}&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Maschinensprache&amp;#039;&amp;#039;&amp;#039;, wie sie bei &amp;#039;&amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039;&amp;#039; bzw. &amp;#039;&amp;#039;&amp;#039;nativem Code&amp;#039;&amp;#039;&amp;#039; verwendet wird, ist eine [[Programmiersprache]], bei der die [[Instruktion#Programmierbefehl|Instruktionen]], die vom [[Prozessor]] ausgeführt werden sollen, als formale Sprachelemente festgelegt sind. Aufgrund ihrer Nähe zur [[Hardware]] wird sie auch verallgemeinernd als &amp;#039;&amp;#039;die&amp;#039;&amp;#039; „Programmiersprache eines Computers“ bezeichnet.&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;Duden Informatik&amp;#039;&amp;#039;. ISBN 3-411-05232-5.&amp;lt;/ref&amp;gt; Umfang und [[Syntax]] der Maschinenbefehle sind im [[Befehlssatz]] definiert und abhängig vom Prozessortyp. Maschinensprache wird meistens als [[Binärcode]] oder vereinfacht mithilfe von [[Hexadezimalzahlen]] dargestellt.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;Maschinenbefehl&amp;#039;&amp;#039; ist hierbei eine Anweisung an den Prozessor, eine Operation durchzuführen, beispielsweise eine Addition oder einen Wertevergleich. Jede funktionelle Leistung eines Prozessors ist daher Ergebnis der Ausführung von Maschinencode, eines in Maschinensprache vorliegenden Programms.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--gem. en:machine code--&amp;gt;Programme in Maschinensprache werden üblicherweise nicht vom [[Programmierer]] direkt erzeugt, sondern unter Nutzung einer [[Höhere Programmiersprache|höheren Programmiersprache]] oder einer [[Assemblersprache]], wobei erst mithilfe eines [[Compiler]]s bzw. [[Assembler (Informatik)|Assemblers]] ausführbarer Maschinencode entsteht. Wird von „Programmierung in Maschinensprache“ gesprochen, ist damit manchmal fälschlicherweise die Programmierung in Assemblersprache gemeint. Bei der Ausführung durch [[Interpreter]] werden dagegen die Maschinenbefehle [[JIT-Compiler|beim Programmstart]] oder während der Laufzeit erzeugt.&lt;br /&gt;
&lt;br /&gt;
Manchmal werden Ausdrücke wie „Maschinencode, Maschinensprache, Binärcode, nativer Code, Programmcode“ synonym verwendet.&amp;lt;ref&amp;gt;[https://wirtschaftslexikon.gabler.de/definition/maschinencode-38814/version-161381 &amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039;.] In: &amp;#039;&amp;#039;Gabler Wirtschaftslexikon&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt; Sie können jedoch zwei unterschiedliche Bedeutungen haben:&lt;br /&gt;
&lt;br /&gt;
* Typisierende Bezeichnung des verwendeten [[Code]]s als ‚Syntaxbestimmung‘. Beispiel: Interner Binärcode, in dem die Daten in einer Zentraleinheit dargestellt werden.&lt;br /&gt;
* Die für ein ‚bestimmtes Programm‘ vorliegenden Anweisungen. Beispiel „Binärcode (für Programm ABC)“, der vom Computer direkt ausgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Maschinenprogramm ==&lt;br /&gt;
[[Datei:Programmcode.png|mini|hochkant=2|,Maschinenprogramm‘, Begriffszusammenhänge und im Sprachgebrauch auftretende Synonyme]]&lt;br /&gt;
Maschinenprogramme finden in allen Geräten mit einem [[Prozessor]] Verwendung, also von [[Großrechner]]n über [[Personal Computer]] und [[Smartphone]]s bis hin zu [[Eingebettetes System|eingebetteten (embedded) Systemen]] in modernen Waschmaschinen, Radios oder Steuerungen im Kraftfahrzeug für [[Antiblockiersystem|ABS]] oder [[Airbag]]. Bei PCs sind sie üblicherweise in [[Ausführbare Datei|ausführbaren Dateien]] enthalten.&lt;br /&gt;
&lt;br /&gt;
Ausführbare Dateien findet man bei [[Microsoft Windows|Windows]] in Dateien unter der [[Dateinamenserweiterung]] [[EXE|„.exe“]]. Unter vielen anderen Betriebssystemen werden ausführbare Dateien auch ohne Dateiendung und in anderen Formaten geführt. Sie werden teils anders bezeichnet, z.&amp;amp;nbsp;B. unter [[z/OS]] als [[Lademodul]]. Bei vielen [[Eingebettetes System|eingebetteten Systemen]] oder [[Mikrocontroller]]n befinden sich bestimmte Maschinenprogramme permanent im ROM, z.&amp;amp;nbsp;B. ein [[Bootloader]].&lt;br /&gt;
&lt;br /&gt;
Maschinenprogramme können von Menschen mithilfe eines [[Hex-Editor]]s oder eines [[Maschinencode-Monitor]]s betrachtet, prinzipiell auch erstellt und verändert werden. In der Praxis erfolgt die Herstellung eines Maschinenprogrammes jedoch mithilfe eines [[Assembler (Informatik)|Assemblers]] oder [[Compiler]]s unter Verwendung von [[Quelltext]] der jeweiligen [[Programmiersprache]]. Maschinencode kann durch einen [[Disassembler]] wieder in Assemblerformat rückübersetzt werden, die Umwandlung in eine [[höhere Programmiersprache]] durch einen [[Decompiler]] unterliegt jedoch starken Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zur Assemblersprache ==&lt;br /&gt;
Das Programm im &amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039; besteht aus einer Folge von [[Byte]]s, die sowohl Befehle als auch Daten repräsentieren. Da dieser Code für den Menschen schwer lesbar ist, werden in der Assemblersprache die Befehle durch besser verständliche Abkürzungen, sogenannte [[Assemblersprache#Beschreibung|Mnemonics]], dargestellt. Dabei können der Operationscode, Quell- und Zielfelder sowie andere Angaben in den Befehlen mit symbolischen Bezeichnern (wie MOVE, PLZ, LAENGE) notiert werden, ggf. ergänzt um numerische Zahlenwerte, z.&amp;amp;nbsp;B. für eine individuelle Längenangabe, Registernummern usw.&lt;br /&gt;
&lt;br /&gt;
; Dateiformat&lt;br /&gt;
: Ein Assemblerprogramm liegt, wie bei [[Quelltext]]en üblich, meist als [[Textdatei]] vor, während das Maschinenprogramm in der Regel als [[Binärdatei]] gespeichert ist.&lt;br /&gt;
; Anweisungen&lt;br /&gt;
: Das Programmieren im Textformat mit anschließender Übersetzung in den Maschinencode durch einen Assembler gestattet dem Programmierer eine weit schnellere und einfachere Programmerstellung als das Codieren im Maschinencode. In der Regel entspricht einem Assemblerbefehl genau ein Befehl im Maschinencode außer bei [[Assembler (Informatik)|Makroassemblern]], die aus einer Anweisung mehrere Maschinenbefehle generieren können.&lt;br /&gt;
; Zeichenformate&lt;br /&gt;
: Gängige Assembler erlauben es dem Programmierer, Zeichen und Zahlen in unterschiedlichen Codeformaten (Text, dezimal, Hexadezimal, oktal, binär) zu codieren, und stellen diese im Maschinenbefehl in einem der Anweisung entsprechenden Format ein. Beispiel: Die Quelltextangaben ‚A‘ oder ‚X&amp;#039;C1&amp;#039;‘ oder ‚B&amp;#039;11000001&amp;#039;‘ (im [[Extended Binary Coded Decimals Interchange Code|EBCDIC-Code]]) bedeuten dasselbe und werden im Maschinencode zu X&amp;#039;C1&amp;#039; – was bei Befehlen für duale Operationen dem Wert +193, bei Zeichenoperationen dem Zeichen &amp;#039;A&amp;#039; entspricht.&lt;br /&gt;
; Datendeklaration&lt;br /&gt;
: Ein Assembler bietet dem Programmierer die Möglichkeit, [[Datenfeld]]er als solche zu kennzeichnen und zu benennen, sie in verschiedenen Formaten zu deklarieren und sie mit symbolischen Namen zu versehen. Im erzeugten Maschinencode wird gemäß diesen Angaben Speicherplatz reserviert und (bei [[Konstante (Programmierung)|Konstanten]]) mit Inhalt vorbelegt. In den erzeugten Maschinenbefehlen wird die symbolische Adresse durch die numerische Adresse ersetzt und die Länge der definierten Felder eingesetzt.&lt;br /&gt;
; Adressierung&lt;br /&gt;
: Ein Assembler ermöglicht es, die Speicherorte für Daten und Befehle symbolisch zu benennen, sodass dem Programmierer deren numerische Adresse nicht bekannt sein muss. In der Maschinensprache sind Speicheradressen direkt angegeben. Selbst bei einer kleinen Änderung des Programms würden sich die Adressen aller nachfolgenden Programmteile verschieben, was (bei Programmierung in Maschinensprache) eine Anpassung all dieser Adressen erforderlich machen würde. Durch die symbolische Adressierung sind in der Assemblersprache auch [[Unterprogramm]]e aufrufbar, deren tatsächliche Adresse im Maschinencode erst vom Assembler oder einem [[Linker (Computerprogramm)|Linker]] eingesetzt wird.&lt;br /&gt;
; Programmumfang&lt;br /&gt;
: Ein Assemblerprogramm bezieht sich normalerweise auf eine (1) definierte Aufgabenstellung und ist zur Assemblierungszeit von anderen Programmen unabhängig. Durch Techniken wie das [[Linker (Computerprogramm)|‚Linken‘]] können je nach Entwicklungsplattform die Ergebnisse mehrerer Assemblierungen (z.&amp;amp;nbsp;B. [[Objektmodul]]e genannt)‚ zusammengefasst werden, die als Gesamtheit das Maschinenprogramm ergeben.&lt;br /&gt;
; Dokumentation&lt;br /&gt;
: Ein Assembler ermöglicht es, einem Programm Kommentare und weitergehende Dokumentation hinzuzufügen. In das Maschinenprogramm werden diese Quellcodeteile in der Regel nicht übernommen.&lt;br /&gt;
&lt;br /&gt;
Die meisten der vorgenannten, zur Assemblersprache genannten Aspekte gelten in ähnlicher Weise auch für [[höhere Programmiersprache]]n – wobei diese sich gegenüber der Assemblersprache durch weitere (Leistungs-)Merkmale unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Programmerstellung ==&lt;br /&gt;
Intern ist jeder Befehl der Maschinensprache durch einen oder mehrere Zahlenwerte kodiert. Diese Zahlenwerte bestehen aus dem [[Opcode]], der die Art des Befehls festlegt, eventuell gefolgt von einem oder mehreren Bytes an Daten zu diesem Befehl. Eine sinnvolle Folge von solchen Zahlencodes im Hauptspeicher, bzw. als Datei gespeichert, bildet demnach ein Programm. Es gibt nun verschiedene Arten, solche Programme zu erstellen:&lt;br /&gt;
* Direkte Eingabe des Binärcodes (äußerst umständlich und höchst fehleranfällig, seit den 1950er Jahren unüblich).&lt;br /&gt;
* Über einen [[Hex-Editor]] den Zahlen-Code in [[Opcode]]s zu schreiben (fehleranfällig).&lt;br /&gt;
* Mit einem [[Assembler (Informatik)|Assembler]]: [[Assemblersprache]]n formulieren die Prozessorbefehle des Maschinencodes als Mnemonics in einer einfachen Syntax. Dieser [[Quelltext]] wird danach vom Assembler in den Maschinencode konvertiert.&lt;br /&gt;
* Ein Programm wird in einer [[Höhere Programmiersprache|Hochsprache]] geschrieben, danach von einem [[Compiler]] in Maschinencode übersetzt (kompiliert). In einem Zwischenschritt wird dabei häufig zuerst [[Objektcode]] erzeugt.&lt;br /&gt;
* Alternativ können Programme in einer Hochsprache auch –&amp;amp;nbsp;entweder nach Kompilierung in einen [[Zwischencode]] oder direkt&amp;amp;nbsp;– durch einen [[Interpreter]] abgearbeitet werden. Ein Beispiel hierfür ist die Programmiersprache [[Java (Programmiersprache)|Java]], deren Zwischencode (auch [[Bytecode]] genannt) von einem Interpreter ausgeführt wird. Dies geschieht für den Benutzer transparent, wenn zum Beispiel ein Applet im [[Webbrowser]] ausgeführt wird. Neben Java werden auch sämtliche [[.NET (Oberbegriff)|.NET]]-Sprachen, wie beispielsweise [[C-Sharp|C#]], in einen Zwischencode (englisch Intermediate Language) übersetzt, welcher anschließend zur Laufzeit innerhalb der [[Common Language Infrastructure|CLR]] von einem [[JIT-Compiler]] in die entsprechende Maschinensprache übersetzt wird.&lt;br /&gt;
* Bei der [[Installation (Software)|Installation]] von [[Software]], einschließlich des Betriebssystems, liegt diese oft bereits in Maschinencode für die jeweilige Plattform vor. Dies erspart dem Nutzer die Kompilierung des Programms.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
=== Programmiersprache C ===&lt;br /&gt;
Im folgenden Quelltext in der höheren [[C (Programmiersprache)|Programmiersprache C]] wird die Summe der Zahlen 2 und 3 berechnet und das Ergebnis zurückgegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 2;&lt;br /&gt;
    int b = 3;&lt;br /&gt;
    int c = a + b;&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein solches Programm, würde es für einen [[x86-Prozessor]] kompiliert, könnte folgenden Maschinencode ergeben:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Maschinencode&amp;lt;br /&amp;gt;([[hexadezimal]])&lt;br /&gt;
! style=&amp;quot;width:20em&amp;quot;| zugehöriger Assemblercode&lt;br /&gt;
! style=&amp;quot;width:10em&amp;quot;| zugehöriger C-Code&lt;br /&gt;
! Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| 55&amp;lt;br /&amp;gt;48 89 E5&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;push rbp&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov rbp, rsp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;int main() {&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Sichere Register RBP auf dem [[Stapelspeicher|Stack]] und setze RBP auf den Wert von Register RSP, dem Stackpointer (gehört nicht zur eigentlichen Berechnung). Diese Vorbereitung ist notwendig, um die Werte der Variablen &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, &amp;#039;&amp;#039;b&amp;#039;&amp;#039; und &amp;#039;&amp;#039;c&amp;#039;&amp;#039; auf dem Stack speichern zu können.&lt;br /&gt;
|-&lt;br /&gt;
| C7 45 FC 02&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov DWORD PTR [rbp-4], 2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;int a = 2;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Setze Variable &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, die durch Register RBP adressiert wird, auf den Wert 2.&lt;br /&gt;
|-&lt;br /&gt;
| C7 45 F8 03&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov DWORD PTR [rbp-8], 3&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;int b = 3;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Setze Variable &amp;#039;&amp;#039;b&amp;#039;&amp;#039;, die durch Register RBP adressiert wird, auf den Wert 3.&lt;br /&gt;
|-&lt;br /&gt;
| 8B 45 F8&amp;lt;br /&amp;gt;8B 55 FC&amp;lt;br /&amp;gt;01 D0&amp;lt;br /&amp;gt;89 45 F4&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov eax, DWORD PTR [rbp-8]&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov edx, DWORD PTR [rbp-4]&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;add eax, edx&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov DWORD PTR [rbp-12], eax&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;int c = a + b;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Setze Register EAX auf den Wert von Variable &amp;#039;&amp;#039;b&amp;#039;&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Setze Register EDX auf den Wert von Variable &amp;#039;&amp;#039;a&amp;#039;&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Addiere den Wert von EDX zum Wert von EAX.&amp;lt;br /&amp;gt;&lt;br /&gt;
Setze Variable &amp;#039;&amp;#039;c&amp;#039;&amp;#039;, die durch RBP adressiert wird, auf den Wert von EAX.&lt;br /&gt;
|-&lt;br /&gt;
| 8B 45 F4&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov eax, DWORD PTR [rbp-12]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;return c;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Setze Register EAX auf den Wert von Variable &amp;#039;&amp;#039;c&amp;#039;&amp;#039;. Weil Register EAX diesen Wert bereits enthält, könnte diese Anweisung in einem optimierten Programm entfallen.&lt;br /&gt;
|-&lt;br /&gt;
| 5D&amp;lt;br /&amp;gt;C3&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;pop rbp&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;ret&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; inline&amp;gt;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| Setze RBP wieder auf seinen ursprünglichen Wert.&amp;lt;br /&amp;gt;&lt;br /&gt;
Springe zurück an die Stelle des Aufrufs von &amp;#039;&amp;#039;main&amp;#039;&amp;#039;. Register EAX enthält den Rückgabewert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Compiler könnte daraus zusammen mit weiteren notwendigen Informationen eine [[ausführbare Datei]] erzeugen. Zur Ausführung wird der Maschinencode vom [[Lader (Programmierung)|Lader]] des Betriebssystems in den Arbeitsspeicher geladen. Anschließend ruft die [[Laufzeitumgebung]] die Funktion &amp;#039;&amp;#039;main()&amp;#039;&amp;#039; auf und die CPU beginnt mit der Abarbeitung der Maschinenbefehle.&lt;br /&gt;
&lt;br /&gt;
=== Maschinencode bei IBM-Rechnern am Beispiel von OS/390 ===&lt;br /&gt;
Der Maschinencode entsteht beim Assemblieren bzw. beim Kompilieren der Quellcodedateien und wird vom [[Linker (Computerprogramm)|„Linkage Editor“]], ggf. unter Hinzufügen weiterer [[Modul (Software)|Module]], als ausführbares Programm in einer [[Programmbibliothek]] bereitgestellt. Zur Ausführung wird dieses Programm in den Hauptspeicher geladen. Der Maschinencode dieser Programme enthält Befehle und Daten gemischt – wie dies bei Computern der [[Von-Neumann-Architektur]] möglich ist (im Gegensatz z.&amp;amp;nbsp;B. zur [[Harvard-Architektur]]).&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;Daten&amp;#039;&amp;#039; werden entsprechend dem festgelegten Speicherformat angelegt. Der Wert „12“ kann dabei z.&amp;amp;nbsp;B. folgendes Aussehen haben (Darstellung hexadezimal, in minimaler Länge):&lt;br /&gt;
: F1F2 Text oder ungepackte Zahl&lt;br /&gt;
: 012C [[BCD-Code|gepackt]] positiv, Speicherung je Zahl ein Halbbyte, am Ende ein Vorzeichen-Halbbyte.&lt;br /&gt;
: 012D gepackt negativ (dto)&lt;br /&gt;
: 0C binär positiv, entspricht B&amp;#039;00001100&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Bei längeren Datenfeldern existieren ggf. führende Nullen zusätzlich oder bei Text nachfolgende Leerstellen.&lt;br /&gt;
Für jedes vorgesehene Datenfeld ist eine &amp;#039;Adresse&amp;#039; festgelegt, an der es beginnt und wo es entsprechend seiner Länge und seinem Format gespeichert ist.&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;Befehle&amp;#039;&amp;#039; bestehen aus dem Befehlscode und – je nach Befehl – Parametern unterschiedlicher Struktur. Die nachfolgenden Beispiele sind [[hexadezimal]] dargestellt. Befehlsbeispiele:&lt;br /&gt;
&lt;br /&gt;
C5.1C.92A4.8C2B (Trennpunkte nur zur besseren Lesbarkeit eingefügt):&lt;br /&gt;
&lt;br /&gt;
: C5 = Befehlscode für &amp;#039;&amp;#039;CLC&amp;#039;&amp;#039; = Compare logical character; Zeichenvergleich&lt;br /&gt;
: 1C = Länge minus 1 der zu vergleichenden Felder (bei 00 wird 1 Byte verglichen usw., hier also 29 Bytes)&lt;br /&gt;
: 92A4 = Adresse erster Operand: 9 = Basisregister, 2A4 = Distanz zum Register&lt;br /&gt;
: 8C2B = Adresse zweiter Operand: 8 = Basisregister, C2B = Distanz zum Register&lt;br /&gt;
&lt;br /&gt;
47.80.B654:&lt;br /&gt;
&lt;br /&gt;
: 47 = Befehlscode für &amp;#039;&amp;#039;BC&amp;#039;&amp;#039; = Branch on Condition: Sprungbefehl wenn Bedingung (aus Vorbefehl) erfüllt ist&lt;br /&gt;
: 8 = Bedingung; hier: wenn &amp;#039;gleich&amp;#039;, mnemotechnischer Assemblercode BE (branch on equal)&lt;br /&gt;
: 0 = optional Register, dessen Inhalt zur Sprungadresse hinzuaddiert wird; nicht bei &amp;#039;0&amp;#039;&lt;br /&gt;
: B = Zieladresse (Basisregister)&lt;br /&gt;
: 654 = Zieladresse (Distanz); bei Inhalt von B = 6C4410 würde nach Adresse 6C4A64 verzweigt werden.&lt;br /&gt;
&amp;lt;usw&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im &amp;#039;&amp;#039;Assemblercode&amp;#039;&amp;#039; könnte diese Codierung z.&amp;amp;nbsp;B. wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
: CLC FELDA(29),FELDB&lt;br /&gt;
: BE XXX&lt;br /&gt;
&lt;br /&gt;
Von einer &amp;#039;&amp;#039;Hochsprache&amp;#039;&amp;#039; generiert könnte der Quellcode dagegen lauten:&lt;br /&gt;
&lt;br /&gt;
: IF Feld_A = Feld_B then GOTO XXX.&lt;br /&gt;
&lt;br /&gt;
Bei „Bedingung erfüllt“ wird nach XXX (= reale Adresse 6C4A64) verzweigt, andernfalls wird im Maschinencode mit &amp;lt;code&amp;gt;&amp;lt;usw&amp;gt;&amp;lt;/code&amp;gt; fortgefahren. Häufig generieren Hochsprachen zusätzliche Befehle, z.&amp;amp;nbsp;B. um Feldlängen oder Datenformate zu egalisieren, Register zu laden oder Adressen in [[Array (Datentyp)|Arrays]] zu berechnen.&lt;br /&gt;
&lt;br /&gt;
Man erkennt, dass die Befehle unterschiedliche &amp;#039;&amp;#039;Längen&amp;#039;&amp;#039; aufweisen. Das [[Steuerwerk]] des Rechners erkennt die Länge an den ersten beiden Bits des Befehlscodes und schaltet das [[Befehlszähler|Befehlszählregister]] dementsprechend weiter. An genau dieser Stelle wird das Programm fortgesetzt – falls kein Sprungbefehl auszuführen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Speicheradressen&amp;#039;&amp;#039; werden im Maschinencode immer durch eine (oder zwei) Registerangabe(n), zusätzlich optional durch eine im Befehl angegebene „Distanz“ dargestellt. Zur Ausführung wird beim Programmstart ein bestimmtes Register vom Betriebssystem mit der Adresse geladen, an die das Programm in den Speicher geladen wurde. Von diesem Wert ausgehend, werden im Programmcode (bei ASS programmiert, bei Hochsprachen generiert) die Basisregister geladen, wodurch die mit relativen Adressen versehenen Befehle die tatsächlichen Speicherstellen ansprechen.&lt;br /&gt;
&lt;br /&gt;
{{Anker|SVC}}&lt;br /&gt;
Zur Ausführung von &amp;#039;&amp;#039;Systemfunktionen&amp;#039;&amp;#039; (wie [[Eingabe und Ausgabe|Ein-/Ausgabebefehle]], Abfrage von Datum/Uhrzeit, Tastatureingabe, Laden von Unterprogrammen u.&amp;amp;nbsp;v.&amp;amp;nbsp;a.) wird im Maschinenprogramm lediglich ein Systemaufruf mit dem Befehl &amp;#039;SVC&amp;#039; (Supervisor Call) abgesetzt. Im zweiten Byte ist die auszuführende Funktion spezifiziert (Verzeichnis siehe&amp;lt;ref&amp;gt;[https://bixoft.nl/english/svclist.htm#table Tabelle der SVC-Codes für IBM&amp;#039;s MVS &amp;amp; OS/390 &amp;amp; z/OS]&amp;lt;/ref&amp;gt;); weitere Parameter für die Funktion werden über eine in ihrer Struktur festgelegte Datenschnittstelle übergeben, auf deren Adresse ein implizit vereinbartes (nicht im Befehl angegebenes) Register zeigt. Beispiel: X&amp;#039;05 08&amp;#039; = LOAD, Parameter = Pgm-Name etc. Die die aufgerufenen Funktionen ausführenden Befehle sind Maschinencode des Betriebssystems. Sie werden dort ausgeführt und führen anschließend zu dem dem SVC folgenden Befehl zurück.&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;[[:en:Supervisor Call instruction|Supervisor Call instruction]]&amp;#039;&amp;#039; in der englischsprachigen Wikipedia&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überblick über die typische Funktionalität einer Maschinensprache ==&lt;br /&gt;
=== Befehlsvorrat ===&lt;br /&gt;
{{Hauptartikel|Befehlssatz}}&lt;br /&gt;
&lt;br /&gt;
Die im Folgenden genannten Mnemonics (Befehlskürzel) wurden exemplarisch gewählt und hängen von der Assemblersprache ab.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Adressierung und Ergebnisanzeige:&amp;#039;&amp;#039; Fast alle Befehle adressieren die betroffenen Speicherpositionen (häufig Quelle/Ziel, zu vergleichend/Vergleichswert usw.) über definierte [[Register (Prozessor)|Register]]. Ebenso gibt der Prozessor seine Ergebnisse und relevante Zusatzinformationen über festgelegte Register und/oder über [[Flag (Informatik)|Flags]] im [[Statusregister]] zurück. Dies ermöglicht es, im weiteren Programmablauf diese Informationen auszuwerten und darauf zu reagieren. Die Länge der Befehle und die Größe von Quell- und Zieloperanden können je nach Architektur unterschiedlich sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Ein Additionsbefehl wie ADC (add with carry) signalisiert dem weiteren Programmablauf ein Überschreiten des gültigen Wertebereichs über das Setzen des Carry- und Overflow-Flags hinaus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Unterschiede:&amp;#039;&amp;#039; Der Befehlsvorrat einzelner Prozessoren ist unterschiedlich. Nicht alle Befehle sind auf jedem Prozessortyp und in jeder Prozessor-Generation verfügbar.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Ein einfacher Grundbefehl wie &amp;#039;&amp;#039;SHL/SHR&amp;#039;&amp;#039;, der einen Registerwert um eine bestimmte Anzahl von Stellen nach links oder rechts verschiebt ist schon im 8086 vorhanden. Die mächtigere Variante &amp;#039;&amp;#039;SHLD/SHRD&amp;#039;&amp;#039;, welche zusätzlich die entstehenden Leerstellen aus einem anderen Integerwert auffüllt, ist erst ab dem 80386 implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Mächtigkeit:&amp;#039;&amp;#039; Der Befehlsvorrat eines Prozessors stellt dabei Befehle unterschiedlich mächtiger Funktionalität bereit. Neben einfachen, einstufigen Grundoperationen stehen auch Befehle zur Verfügung, die mehrere Operationen in einem Befehl bündeln.&lt;br /&gt;
&lt;br /&gt;
Beispiele: Der Befehl &amp;#039;&amp;#039;CMP&amp;#039;&amp;#039; (compare) ermöglicht den Vergleich zweier Werte auf &amp;lt;,&amp;gt;, =. Der Befehl XCHG (exchange) vertauscht die Positionen zweier Operanden. Der Befehl &amp;#039;&amp;#039;CMPXCHG&amp;#039;&amp;#039; (compare and exchange) kombiniert diese beiden Befehle und ermöglicht einen bedingungsabhängigen Datenaustausch in einem Befehl. Während der Befehl &amp;#039;&amp;#039;BT (bit test)&amp;#039;&amp;#039; nur den Zustand eines einzelnen Bits in einem Integerwert prüft, ermöglichen es die Befehle &amp;#039;&amp;#039;BTC, BTR&amp;#039;&amp;#039;, und &amp;#039;&amp;#039;BTS&amp;#039;&amp;#039; darüber hinaus, das geprüfte Bit abhängig vom Ergebnis der Prüfung zu setzen &amp;#039;&amp;#039;(BTS)&amp;#039;&amp;#039;, zu löschen &amp;#039;&amp;#039;(BTR)&amp;#039;&amp;#039;, oder zu invertieren &amp;#039;&amp;#039;(BTC)&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Generell unterscheidet man zwischen CPUs mit [[Reduced Instruction Set Computer|RISC]]- (&amp;#039;&amp;#039;Reduced instruction set computer&amp;#039;&amp;#039;) oder [[CISC]]- (&amp;#039;&amp;#039;Complex instruction set computer&amp;#039;&amp;#039;) Befehlssatz. Erstere haben einen bedeutend weniger mächtigen Befehlssatz, können jeden einzelnen Befehl aber typischerweise in einem Taktzyklus abarbeiten. Moderne CPUs mit CISC-Befehlssatz (darunter fallen heute fast ausschließlich [[X86-Prozessor|x86]]-kompatible CPUs) dekodieren zur schnelleren Abarbeitung die komplexen CISC-Befehle zur Ausführung intern in eine RISC-ähnliche Mikrocontroller-Sprache.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Performance:&amp;#039;&amp;#039; Jeder Befehl wird in einer in Datenblättern angegebenen Anzahl von [[Prozessor#Prozessortakt|Taktzyklen]] des Prozessors abgearbeitet. Deren Kenntnis ermöglicht es dem Programmierer (bei extrem zeitkritischen Anwendungen) beispielsweise, Befehle mit vielen Taktzyklen durch mehrere, in der Summe aber effizientere Befehle zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== Kategorisierung der Befehle ===&lt;br /&gt;
Grundlegende Maschinen-Befehle lassen sich in folgende Kategorien unterteilen:&lt;br /&gt;
&lt;br /&gt;
* Arithmetische Operationen: Führen Berechnungen durch &amp;#039;&amp;#039;(ADD, ADC, SUB, SBB, DIV, MUL, INC, DEC)&amp;#039;&amp;#039;&lt;br /&gt;
* Logische Operationen: Verknüpfen [[Bitfeld]]er logisch miteinander ([[Konjunktion (Logik)|AND]], [[Disjunktion|OR]], [[Kontravalenz|XOR]], [[Negation|NOT]])&lt;br /&gt;
* Bit-orientierte Operationen: Mit ihnen kann man einzelne Bits in einem Bitfeld genau ansprechen, auslesen &amp;#039;&amp;#039;(BSF, BSR)&amp;#039;&amp;#039;, verschieben &amp;#039;&amp;#039;(SHL, SHR, RCL, RCR, ROL, ROR)&amp;#039;&amp;#039; bzw. manipulieren &amp;#039;&amp;#039;(BT, BTC, BTR)&amp;#039;&amp;#039;&lt;br /&gt;
* Speicheroperationen: Übertragen Daten zwischen Prozessorregistern &amp;#039;&amp;#039;(MOV, MOVSX, MOVZX, XCHG)&amp;#039;&amp;#039;, innerhalb eines Registers &amp;#039;&amp;#039;(BSWAP)&amp;#039;&amp;#039;, sowie Registern und Speicher&lt;br /&gt;
* Vergleichsoperationen: Vergleich von Werten mittels &amp;lt;, &amp;gt;, sowie = &amp;#039;&amp;#039;(CMP, TEST)&amp;#039;&amp;#039;&lt;br /&gt;
* Kombinierte Befehle aus Vergleichsoperationen, arithmetischen Operationen, und Datenaustausch &amp;#039;&amp;#039;(XADD, CMPXCHG)&amp;#039;&amp;#039;&lt;br /&gt;
* Steueroperationen: Verzweigungen, die den Ablauf des Programms beeinflussen&lt;br /&gt;
* Datenkonvertierung: Diese Befehle wandeln Werte von einer Darstellung in eine andere um, u.&amp;amp;nbsp;U. auch mit Verlust. Zum Beispiel: ein Byte in ein Word &amp;#039;&amp;#039;(CBW)&amp;#039;&amp;#039;, einen Long-Integer in ein Byte (&amp;#039;&amp;#039;CVTLB&amp;#039;&amp;#039;) oder eine doppelte genaue Fließkommazahl in einen Integer (&amp;#039;&amp;#039;CVTSD2SI&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
In vielen modernen Prozessoren sind die Befehle der Maschinensprache, zumindest die komplexeren unter ihnen, intern durch [[Mikroprogramm]]e realisiert. Das ist insbesondere bei der [[Complex Instruction Set Computing|CISC]]-Architektur der Fall.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* &amp;#039;&amp;#039;Assembler – Maschinennahes Programmieren von Anfang an&amp;#039;&amp;#039;. rororo Taschenbücher Nr. 61224 (2003), ISBN 3-499-61224-0.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Wiktionary}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4037827-5|LCCN=|NDL=|VIAF=}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachklasse]]&lt;br /&gt;
[[Kategorie:Binärcode|Maschinencode]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Trustable</name></author>
	</entry>
</feed>