Information Technology Reference
In-Depth Information
stellen. Für eine detaillierte Beschreibung der Architektur sei der Leser erneut auf
[107, 115] verwiesen.
Beispiel 4.2. Konkatenation von Zeichenketten . Wie sich aus einem virtuellen Gironimo-Pro-
gramm reale Programme für den Pentium 4 von Intel bzw. den ARM7TDMI von ARM. generieren
lassen, ist in Bild 4.5 dargestellt, und zwar anhand der Konkatenation zweier nullterminierter Zei-
chenketten. Zunächst zum virtuellen Gironimo-Programm: Nach Übergabe der Startadressen der
Zeichenketten in r0 und r1 werden die Registerinhalte mit dem Befehl pushr (push register) auf dem
Stapel gesichert (Zeile 2). Der Aufruf des Unterprogramms len verschiebt die Adresse r0 auf die
Endekennung der ersten Zeichenkette (Zeile 3). In einer Schleife (Zeile 4 bis 7) wird anschließend
die zweite Zeichenkette kopiert, wobei der erforderliche Speicher-Speicher-Transfer als bedin-
gungsregisterverändernde Befehlskomposition codiert ist (ähnlich wie in Bild 4.4 dargestellt, nur
dass hier der Befehl mvcc, move and set condition code, zum Einsatz kommt). Wegen der postmo-
difizierenden indirekten Adressierung der Quelle und des Ziels werden dabei die Adressen in r0
und r1 automatisch inkrementiert (siehe Abschnitt 1.2.3). Die Schleife wird wiederholt, bis das
Ende der zweiten Zeichenkette erreicht ist (Zeile 7). Danach werden die alten Registerinhalte r0
und r1 mit Hilfe des Befehls popr (pop register from stack) restauriert (Zeile 8) und mit rts (return
from subroutine) schließlich ein Rücksprung ausgeführt (Zeile 9).
Gironimo
Pentium 4
ARM7TDMI
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11 :
12:
13:
14:
15:
16:
17:
cat: { label.call #1
pushr.w
cat:
push
eax
cat:
stmfd sp!, {r0, r1, r14}
bl
r0-r1
}
push
ebx
len
bsr
len
call
len
l1:
ldrb r2, [r1], #1
strb r2, [r0], #1
cmp r2, #0
bne l1
ldmfd sp!, {r0, r1, r15}
l1:
label
#1
l1:
add
ebx, 1
{ mv.b
\r2, [r1] += #1
mov
edx, [ebx - 1]
mvcc.b
[r0] += #1, \r2 }
add
eax, 1
bne
l1
mov
[eax - 1], edx
{ popr.w
r0-r1
jne
l1
rts }
pop
ebx
pop
eax
ret
len: add
len:
label.call #1
eax, 1
len:
stmfd sp!, {r14}
l2:
label
#1
cmp
[eax - 1], 0
l2:
ldrb r8, [r0], #1
cmp r2, #0
bne l2
ldmfd sp!, {r15}
tstcc.b
[r0] += #1
jne
len
bne
l2
ret
rts
Bild 4.5. Gegenüberstellung eines virtuellen Gironimo-Programms mit den daraus generierten rea-
len Programme für den Pentium 4 von Intel [80, 81, 82] und den ARM7TDMI von ARM [10, 11]
Das Programm für den Pentium 4 weicht in zwei wesentlichen Merkmalen vom virtuellen Giro-
nimo-Programm ab. (1.) ist es nicht möglich mit einem realen Befehl des Pentium 4 mehrere Regis-
terinhalte auf dem Stapel zu sichern oder davon zu laden, weshalb die virtuellen Befehle pushr
(Zeile 2) und popr (Zeile 8) durch je zwei reale Befehle nachbildet werden müssen. (2.) verfügt der
Pentium 4 nicht über die postmodifizierende indirekte Adressierung, was die Umsetzung der virtu-
ellen Befehle in den Zeilen 5, 6 und 15 zu jeweils einem Additionsbefehl und einen mov- bzw.
cmp-Befehl erforderlich macht. Zwar ist das reale Programm etwas länger als das virtuelle Pro-
gramm, die dargestellte Anwendung ließe sich jedoch auch nativ nicht wesentlich kürzer codieren,
sodass eine hohe Ausführungsgeschwindigkeit sichergestellt ist.
Dies gilt auch für den ARM7TDMI. Bei Erzeugung des realen Programms machen sich hier zusätz-
lich die Befehlskompositionen vorteilhaft bemerkbar. So werden die virtuellen Befehle in den Zei-
len 1 und 2 zu einem realen Befehl zusammengefasst, der sowohl die Rücksprungadresse in r14 als
Search WWH ::




Custom Search