Assembler

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