Assemblersprache - Einführung

Assemblersprache ist die dem Hardware-Layer am nächsten gelegene Sprache in der Familie der Computerprogrammiersprachen; sie ist eine für Menschen lesbare mnemonische Darstellung von Maschinenanweisungen.

Das Wesen der Assemblersprache zu verstehen, ist der erste Schritt, um Computersysteme tiefgehend zu erlernen.


Was ist Assemblersprache

Die CPU eines Computers kann nur0en und 1enverstehen und ausführen, die den binären Maschinencode bilden.

Zum Beispiel stellt in der x86-Architektur der MaschinencodeB8 2A 00 00 00das Laden des Wertes 42 in das EAX-Register dar.

Das direkte Schreiben von binärem Maschinencode ist für Menschen extrem schwierig und fehleranfällig, weshalb die Assemblersprache entstanden ist.

Die Assemblersprache verwendet für Menschen lesbareMnemonics (Mnemonik), um diese binären Anweisungen darzustellen. Zum Beispiel wird der obige Maschinencode in Assembler so geschrieben:

Beispiel

mov eax, 42    ; Wert 42 in das EAX-Register verschieben

Ein Assembler ist dafür verantwortlich, diese Mnemonics wieder in Maschinencode zu übersetzen, den die CPU ausführen kann.

Im obigen Beispielmovist das Mnemonic,eaxist der Zieloperand,42ist der Quelloperand.

Die Assemblersprache verwendet Mnemonics, um maschinensprachliche Operationen zu ersetzen, unterstützt Marken und Symbole, um auf Adressen und Konstanten zu verweisen, und vermeidet Hardcoding. Die Assemblersprache entspricht in etwa eins zu eins dem entsprechenden maschinensprachlichen Befehlssatz.


Beziehung zwischen Assemblersprache und Maschinencode

Zwischen Assembleranweisungen und Maschinenanweisungen bestehteine Eins-zu-Eins-Beziehung.

Jede Assembleranweisung wird präzise auf eine CPU-Maschinenanweisung abgebildet, ohne eine abstrakte Zwischenschicht.

FormBeispielBeschreibung
Maschinencode (binär)10111000 00101010 00000000 00000000 00000000Von der CPU direkt ausgeführte Anweisungen
Maschinencode (hexadezimal)B8 2A 00 00 00Für Menschen lesbare Darstellung des Maschinencodes
Assemblersprachemov eax, 42Für Menschen lesbare mnemonische Darstellung

Assemblersprache und Maschinencode haben eine Eins-zu-Eins-Entsprechung, aber CPUs verschiedener Architekturen haben unterschiedliche Befehlssätze. Zum Beispiel ist die Assemblersyntax von x86 und ARM völlig unterschiedlich.


Unterschiede zwischen Assembler- und Hochsprachen

Die folgende Abbildung zeigt die verschiedenen Wege vom Quellcode zur Ausführung für Hochsprachen und Assemblersprache:

高级语言 vs 汇编语言对比

MerkmalAssemblerspracheHöhere Programmiersprache (z. B. Python)
AbstraktionsebeneUnterste Ebene, steuert die Hardware direktHoch, Betriebssystem und Laufzeitumgebung kapseln Details
CodegrößeEinfache Funktionen erfordern viel CodeEine geringe Menge Code implementiert komplexe Funktionen
LesbarkeitSchwer zu lesen und zu wartenMenschlich freundlich, leicht verständlich
AusführungseffizienzHöchste, kein Laufzeit-OverheadGeringer, hat Interpretations- oder Kompilierungs-Overhead
Hardware-SteuerungVolle Kontrolle über CPU und SpeicherIndirekter Zugriff über abstrakte Schnittstellen
PortabilitätSchlecht, muss für andere CPUs neu geschrieben werdenGut, derselbe Code kann auf mehreren Plattformen ausgeführt werden

Anwendungsszenarien der Assemblersprache

Obwohl die Assemblersprache keine Mainstream-Wahl für die tägliche Entwicklung ist, ist sie in bestimmten Bereichen nach wie vor unersetzlich:

FeldSpezifische Anwendung
BetriebssystemkernelBootloader, Kontextwechsel, Interrupt-Behandlung usw. müssen in Assembler geschrieben werden
Eingebettete SystemeGeräte mit extrem begrenzten Ressourcen erfordern eine präzise Hardwaresteuerung
Reverse EngineeringAnalyse von Malware, Knacken von Softwareschutz, Verständnis der Logik von Closed-Source-Programmen
Leistungskritischer CodeKernfunktionen mit extrem hohen Leistungsanforderungen, wie Verschlüsselungsalgorithmen und Audio-/Video-Codecs
SicherheitsforschungSchreiben von Shellcode, Exploit-Code
Compiler-EntwicklungVerständnis der Zielcodegenerierung, Schreiben oder Optimieren von Compiler-Backends

Einführung in die x86-Architektur

x86Es handelt sich um eine Mikroprozessorarchitektur, die 1978 von Intel mit dem Prozessor 8086 eingeführt wurde und Generationen wie 80286, 80386 (i386), 80486, Pentium usw. durchlaufen hat.

x86 ist die am weitesten verbreitete Desktop- und Server-CPU-Architektur und eine ideale Plattform zum Erlernen der Assemblersprache.

Dieses Tutorial verwendet die32-Bit x86-Architektur(auch IA-32 oder i386 genannt) als Lehrgrundlage, da ihr Registermodell prägnant und übersichtlich und für Anfänger geeignet ist.

32-Bit-x86-Assembler ist der beste Ausgangspunkt für das Erlernen der Assemblersprache. Nach der Beherrschung von 32-Bit ist der Übergang zu 64-Bit (x86-64) sehr natürlich, da Letzteres eine Erweiterung Ersteres ist.


Einführung in den NASM-Assembler

NASM (Netwide Assembler)ist ein Open-Source-x86-Assembler, der mehrere Ausgabeformate und alle gängigen Betriebssysteme unterstützt.

Verglichen mit MASM (Microsoft Assembler) und GAS (GNU Assembler) ist die Syntax von NASM klarer und intuitiver, was ihn zur besten Wahl für das Erlernen der Assemblersprache macht.

AssemblerSyntaxstilPlattformFunktionen
NASMIntel-SyntaxPlattformübergreifendOpen-Source, klare Syntax, umfassende Dokumentation
MASMIntel-SyntaxWindowsOffiziell von Microsoft, leistungsstark, aber plattformbeschränkt
GASAT&T-SyntaxPlattformübergreifendStandard der GNU-Toolchain, Syntax ist kontraintuitiv

Dieses Tutorial verwendet ausschließlich den NASM-Assembler mit Intel-Syntax.

Weitere Erweiterungen