Eine Assemblersprache, die manchmal als Assembler oder ASM bezeichnet wird, ist eine Programmiersprache auf niedriger Ebene.
In Assemblersprachen geschriebene Programme werden von einem Assembler kompiliert. Jeder Assembler hat seine eigene Assemblersprache, die für eine bestimmte Computerarchitektur ausgelegt ist.
Warum ist ASM nützlich?
Maschinensprache ist eine Zahlenfolge, die für Menschen nicht einfach zu lesen ist. Mit ASM können Programmierer menschenlesbare Programme schreiben, die fast genau der Maschinensprache entsprechen.
Der Nachteil ist, dass alles, was der Computer tut, explizit und genau beschrieben werden muss. Der Vorteil besteht darin, dass der Programmierer die maximale Kontrolle darüber hat, was der Computer tut.
Warum ist ASM eine „Low-Level“-Sprache?
Assembler wird als Low-Level-Programmiersprache bezeichnet, weil es (fast) eine Eins-zu-Eins-Beziehung zwischen dem gibt, was sie dem Computer sagt, und dem, was der Computer tut. Im Allgemeinen enthält eine Zeile eines Assemblerprogramms maximal eine Anweisung für den Computer.
Wie unterscheidet sich ASM von einer „Hochsprache“?
Hochsprachen bieten Abstraktionen von Operationen auf niedriger Ebene, die es dem Programmierer ermöglichen, sich mehr darauf zu konzentrieren, zu beschreiben, was er tun möchte, und weniger darauf, wie es getan werden sollte. Die Programmierung auf diese Weise ist bequemer und macht Programme auf Kosten der Steuerung auf niedriger Ebene leichter lesbar.
Programme, die in Hochsprachen geschrieben sind, erreichen niemals die rohe Geschwindigkeit und Effizienz von Programmen, die in Assembler geschrieben wurden. Beispiele für Hochsprachen sind Python, Java, JavaScript, Clojure und Lisp.
Was ist eine „mittlere“ Sprache?
Sprachen auf mittlerer Ebene oder Sprachen auf niedrigerer Ebene bieten einige Abstraktionen auf hoher Ebene, um das Leben des Programmierers zu erleichtern, und bieten gleichzeitig Zugriff auf Operationen auf niedriger Ebene. Sie werden häufig zum Schreiben von Betriebssystemen verwendet, daher werden sie manchmal als Systemprogrammiersprachen bezeichnet.
Programme, die in Mittelsprachen geschrieben sind, können genauso gut oder fast so gut funktionieren wie Programme, die in Assemblersprache geschrieben sind. Beispiele für mittlere Programmiersprachen sind C, C++, Ada, Nim und Rust.
Ist ASM portabel?
Nein. Da Assemblersprachen an eine bestimmte Computerarchitektur gebunden sind, sind sie nicht portierbar. Ein in einer Assemblersprache geschriebenes Programm müsste vollständig neu geschrieben werden, damit es auf einem anderen Maschinentyp ausgeführt werden kann.
Portabilität ist einer der Hauptvorteile von höheren Sprachen. Die Programmiersprache C wird oft als “Portable Assembly” bezeichnet, weil C-Compiler für fast jede moderne Systemarchitektur existieren. Ein in C geschriebenes Programm erfordert möglicherweise einige Änderungen, bevor es auf einem anderen Computer kompiliert werden kann, aber die Kernsprache ist portabel.
Im Allgemeinen gilt: Je höher eine Sprache ist, desto weniger Änderungen müssen vorgenommen werden, damit sie auf einer anderen Architektur ausgeführt werden kann. Die Sprachen der untersten Ebene – Maschinensprache und Assemblersprache – sind nicht portierbar.
Beispiel: Hallo, Welt! in 32-Bit-Assembly, für Windows
Hier ist “Hello, World”, geschrieben für einen 32-Bit-Intel-Prozessor. Es läuft auch auf einem 64-Bit-Prozessor. Wir werden es unter Windows 10 kompilieren und ausführen.
global _main extern _printf section .text _main: push message call _printf add esp, 4 ret message: db 'Hello, World!', 10, 0
Öffnen Sie zunächst den Editor. Kopieren Sie den obigen Code, fügen Sie ihn in eine neue Textdatei ein und speichern Sie die Datei unter hello.asm.
Um die Assembly zu kompilieren, verwenden wir NASM, den Netwide Assembler. Es kann von der NASM-Website heruntergeladen werden.
nasm -f win32 hello.asm
Wenn Sie diesen Befehl ausführen, erstellt NASM eine Objektdatei. Eine Objektdatei enthält Maschinencode, ist aber keine ausführbare Datei. Unsere Objektdatei heißt hello.obj.
Um die ausführbare Datei zu erstellen, verwenden wir die 32-Bit-Version von MinGW (Minimal GNU for Windows), die den gcc-Compiler bereitstellt. Es kann auf der MinGW-Website heruntergeladen werden.
gcc -o hello.exe hello.obj
hello
Hello, World!
Beispiel: Hallo, Welt! in 64-Bit-Assembly, für Linux
Hier ist “Hello, World”, geschrieben für einen 64-Bit-Intel-Prozessor. Wir werden es auf 64-Bit-Linux kompilieren und ausführen.
extern printf ; the C printf function, to be called section .data ; Data section, initialized variables msg: db "Hello, world!", 0 ; C string terminates with 0 fmt: db "%s", 10, 0 ; The printf format, "n",'0' section .text ; Begin code section global main ; the standard gcc entry point main: ; the program label for the entry point push rbp ; set up stack frame, must be aligned mov rdi,fmt mov rsi,msg mov rax,0 ; can also be: xor rax,rax call printf ; Call C printf function pop rbp ; restore stack mov rax,0 ; normal, no error, return value ret ; return
Kopieren Sie dieses Programm und fügen Sie es in eine neue Datei namens hello.asm ein.
Kompilieren Sie dann die Assembly mit NASM, das Sie mit Ihrem Paketmanager installieren können. Unter Ubuntu oder Debian können Sie NASM beispielsweise mit apt installieren:
sudo apt update && sudo apt install nasm
Führen Sie diesen Befehl aus, um Ihre Objektdatei zu erstellen:
nasm -f elf64 hello.asm
Die Objektdatei heißt hello.o.
Verwenden Sie als Nächstes gcc, um diese Objektdatei mit den erforderlichen Bibliotheken auf Ihrem Computer zu verknüpfen, und kompilieren Sie sie zu einer ausführbaren Datei namens hello:
gcc hello.o -o hello
Führen Sie zuletzt die ausführbare Datei aus:
./hello
Hello, world!
Als Referenz ist dies dasselbe Programm, geschrieben in C:
#include <stdio.h> int main() { char msg[] = "Hello worldn"; printf("%sn",msg); return 0; }
2GL, Assembler, Low-Level-Sprache, Maschinensprache, Programmierbegriffe