Berechnung der Einpresstiefe
Ich habe eine Frage aus den Hausaufgaben.
Ich habe eine BNE
Anweisung in 0x88888888
, und ich muss sagen, was ist die rechtliche jump-Bereich.
Meine Theorie ist, dass der offset sagt mir, dass ich gehen kann:
- Von 0x8888888 - 4 * 215
- Zu 0x88888888 + 4 * (215-1)
Ich verstehe wirklich nicht, warum und wie das funktioniert, kann jemand bitte es erklären?
- Haben Sie vergessen, uns zu sagen, was Befehlssatz, die Sie verwenden. Andere CPUs haben unterschiedliche Anweisungen zur Verfügung.
- wir, wo nicht gesagt wird, irgendeine Sache, etwa, könnte es sein, verbunden zu den Programmen, die wir verwenden? spim-Simulators modelsim?
- Ja, SPIM ist ein simulator für die MIPS-Befehlssatz. Ich kenne keine details, aber Hinzugefügt haben, die tags zu deiner Frage. Hoffentlich kommt jemand um, zu wissen, die details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie eine Anleitung verweisen, die zeigt, dass die Anweisung Codierung wie http://en.wikipedia.org/wiki/MIPS_architecture
s und t halten Sie die Register verglichen wird, 5 bits, gibt register 0 - 31. die unteren 16 bits den Versatz in Einheiten von Anweisungen.
(für mips) aus Programmierer-Perspektive, übernehmen Sie die Programm-Zähler ist 1 Instruktion vor 4 bytes. Also für Adresse 0x88888888 die Berechnungen mit der Adresse 0x88888888+4 = 0x8888888C.
Den Unterricht-Codierung verwendet zweit ergänzen so Ihre maximale vorwärts-Zweig ist 0x7FFF Anweisungen, die ist 0x7FFF<<2 = 0x1FFFC bytes. Die maximale rückwärts-Zweig ist 0x8000, wenn Vorzeichen erweitert ist 0xFFFF8000 Anweisungen, in bytes, 0xFFFF8000<<2 = 0xFFFE000
Den Programm-Zähler Anpassung ist ziemlich einfach, um herauszufinden, von einer Demontage der arbeiten generierten code durch einen assembler arbeiten. (plus die Anweisung Referenz zumindest genug, um die Anzahl von bits, die Sie verwenden müssen).
0x1443FFFD und 0x1443FFFB sind 8 bytes auseinander, und zwei Anweisungen auseinander. Die Differenz zwischen den offsets in der Anleitung ist eine Zählung 2, so dass bedeutet, die Codierung in Einheiten von Anweisungen/Wörter, die nicht bytes noch halfwords. Die vorwärts-Referenz ist einfacher zu tun, zunächst 0x2060 - 0x2050 ist, 0x10 bytes, die 4 Anweisungen. der offset ist 3 Anweisungen, 0x2060 minus 3 Anweisungen ist 0x2054 der nächsten Anweisung nach der Sie bne (macht sehr viel Sinn, weitergeleitete oder nicht der pc ist in der Regel mindestens auf die nächste Anweisung von der Zeit erhalten Sie auf ausführen, und führen Sie bei Mathe mit dem pc der pc hat das schon getan vorwärts zu bewegen). Dies kann überprüft werden mit den anderen drei Filialen. 0x2058, sagt Zweig eine Anweisung den Kopf, wenn nicht gleich, was bedeutet, der pc ist 0x205C, vor. 0xFFFD, invertieren und addieren von 1 = 2+1 = 3 also um rückwärts zu gehen drei und man 0x2030 müssen Sie bei 0x203C, vor der codierte Instruktion. 0xFFFB 4+1 = 5, 5 Anweisungen zurück, das heißt, Sie beginnen bei 0x2044, die Anweisung nach der Verzweigung kodiert werden, 0xFFFB.
Andere Befehlssätze, es ist nicht so einfach. Arm ist ziemlich einfach, sowohl arm-und thumb-Modus übernehmen Sie die zwei Anweisungen, die im Vorfeld von der Adresse, die den Anfang der Anleitung, also im thumb-Modus 4 Byte, arm-Modus 8 Byte. Auch thumb2 das ist in Erster Linie 32-bit-Anweisungen, dem Programm counter aus Programmierer-Perspektive 2 Anweisungen vor.
Variable word length instruction-sets, die sind nicht so regelmäßig wie arm, mips, etc. Entweder die hardware wird verwendet, eine Feste Regel, wie es mit thumb2 trotz der eigentlichen Adresse ein Prefetch durchgeführt wird. Oder Sie haben, um zu wissen, die Größe von der Anleitung wo der program counter wird und die Verwendung dieser Referenz. Beachten Sie, dass vielleicht der erste Schnitt bei diesen Prozessoren ist der Programm-counter die Rechte an einem oder zwei Anweisungen vor, wenn Sie ausgeführt werden, aber die Pipelines begraben in viele (arm, mips) die prefetch-Adresse könnte sein, regulären, aber viel weiter vor, oder, wenn Sie gehen, superscalar mit branch prediction, der holt sich kann überall sein, sogar zu berühren Registern in der hardware (gute hardware-designs nicht ändern, alles auf ein einfaches Lesen, nur schreibt Sie nicht Lesen einen autoincrement-Wert und einen hardware-Mauszeiger, zum Beispiel, zumindest für pci(e) - hardware, die verwendet werden können, die auf vielen Prozessoren).
Diese Referenz SPIM sagt:
Da Anweisungen scheinen zu sein, immer 4 bytes breit, Ihre Argumentation erscheint Recht haben, aber du vertauscht die Zeichen.
Die maximale rückwärts-Zweig (in Richtung einer niedrigeren Adresse) ist durch die 215-1 Anweisungen, d.h. 32767 Anweisungen oder 131068 Byte, so dass Sie erreichen konnte
0x88888888 - 131068 = 8886888c
.Ebenso wird die maximale vorwärts-Zweig gelangen Sie zu
0x88888888 + 131072 = 0x888a8888
.