Algorithmen, die in Programmiersprachen formuliert sind, müssen in Maschineninstruktionen übersetzt werden, um auf einem Computer ausgeführt zu werden. Diese Aufgabe wird in der Regel von einem anderen (Compiler genannten) Programm ausgeführt. Manche Programmiersprachen (zum Beispiel C) erlauben es, sogenannte Assembler-Sprache in Programme einzubetten, um (zum Beispiel aus Effizienz-Gründen) Einfluss auf die generierten Maschineninstruktionen zu nehmen.
Als Assembler-Sprache wird eine aus den Maschineninstruktionen eines Computers abgeleitete Programmiersprache bezeichnet. Jedes Computer-Modell hat seine eigene Assembler- Sprache, die die zugrunde liegenden Maschineninstruktionen widerspiegelt. Assembler-Sprache erlaubt eine textuelle Eingabe von Maschineninstruktionen, wobei symbolische Namen für Speicheradressen benutzt werden können. Der Compiler, der Assembler-Sprache in Maschineninstruktionen übersetzt, heißt Assembler.
Als ein Beispiel für ein in (imaginärer) Assembler-Sprache geschriebenes Programm betrachten wir das folgende Programm, das die Zahlen von 1 bis 100 addiert.
i = 1
sum = 0
LOOP:
if i = 101 goto END
sum = sum + i
i = i + 1
goto LOOP
END:
Die Symbole i
und sum
werden vom Assembler in Adressen
für den Hauptspeicher (oder im Hauptprozessor enthaltene Register) übersetzt. Welche Adressen dafür verwendet werden, ist
für das Verhalten des Programms irrelevant, solange sie eindeutig sind. Die Symbole LOOP
und END
, die in Sprungbefehlen
verwendet werden, werden vom Assembler in die Adresse des Instruktionsspeichers übersetzt, in die die nach ihnen deklarierte
Instruktion geschrieben wird.
Zum Vergleich betrachten wir noch einen Ausschnitt aus einem realen Assembler-Programm, das dieselbe Aufgabe löst. Es ist dadurch entstanden, dass ein in C geschriebenes Programm in die Assembler-Sprache eines 64-Bit-Linux-Rechners übersetzt wurde:
movl $1, -8(%rbp) # entspricht i = 1
movl $0, -4(%rbp) # entspricht sum = 0
jmp .L2 # springe zu .L2
.L3: # .L3 entspricht der Wiederholung
movl -8(%rbp), %eax # lade i ins Register eax
addl %eax, -4(%rbp) # entspricht sum = sum + i
addl $1, -8(%rbp) # entspricht i = i + 1
.L2: # .L2 ist die Abfrage der Bedingung
cmpl $101, -8(%rbp) # vergleiche i mit 101
jne .L3 # falls ungleich, springe zu .L3