PC Assembler im Systemvergleich

Assembler (Maschinensprache) ist hardware-abhängig. Also müsste der gleiche Quellcode in Assembler auf dem selben PC doch auch unter verschiedenen Betriebssystemen laufen, sofern der Code unverändert in der selben Notation geschrieben ist (bspw. die "Intel Notation") oder nicht?

Weit gefehlt! Auch wenn man sich in Assembler der CPU-spezifischen Resourcen, wie Anzahl und Größe der Register, verfügbare CPU-Befehle, usw. bedient, so besteht bereits das kleinste aller Programme (Hello World) aus mehreren Zugriffen auf das jeweilige Betriebssystem und diese Systemfunktionen unterscheiden sich massiv in der Art der Verwendung (unterschiedliche Software-Interrupts und Parameter).

Desweiteren beschreibt die sog. Notation (bspw. die "Intel Notation") nur in welcher Reihenfolge Assemblerbefehle die Parameter im Code verarbeiten (von links nach rechts oder umgekehrt).

Beispiel: Notationen

  • Intel: mov ax,4
  • AT: mov 4,ax

Und ein nicht unerheblicher Teil des Codes besteht aus Anweisungen und Makros, bei welchem die Art und Weise, wie man diesen zu schreiben hat, direkt von dem jeweils verwendeten Compiler vorgegeben wird.

Beispiel: Software Interrupt (80 hex) aufrufen

  • MASM: int 80h
  • NASM: int 0x80

Beispiel: Definition der Segmente (code, data)

  • MASM: code segment ... code ends, data segment ... data ends
  • NASM: section .text, section .data


Maschinencode unterscheidet sich in der Textform erheblich in Abhängigkeit von dem jeweils eingesetzten Compiler und Betriebssystems und selbst in rein numerischer Binärform gibt es massive Unterschiede aufgrund der unterschiedlichen Software-Interrupts, die zur Ausführung des Programmes im jeweiligen Betriebssystem nötig sind.

Wie sehr sich bereits kleinste Assemblerprogramm bei unterschiedlichen System unterscheiden, sieht man anhand der nachfolgenden "Hello World" Beispiele.


Coding Beispiele:


Software - Windows:

  • MASM (Microsoft Assembler):
    Dieser Assembler für die Microsoft Systeme (DOS, Windows, usw.) war bis zur Version 6.x ein eigenständiges Produkt, ist inzwischen aber in den "Visual Studios für C++" mit enthalten und war schon immer kostenpflichtig. MASM war von Beginn nicht nur ein Kompiler, sondern eine komplette Softwaresammlung, inkl. eigener Entwicklungsumgebung und Debugger (sogar bereits in der DOS Zeit mit dem Tool "PWR"). Den MASM für die 64 bit Windows Systeme (Windows Vista und Windows 7, usw.) findet man bspw. im "Visual Studio 2005" oder neuer:
     
    => MASM 2005 (8.0): http://msdn.microsoft.com/de-de/library/hb5z4sxd%28v=VS.80%29.aspx
     
  • TASM (Turbo Assembler):
    Früher (zu DOS und zu Beginn der Windows - Zeiten) gab es mit dem TASM einen enstzunehmenden Konkurrenten von Borland, nur leider gibt es diese Firma nicht mehr. Die Firma musste schließen, die Marke wurde verkauft. Fast alle damaligen Produkte sind "gestorben". Dazu gehören neben Turbo C++ eben auch das besagte Turbo Assembler (TASM). Nur der letzte Nachfolger vom originalen Turbo Pascal namens "Delphi" lebt heute noch durch die Firma "Embarcadero" weiter. Ich erwähne dies nur deswegen hier noch einmal explizit, weil sich sehr viele Assembler-Beispiele (in anderen Artikeln und im Web) auf den TASM beziehen.
     
  • Alternativen:
    Es gibt viele kostenlose Alternativen zum MASM. Für 32bit Windows Systeme gibt es bspw. den MASM 32 von CodingCrew (leider fehlt bis heute die 64bit Variante)

Software - Linux:

Unter Linux gibt es ein Unzahl von Assemblern, bspw.

  • NASM :
    NASM ist einer der üblichen Compiler, die für Assembler Codes unter Linux Verwendung finden. Er ist dem MASM nicht unähnlich. NASM verwendet ebenfalls die sog. "Intel Notation".
     
  • GNU AS :
    Der GNU Assembler (as) ist der Standardcompiler unter Linux, da er mit dem GNU C/C++ mit ausgeliefert wird. "AS" unterstützt sowohl die "AT&T Notation" (= default), als auch die "Intel Notation".  
     
    Die Unterschiede zw. NASM und AS werden ua. in folgendem Artikel detailliert beschrieben.
    => http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html