Maschinensprache
Im Computerprogrammierung, Maschinensprache ist jeder Programmiersprache mit niedriger Ebene, bestehend aus Maschinensprache Anweisungen, die verwendet werden, um die eines Computers zu steuern Zentrale Verarbeitungseinheit (ZENTRALPROZESSOR). Jede Anweisung bewirkt, dass die CPU eine sehr spezifische Aufgabe ausführt, z. B. eine Last, einen Speicher, a springen, oder an Arithmetik-Logikeinheit (ALU) Betrieb auf einer oder mehreren Dateneinheiten in den CPUs Register oder Erinnerung.
Maschinencode ist eine streng numerische Sprache, die so schnell wie möglich ausgeführt wird und als die niedrigste Darstellung von a angesehen werden kann zusammengestellt oder gebaut Computerprogramm oder als primitiv und Hardware--Abhängige Programmiersprache. Während es möglich ist, Programme direkt in den Maschinencode zu schreiben, einzelne Bits zu verwalten und numerisch zu berechnen Adressen und Konstanten manuell sind mühsam und fehleranfällig. Aus diesem Grund sind Programme in modernen Kontexten sehr selten direkt im Maschinencode geschrieben, können jedoch für niedrige Ebene durchgeführt werden Debuggen, Programm Patching (insbesondere wenn Assembler -Quelle nicht verfügbar ist) und Montagesprache Demontage.
Die meisten praktischen Programme sind heute in geschrieben Übergeordnete Sprachen oder Montagesprache. Der Quellcode wird dann von Dienstprogrammen wie Dienstprogramme wie z. Compiler, Assembler, und Linkermit der wichtigen Ausnahme von interpretiert Programme,[NB 1] die nicht in den Maschinencode übersetzt werden. Allerdings die Dolmetscher selbst, das als Testamentsvollstrecker oder Prozessor angesehen werden kann, der die Anweisungen des Quellcodes ausführt, besteht in der Regel aus direkt ausführbarem Maschinencode (generiert aus Assembly- oder hochrangiger Sprachcode).
Der Maschinencode ist per Definition die niedrigste Programmierdetails, die für den Programmierer sichtbar ist, aber intern werden viele Prozessoren verwendet Mikrocode oder optimieren und verwandeln Sie Maschinencode -Anweisungen in Sequenzen von Mikrooperationen. Dies gilt im Allgemeinen nicht als Maschinencode.
Befehlssatz
Jede Prozessor- oder Prozessorfamilie hat seine eigene Befehlssatz. Anweisungen sind Muster von Bits, Ziffern oder Zeichen, die Maschinenbefehlen entsprechen. Somit ist der Anweisungssatz spezifisch für eine Klasse von Prozessoren, die (meistens) dieselbe Architektur verwenden. Nachfolger- oder Derivatprozessordesigns enthalten häufig Anweisungen eines Vorgängers und können neue zusätzliche Anweisungen hinzufügen. Gelegentlich wird ein Nachfolgerdesign die Bedeutung eines Anweisungscode (normalerweise weil er für neue Zwecke benötigt) eingestellt oder verändert, was sich in gewissem Maße auf die Codekompatibilität auswirkt. Selbst kompatible Prozessoren zeigen für einige Anweisungen möglicherweise ein geringfügiges Verhalten, aber dies ist selten ein Problem. Systeme können sich auch in anderen Details unterscheiden, z. B. Speicheranordnung, Betriebssysteme oder Peripheriegeräte. Da ein Programm normalerweise auf solchen Faktoren beruht, werden in verschiedenen Systemen in der Regel nicht den gleichen Maschinencode ausgeführt, selbst wenn derselbe Prozessoryp verwendet wird.
Der Anweisungssatz eines Prozessors kann alle Anweisungen derselben Länge haben oder Anweisungen mit variabler Länge haben. Wie die Muster organisiert werden, variiert von der jeweiligen Architektur und Art des Unterrichts. Die meisten Anweisungen haben einen oder mehrere Opcode Felder, die den Grundanweisungsart angeben (z. B. arithmetisch, logisch, springenusw.), die Operation (z. B. hinzufügen oder vergleiche) und andere Felder, die den Typ der Operand(s) die Adressierungsmodus(s), die Adressierungsversetzt (n) oder den Index oder der Operandenwert selbst (solche konstanten Operanden, die in einer Anweisung enthalten sind sofort).[1]
Nicht alle Maschinen oder individuellen Anweisungen haben explizite Operanden. Ein Akkumulatormaschine hat einen kombinierten linken Operanden und führt zu einem impliziten Akkumulator für die meisten arithmetischen Anweisungen. Andere Architekturen (wie 8086 und die X86-Familie) haben Akkumulatorversionen von gemeinsamen Anweisungen, wobei der Akkumulator durch längere Anweisungen als eine der allgemeinen Register angesehen wird. EIN Stapelmaschine hat die meisten oder alle Operanden auf einem impliziten Stapel. Anweisungen für besondere Zwecke fehlen auch häufig explizite Operanden (CPUID in der X86 -Architektur schreibt beispielsweise Werte in vier implizite Zielregister). Diese Unterscheidung zwischen expliziten und impliziten Operanden ist bei Codegeneratoren wichtig, insbesondere in der Zuteilung registrieren und Live Range Tracking -Teile. Ein guter Code -Optimierer kann implizite sowie explizite Operanden verfolgen, die möglicherweise häufiger ermöglichen Konstante Ausbreitung, Konstante Faltung von Registern (ein Register hat das Ergebnis eines konstanten Ausdrucks zugewiesen, der durch diese Konstante ersetzt wurde) und andere Codeverbesserungen.
Programme
A Computer Programm ist eine Liste von Anweisungen, die von a ausgeführt werden können Zentrale Verarbeitungseinheit (ZENTRALPROZESSOR). Die Ausführung eines Programms erfolgt, damit die CPU sie ausführt, um ein Problem zu lösen und somit ein Ergebnis zu erzielen. Während einfache Prozessoren in der Lage sind, Anweisungen nacheinander auszuführen, Superscalar Prozessoren können viele Anweisungen gleichzeitig ausführen.
Programmfluss kann durch spezielle 'Jump' -Anweisungen beeinflusst werden, die die Ausführung in eine andere Adresse (und damit daher Anweisungen) als die nächste numerisch sequentielle Adresse übertragen. Ob diese Bedingte Sprünge Das Auftreten hängt von einer Bedingung ab, wie ein Wert größer als, weniger als einem anderen Wert.
Assemblersprachen
Eine viel menschlicher freundliche Darstellung der Maschinensprache, genannt Montagesprache, Verwendet Mnemonische Codes Um sich auf Anweisungen für Maschinencode zu beziehen, anstatt die numerischen Werte der Anweisungen direkt zu verwenden und verwendet Symbolische Namen sich auf Speicherorte und manchmal beziehen Register. Zum Beispiel auf der Zilog Z80 Prozessor, der Maschinencode 00000101
, was dazu führt, dass die CPU die verringert B
Prozessorregister, würde in der Montagesprache als dargestellt Dez b
.
Beispiel
Das MIPS -Architektur Bietet ein spezifisches Beispiel für einen Maschinencode, dessen Anweisungen immer 32 Bit lang sind. Die allgemeine Art der Anweisung wird von der gegeben op (Betrieb) Feld, die höchsten 6 Bit. J-Typ (Sprung) und I-Typ (unmittelbare) Anweisungen sind vollständig angegeben durch op. Anweisungen vom R-Typ (Register) enthalten ein zusätzliches Feld funk Um den genauen Betrieb zu bestimmen. Die in diesen Typen verwendeten Felder sind:
6 5 5 5 5 6 Bits [OP | Rs | Rt | Rd | Shamt | FUNCT] R-Typ [OP | Rs | Rt | Adresse/unmittelbar] I-Typ [OP | Zieladresse] J-Type
Rs, rt, und Rd Geben Sie Registeroperanden an; Shamt gibt einen Schichtbetrag; und die die Anschrift oder sofort Felder enthalten direkt einen Operanden.
Beispielsweise wird das Hinzufügen der Register 1 und 2 und das Platzieren des Ergebniss in Register 6 codiert:
[op | Rs | Rt | Rd | Shamt | Funktion] 0 1 2 6 0 32 Dezimal 000000 00001 00010 00110 00000 100000 Binär
Laden Sie einen Wert in Register 8, entnommen aus den Zellen der Speicherzelle 68 nach dem in Register 3 aufgeführten Standort:
[op | Rs | Rt | Adresse/unmittelbar] 35 3 8 68 Dezimal 100011 00011 01000 00000 00001 000100 Binär
Springen zur Adresse 1024:
[op | Zieladresse] 2 1024 Dezimal
Überlappende Anweisungen
Auf Prozessorarchitekturen mit Befehlssätze der variablen Länge[2] (wie zum Beispiel Intel's x86 Prozessorfamilie) Es liegt innerhalb der Grenzen des Reseynchronisierungsphänomens des Kontrollflusses als die Kruskal Count,[3][2] Manchmal möglich durch die Programmierung auf Opcode-Ebene, um den resultierenden Code absichtlich zu ordnen, so dass zwei Codepfade ein gemeinsames Fragment von Opcode-Sequenzen teilen. Diese nennt man Überlappende Anweisungen, überlappende Opcodes, überlappender Code, überlappter Code, Unterrichtspreis, oder Springen Sie in die Mitte einer Anweisungund repräsentieren eine Form von Überlagerung.[4][5][6]
In den 1970er und 1980er Jahren wurden manchmal überlappende Anweisungen verwendet, um den Speicherplatz zu erhalten. Ein Beispiel war die Implementierung von Fehlertabellen in Microsoft's Altair Basic, wo verschachtelte Anweisungen gemeinsam mit ihren Anweisungsbytes.[7][2][4] Die Technik wird heute selten eingesetzt, kann aber noch notwendig sein, um in Bereichen zurückzugreifen, in denen eine extreme Optimierung für die Größe auf Byte-Ebene erforderlich ist Bootlader in die müssten Bootsektoren.[NB 2]
Es wird manchmal auch als verwendet als Code Verschleierung Technik als Maß gegen Demontage und manipuliert.[2]
Das Prinzip wird auch in gemeinsam genutzten Codesequenzen von verwendet Fette Binärdateien Dies muss auf mehreren infizierbaren Prozessorplattformen mit Anweisungen ausgeführt werden.
Diese Eigenschaft wird auch verwendet, um zu finden unbeabsichtigte Anweisungen genannt Geräte in vorhandenen Code -Repositories und wird in verwendet Return-orientierte Programmierung als Alternative zu Codeinjektion Für Heldentaten wie z. Return-to-libc-Angriffe.[8][2]
Beziehung zum Mikrocode
In einigen Computern der Maschinencode der die Architektur wird durch eine noch grundlegendere zugrunde liegende Schicht genannt MikrocodeBereitstellung einer gemeinsamen Maschinensprachschnittstelle über eine Linie oder Familie verschiedener Computermodelle mit sehr unterschiedlichem zugrunde liegenden Datenflüsse. Dies geschieht, um zu erleichtern Portierung von Maschinensprachenprogrammen zwischen verschiedenen Modellen. Ein Beispiel für diese Verwendung ist das IBM System/360 Familie von Computern und ihre Nachfolger. Mit Datenfadenbreiten von 8 Bit bis 64 Bits und darüber hinaus weisen sie dennoch eine gemeinsame Architektur auf der gesamten Linie auf Maschinensprachenebene auf.
Verwenden von Microcode zur Implementierung eines Emulator Ermöglicht dem Computer die Architektur eines ganz anderen Computers. Die System-/360 -Linie verwendete dies, um Portierungsprogramme von früheren IBM -Maschinen in die neue Computerfamilie zu ermöglichen, z. ein IBM 1401/1440/1460 Emulator auf dem IBM S/360 Modell 40.
Beziehung zu Bytecode
Der Maschinencode unterscheidet sich im Allgemeinen von Bytecode (auch als P-Code bezeichnet), das entweder von einem Interpreter ausgeführt oder selbst in Maschinencode für eine schnellere (direkte) Ausführung kompiliert wird. Eine Ausnahme besteht darin, dass ein Prozessor so konzipiert ist Java -Prozessoren.
Maschinencode und Montagecode werden manchmal aufgerufen einheimisch Code Bei Bezug auf plattformabhängige Teile von Sprachmerkmalen oder Bibliotheken.[9]
Speichern im Gedächtnis
Das Harvard Architektur ist eine Computerarchitektur mit physikalisch separaten Speicher- und Signalwegen für den Code (Anweisungen) und Daten. Heute implementieren die meisten Prozessoren solche separaten Signalwege aus Leistungsgründen, aber a Modifizierte Harvard -Architekturso können sie Aufgaben wie das Laden eines eins unterstützen ausführbar Programm von Festplattenspeicher als Daten und dann ausführen. Harvard -Architektur steht im Gegensatz zu der Von Neumann Architektur, wobei Daten und Code in demselben Speicher gespeichert werden, der vom Prozessor gelesen wird, sodass der Computer Befehle ausführen kann.
Aus der Sicht von a Prozess, das Coderaum ist der Teil seiner Adressraum wo der Code in der Ausführung gespeichert ist. Im Multitasking Systeme Dies umfasst das Programm des Programms Codesegment und normalerweise gemeinsame Bibliotheken. Im Multi-Threading Umgebung, verschiedene Fäden eines Prozesses teilen Code -Raum zusammen mit dem Datenraum, wodurch der Overhead von reduziert wird Kontextumschaltung erheblich im Vergleich zum Prozessumschalten.
Lesbarkeit durch Menschen
Pamela Samuelson schrieb, dass der Maschinencode so unlesbar ist, dass die Urheberrechtsbüro der Vereinigten Staaten Ich kann nicht feststellen, ob ein bestimmtes codiertes Programm ein ursprüngliches Werk der Urheberschaft ist.[10] Das US -amerikanische Urheberrechtsbüro tut Ermöglichen Sie eine Urheberrechtsregistrierung von Computerprogrammen[11] und der Maschinencode eines Programms kann manchmal sein zerlegt Um das Funktionieren für den Menschen leichter verständlich zu machen.[12] Die Ausgabe eines Dekompillers oder Disassemblers fehlt jedoch die Kommentare und symbolischen Referenzen. Während die Ausgabe möglicherweise einfacher zu lesen ist als der Objektcode, ist er dennoch schwieriger als der ursprüngliche Quellcode. Dieses Problem existiert nicht für Objektcode-Formate wie Squäze, wo der Quellcode in der Datei enthalten ist.
Professor für kognitive Wissenschaft Douglas Hofstadter hat den Maschinencode mit verglichen genetischer Codeund sagen, dass "das Betrachten eines in Maschinensprache geschriebenen Programms vage vergleichbar mit der Betrachtung eines ist DNA Molekülatom durch Atom. "[13]
Siehe auch
- Montagesprache
- Endiangess
- Liste der Maschinensprachen
- Maschinencode -Monitor
- Overhead -Code
- P-Code-Maschine
- Reduziertes Anweisungssatz Computing (RISC)
- Sehr langes Unterrichtswort
- Lehrmaschinencode: Micro-Professor MPF-I
Anmerkungen
- ^ Wie viele Versionen von BASIC, besonders früh, ebenso wie Smalltalk, Matlab, Perl, Python, Rubin und andere besondere Zwecke oder Skriptsprachen.
- ^ Als Beispiel die DR-DOS MBRs und Bootsektoren (die auch die halten Partitionstabelle und BIOS -Parameterblock, waren in der Lage, die Startdatei in der Startdatei zu lokalisieren FAT12 oder FAT16 Dateisystem von selbst und laden Sie es in das Gedächtnis als Ganzes, im Gegensatz zu ihren Kollegen in MS-DOS/PC dos, was sich stattdessen auf die stützte Systemdateien die ersten beiden besetzen Verzeichniseinträge im Dateisystem und die ersten drei Sektoren von Ibmbio.com Zu Beginn des Datenbereichs in zusammenhängenden Sektoren mit einem Sekundärlader zum Laden des Restes der Datei in Speicher (erfordert erforderlich Sys sich um all diese Bedingungen kümmern). Wann FAT32 und LBA Unterstützung wurde hinzugefügt, Microsoft sogar umgeschaltet auf Anforderung 386 Anweisungen und teilen Sie den Startcode über zwei Sektoren aus Codegröße auf rückwärts- und Kreuzkompatibilität mit anderen Betriebssystemen in Multi-Boot und Kettenbelastung Szenarien sowie älter Stck. Stattdessen die DR-DOS 7.07 Bootsektoren greifen auf selbstmodifizierender Code, Opcode-Level -Programmierung in Maschinensprache, kontrollierte Nutzung von (dokumentiert) Nebenwirkungen, überlappend und algorithmisch mit mehrstufiger Daten/Code Falten Techniken, die immer noch alles in einen physischen Sektor von nur 512 Bytes passen, ohne eine ihrer erweiterten Funktionen aufzugeben.
Verweise
- ^ Kjell, Bradley. "Sofortiger Operand".
- ^ a b c d e Jacob, Matthias; Jakubowski, Mariusz H.; Venkatesan, Ramarathnam (20. bis 21. September 2007). In Richtung Integral Binary Execution: Implementierung von unvergesslichem Hashing mit überlappenden Befehlskodierungen (PDF). Verfahren des 9. Workshops über Multimedia & Security (MM & Sec '07). Dallas, Texas, USA: Verband für Rechenmaschinen. S. 129–140. Citeseerx 10.1.1.69.5258. doi:10.1145/1288869.1288887. ISBN 978-1-59593-857-2. S2CID 14174680. Archiviert (PDF) vom Original am 2018-09-04. Abgerufen 2021-12-25. (12 Seiten)
- ^ Lagarias, Jeffrey C.; Regen, Eric; Vanderbe, Robert J. (2009) [2001-10-13]. Brams, Stephen; Gehrlein, William V.; Roberts, Fred S. (Hrsg.). Die Kruskal -Graf (PDF). Die Mathematik von Präferenz, Auswahl und Ordnung. Essays zu Ehren von Peter J. Fishburn. Berlin / Heidelberg, Deutschland: Springer-Verlag. S. 371–391. Arxiv:Math/0110143. ISBN 978-3-540-79127-0. Archiviert (PDF) vom Original am 2021-12-25. Abgerufen 2021-12-25. (22 Seiten)
- ^ a b "Unbeabsichtigte Anweisungen auf x86". Hacker News. 2021. Archiviert vom Original am 2021-12-25. Abgerufen 2021-12-24.
- ^ Kinder, Johannes (2010-09-24). Statische Analyse von X86 Executables [Statische analysieren von programmen in x86 maschinenspraches] (PDF) (Dissertation). München, Deutschland: Technische Universität Darmstadt. D17. Archiviert vom Original am 2020-11-12. Abgerufen 2021-12-25. (199 Seiten)
- ^ "Was ist" überlappende Anweisungen "Verschleierung?". Reverse Engineering Stack Exchange. 2013-04-07. Archiviert vom Original am 2021-12-25. Abgerufen 2021-12-25.
- ^ Tore, William "Bill" Henry, Persönliche Kommunikation (Nb. Nach Jacob et al.))
- ^ Shacham, Hovav (2007). Die Geometrie des unschuldigen Fleisches am Knochen: Rückkehr-in-libc ohne Funktionsaufrufe (auf dem x86) (PDF). Proceedings of the ACM, CCS 2007. ACM -Presse. Archiviert (PDF) vom Original am 2021-12-15. Abgerufen 2021-12-24.
- ^ "Managed, nicht verwaltet, nativ: Was für ein Code ist das?". Entwickler.com. 2003-04-28. Abgerufen 2008-09-02.
- ^ Samuelson, Pamela (September 1984). "Contu Revisited: Der Fall gegen den Schutz des Urheberrechts für Computerprogramme in maschinellem Lesbarem Form". Duke Law Journal. 1984 (4): 663–769. doi:10.2307/1372418. JStor 1372418. PMID 10268940.
- ^ "Urheberrechtsregistrierung für Computerprogramme" (PDF). US -Urheberrechtsbüro. August 2008. Abgerufen 2014-02-23.
- ^ "Was ist Dekompile? - Definition von Whatis.com". Whatis.com. Abgerufen 2016-12-26.
- ^ Hofstadter, Douglas R. (1980). Gödel, Escher, Bach: Ein ewiges goldenes Geflecht. p. 290.
Weitere Lektüre
- Hennessy, John L.; Patterson, David A. (1994). Computerorganisation und Design. Die Hardware-/Software -Oberfläche. Morgan Kaufmann Publishers. ISBN 1-55860-281-x.
- Tanenbaum, Andrew S. (1999). Strukturierte Computerorganisation. Prentice Hall. ISBN 0-13-020435-8.
- Brookshear, J. Glenn (2007). Informatik: Ein Überblick. Addison Wesley. ISBN 978-0-321-38701-1.