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
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.
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.
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
@eepty Das sagt der zweite Satz: Sie machen es mit einer Sprunganweisung, nicht mit einer Registersetzanweisung. – dasblinkenlight
- 1. Befehlszeiger vs Programmzähler?
- 2. Programmzähler direkt lesen
- 3. VHDL Inkrement 10-Bit-Programmzähler von 1
- 4. Was ist Programmzähler von Threads mit Breakpoints?
- 5. Gibt es eine Möglichkeit, den Programmzähler im Chrome-Debugger zu verschieben?
- 6. Welche Breite hat ein Stack in einer Intel IA32-Architektur?
- 7. Was bewirkt der Offset in dieser Zeile des MIPS-Codes: lw $ s0,4 ($ t0)?
- 8. Wie bekomme ich den Wert von Program Counter von Stack auf PIC18F
- 9. Unterschied zwischen Klassenbereich und Heap
- 10. Wo sind Funktionen eines Objekts im Speicher gespeichert?
- 11. Mit gdb "non-current" -Thread auf eCos Mips Ziel zu überprüfen
- 12. Was ist ein nativer Zeiger und returnAddress?
- 13. Wie gehen Prozesse mit Signalen um?
- 14. Wie kann ich Pufferüberlauf aufrufen?
- 15. Was hat jeder Eintrag in der Jmp_buf-Struktur?
- 16. Wie würde man die Schritte eines rekursiven Programms zählen
- 17. STM32L151 - Debugger startet bei falscher Adresse .. manchmal
- 18. Debuggen von disassemblierten Bibliotheken mit gdb
- 19. Zugriff auf Notizblockspeicher von C
- 20. wie zurück zu SVC-Modus von Hyp-Modus mit ELR_Hyp in Armv7
- 21. Wie läuft eine CPU im Leerlauf (oder läuft unter 100%)?
- 22. Debugger an einen Prozess anhängen, ohne einen neuen Thread zu erstellen
- 23. Serialisierung von Objekten: kein Thread-Status kann beteiligt sein, oder?
- 24. Java 8 JIT-Thread scheint in Endlosschleife fallen
- 25. Hibernate/Neustart eines Threads
- 26. Warum kann `ExecutorService` nicht konsequent Threads planen?
- 27. OPAL: Null-Wert in OperandenArray
- 28. y86 Assembly Labels nicht tun, was sie sein sollten
- 29. C: Führen Sie eine manuell mmaped Textsegment ohne viel Montage
Ihr Beispiel macht Sinn, aber woher kommt PC + 4, wenn was Sie hinzufügen, hängt davon ab, was an dieser Adresse ist ?? – Ockham
@ 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
Sind [MIPS-Anweisungen nicht alle 32 Bit lang] (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –