2012-04-11 3 views
5

Wenn ich das richtig verstehe, zeigt der Programmzähler auf die Adresse der auszuführenden Instruktion und in den meisten Fällen füge man vier zum Programmzähler hinzu, um zur nächsten Instruktionsadresse zu gelangen. Aber sagen Sie, dass Sie einen Programmzähler haben, der auf ein Wort (z. B. Wort 15) im Speicher zeigt, und Sie zur nächsten Anweisung weitergehen wollen, sollen Sie 4 direkt zu 15 hinzufügen, um die nächste Anweisung zu bekommen ?? Jede Erklärung würde geschätzt werdenProgrammzähler?

Antwort

6

Das Ding heißt Instruktionszeiger. Sobald der Prozessor den aktuellen Befehl decodiert, findet er heraus, wieviele Bytes er belegt und wie viel er dem aktuellen Befehlszeigerwert hinzufügen muß, um zum nächsten Befehl überzugehen, so daß der Prozessor weiß, was als nächstes zu tun ist, wenn der aktuelle Befehl ausgeführt wird.

So zum Beispiel der Prozessor beginnt mit dem Befehlszeiger Speichern von Wert 15 wie in Ihrem Beispiel - es sieht aus, was passiert, um an dieser Adresse zu sein, gibt es eine Anweisung besetzt 5 Bytes, kein Problem - es fügt 5 zu aktuellen Wert und dies ergibt 20 und so speichert der Befehlszeiger nun den Wert 20 und der Prozessor führt dann den aktuellen Befehl aus.

+1

Ihr Beispiel macht Sinn, aber woher kommt PC + 4, wenn was Sie hinzufügen, hängt davon ab, was an dieser Adresse ist ?? – Ockham

+1

@ user28694: Dies hängt von einem Prozessor ab. Einige Prozessoren haben den Befehlssatz, bei dem alle Befehle dieselbe Länge haben, so dass sie bedingungslos +4 sein können. Einige Prozessoren werden Befehle mit variabler Länge haben und sie werden entscheiden, mit welchem ​​Befehl sie die ersten Bytes des Befehls selbst verwenden. – sharptooth

+0

Sind [MIPS-Anweisungen nicht alle 32 Bit lang] (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

Sie können den Programmzähler niemals direkt weiterleiten - die CPU erledigt das für Sie, indem Sie Ihr Programm ausführen. Als Programmierer manipulieren Sie den Programmzähler, indem Sie verschiedene Sprungbefehle ausführen (bedingte, bedingungslose, springt zum Unterprogramm usw.). Ein spezieller Fall, wenn Sie einen Offset zum Programmzähler hinzufügen müssen, ist, wenn Sie in positionsunabhängigem Code verzweigen. Allerdings fügen Sie auch in diesem Fall die Größe der Anweisung nicht dem Programmzähler hinzu: Stattdessen geben Sie den Offset der Stelle an, zu der Sie springen möchten, indem Sie eine "Verzweigung zur relativen Adresse" ausführen.

+0

Wie wäre es, wenn wir einen Bootloader schreiben, der zum Anwendungscode springt, der sich an der absoluten Adresse 0x4000 befindet? In diesem Fall werden wir den Programmzähler direkt auf die absolute Adresse umstellen. – eepty

+0

@eepty Das sagt der zweite Satz: Sie machen es mit einer Sprunganweisung, nicht mit einer Registersetzanweisung. – dasblinkenlight

Verwandte Themen