Information Technology Reference
In-Depth Information
dern zu dem darauf folgenden Befehl gesprungen werden soll. Das Ergebnis wird
anschließend über die mit d markierte Verbindung in den Befehlszähler transpor-
tiert. Der Rücksprung erfolgt, sobald der Befehlszähler die Adresse übernimmt.
Ein Rücksprungbefehl entspricht somit einem indirektindizierten Sprung, der sich
selbstverständlich auch für andere Zwecke nutzen lässt. Die Vorgehensweise ist wie
beim UltraSPARC IIIi von Sun gewählt, bei dem ein Rücksprung über den Befehl
jmpl ( jump and link ) nachgebildet wird [162, 163, 173]. Das Speichern der Rück-
sprungadresse auf einem Stapel ist bei Prozessoren, die in dieser Weise arbeiten,
programmiert nachzubilden.
Die in Bild 2.6 dargestellte Registertransferstruktur unterscheidet sich von realen
Implementierungen bezüglich des Programmiermodells nur noch in wenigen
Details. Zum Beispiel ist in jedem Befehl ein N Bit breites Feld vorhanden, in dem
u.a. eine Adresse für Zugriffe auf den gesamten Daten- bzw. Befehlsspeicher codier-
bar ist. Da Befehle oft ausschließlich über n Bit breite Adressen auf den Register-
speicher zugreifen, bleiben jedoch N - n Bits ungenutzt. Es ist daher oft günstiger,
N kleiner zu wählen, als erforderlich ist, um auf den gesamten Daten- bzw. Befehls-
speicher direkt zugreifen zu können, wobei N minimal gleich n sein wird.
Als Konsequenz einer solchen Festlegung kann jedoch auf den Daten- bzw. Befehls-
speicher nicht mehr direkt zugegriffen werden. Da der Datenspeicher ohnehin oft
indirekt oder indirektindiziert ( basisrelativ ) angesprochen wird (z.B. werden lokale
Variablen relativ zu einem Stapelzeiger in einem Register adressiert), ist eine solche
Festlegung vor allem für Zugriffe auf den Befehlsspeicher problematisch. Zwar lässt
sich ein beliebiges Sprungziel prinzipiell auch indirekt adressieren, hierzu muss die
Sprungadresse zunächst jedoch in ein Register geladen werden, was normalerweise
schon deshalb wenigstens zwei Befehle erfordert, weil unmittelbare Operanden
ebenfalls maximal N Bit breit sein können. Nachfolgend ist eine entsprechende
Befehlssequenz angedeutet.
sethi
r1, label
// Da r1 = label nicht in einem Befehl ausgeführt ...
or
r1, label, r1
// ... werden kann wird label in zwei Hälften zugewiesen
bt
r2, [r1]
// Bedingte Sprung zur Adresse label, falls r2 wahr ist
Da bedingte und unbedingte Sprungbefehle häufig auftreten, realisiert man Prozes-
soren i.Allg. so, dass indirekte Sprünge in den meisten Fällen verzichtbar sind.
Erreicht wird dies, indem statt direkter Befehlsadressen befehlszählerrelative Dis-
tanzen verwendet werden, die sich deshalb kompakter codieren lassen als direkte
Befehlsadressen, weil Sprungbefehle und die jeweiligen Sprungziele in vielen Fäl-
len nahe beieinander liegen (z.B. in kleinen Schleifen).
Natürlich ist es trotzdem von Vorteil, wenn für die Codierung der befehlszählerrela-
tiven Distanz möglichst viele Bits zur Verfügung stehen, weshalb in der Register-
transferschaltung entsprechend Bild 2.7 die Sprungdistanz in einem Feld codiert ist,
das sich durch Zusammenfassung der zwei Operandenadressen und der einen Ergeb-
nisadresse ergibt. Die wenigstens 3n Bit breite Sprungdistanz wird anschließend
über die mit a markierte Verbindung zu einem Addierer geführt (mit b markiert), der
sie in eine direkte Befehlsadresse umrechnet, zu der schließlich verzweigt wird.
Search WWH ::




Custom Search