Ich benutze Mips und möchte, dass Sie mir helfen, etwas über die Berechnung der Filialadressen zu verstehen. beheben Sie mich, wenn ich mich irre .. in einem Maschinencode ..die Adresse ist eigentlich Nummer des Wortes + pc + 4, die pc + 4 die nächste Anweisung betrachtet. aber in Mips würden wir nur die Anzahl der Wörter im Adressverzeichnis sehen, die wir brauchen, um auf das Etikett zu kommen?Filialadressen
Antwort
Mit der Fülle der verfügbaren Werkzeugketten gibt, die richtig/Arbeitsmaschinencode erzeugen können, nehmen Sie nur ein paar Sekunden, um ein Beispiel zu erstellen: 0x1008 die Adresse eines
00001000 <_ftext>:
...
1008: 10000008 b 102c <one>
100c: 00000000 nop
1010: 00000000 nop
1014: 10000007 b 1034 <two>
1018: 00000000 nop
...
1024: 10000005 b 103c <three>
1028: 00000000 nop
0000102c <one>:
102c: 03e00008 jr ra
1030: 00000000 nop
00001034 <two>:
1034: 03e00008 jr ra
1038: 00000000 nop
0000103c <three>:
103c: 03e00008 jr ra
1040: 00000000 nop
die Verzweigung zu einem an der Adresse ist ist 0x102C ein Unterschied von 0x24 was 9 Wörter ist. Es scheint also, du nimmst den Unterschied von pc + 4 zum Ziel.
Dies gilt für die Verzweigung zu zwei 0x1034- (0x1014 + 4) = 0x1C, das ist 7 Wörter und das ist die Codierung.
00001000 <_ftext>:
...
0000100c <one>:
...
1018: 1000fff9 b 1000 <_ftext>
101c: 00000000 nop
1020: 1000fffa b 100c <one>
1024: 00000000 nop
Ebenso Rückwärtsverzweigung 0x100C - (0x1020 + 4) = 0xFFF ... FFE8. Konvertiere das in Worte 0xFF ... FFFA und das ist die Kodierung. Dasselbe gilt für den anderen Zweig in diesem Beispiel.
Wenn Sie Arbeitswerkzeuge zur Verfügung haben und nicht sicher sind, ob es einen Offset gibt, wie die Kodierung ist, etc. Verwenden Sie einfach die Tools, die funktionieren, nicht anders als einfach nur jemanden zu fragen und schneller.
Wenn ich rückwärts verzweigen muss, werde ich feststellen, dass die Adresse in der Brach ist negativ entsprechend dem 2er Komplement oder? – dan
Ihr Programm, das die Mathematik "einfach" macht die Subtraktion, wie ich im Text beschrieben habe, und dann tun Sie die Verschiebung rechts von 2 in Wörter anstelle von Bytes zu konvertieren (die beiden lsbits sollten sowieso Nullen sein) und dann ausmasken die richtige Anzahl an Bits, die in den Steckplatz der Maschinenanweisung passen. Verwenden Sie eine 32-Bit-Variable grundsätzlich so, dass Sie die zwei zusätzlichen Bits vor dem Verschieben haben. alternativ können Sie zuerst die Verschiebung durchführen und eine hinzufügen, anstatt 4 hinzuzufügen ... oder Sie können die Anpassung nach der Subtraktion tun, es funktioniert alles gleich. –
Ja, es ist ein vorzeichenbehafteter Offset (Zweierkomplement), der in der Anweisung in Einheiten von Wörtern/Anweisungen codiert ist, nicht in Einheiten von Bytes. Wenn Sie nur den Zweig zu drei oben betrachten, zeigt die Codierung eine 5, aber die Beschriftung drei ist 6 Anweisungen entfernt. ODER es sind 5 Anweisungen aus der Anweisung nach der Verzweigung und das ist im Grunde, was Sie fragen, und Sie sind richtig (pc + 4, was die Anweisung nach ist) –
Mögliche Duplikate von [MIPS-Bereich der Sprunganweisung] (http://stackoverflow.com/questions/9030439/mips-range-of-jump-instruction) – markgz