Es gibt keinen Königsweg und noch nicht einmal eine "Bibel" für Assembler. Am
besten schnappt man sich ein Tutorial oder ein Lehrbuch und ackert es von vorne
nach hinten durch. Die dort aufgezeigten Wege hat man widerstandslos zu akzeptieren.
Es ist eigentlich egal, ob man Assembler unter DOS, Windows oder Linux oder gar
für den eigenen Mikroprozessor lernt, wichtig ist nur, dass man den einmal
eingeschlagenen Weg nicht nur aus Frust verlässt - und Frust wird kommen ;-)
Für Windows ist wohl der einfachste Einstieg eine Nasm-GCC-Kombination:
Beim Download ist empfehlenswert, sich nicht nur den Installer zu holen,
sondern auch das neueste Win32-API-Paket:
Die Installation geschieht mit MinGW-5.1.4.exe. Dieses Programm holt sich
weitere Dateien aus dem Internet. Beim Installieren ist das Häkchen bei g++ compiler
zu setzen, alles andere kann wie vorgeschlagen akzeptiert werden:
Das heruntergeladene Win32-API-Paket (w32api-X.XX-mingw32-dev.tar.gz) muss zweimal entpackt werden.
Beim ersten Entpacken entsteht nur eine TAR-Datei. Diese muss auch noch entpackt werden.
Viele Entpackprogramme meistern diese zweifache Entpackung in einem Schritt. Es entstehen zwei
Verzeichnisse: include und lib. Diese Verzeichnisse werden gnadenlos über
die gleichlautenden Verzeichnisse und vorhandenen Dateien im MingW-Verzeichnis drüberkopiert.
Nun erstelle man eine Textdatei mit dem Namen hallo.nasm:
Folgende drei Konsolenanweisungen kompilieren hallo.nasm zu hallo.obj, linken es zusammen
mit der C-Bibliothek von GCC zum Programm hallo.exe und führen das Programm (hallo.exe)
aus:
NASM und GCC sind plattformunabhängige Programme, d.h. sie existieren für Windows
und für Linux. Wer zwischen diesen Betriebssystemen wechseln will, muss sich nicht
mühsam in die Grundlagen neuer Programme einarbeiten
Mit dem MingW-GCC steht auch ein funktionierender und moderner C++-Compiler zur Verfügung.
Die Win32- und C-Bibliotheken sind vorhanden und einkompiliert, d.h. man muss sich meistens nicht um LIB-Dateien
kümmern.
Mit dieser Kombination lassen sich Assembler- und C-Programme recht mühelos kombinieren:
Dem Aufruf einer C-Funktion in Assembler muss ein Unterstrich vorangestellt werden.
Die Funktion Print im GCC-Modul wird also durch call _Print im NASM-Modul
aufgerufen. Diese Technik wird Name Mangling oder Name Decoration genannt.
Für GCC gilt dabei folgendes:
Calling convention
extern "C"
GCC-Funktion (_cdecl)
_Funktion (nur Unterstrich)
Win32-API (stdcall)
_Funktion@0 (Unterstrich, Klammeraffe und Anzahl der Bytes auf dem Stack)
Beim Aufruf von Win32-Funktionen ist das Zählen der Bytes auf dem Stack
ziemlich nervig und fehlerträchtig. Ebenso führt das Aufräumen des Stacks nach
dem Aufruf einer Funktion nach der cdecl calling convention häufig zu Fehlern.
Nachfolgend werden zwei Makros vorgestellt, die das Pushen, die EXTERN-Deklaration, Dekoration und das
Aufräumen des Stacks übernehmen: