2016-07-20 17 views
-1

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

+0

Mögliche Duplikate von [MIPS-Bereich der Sprunganweisung] (http://stackoverflow.com/questions/9030439/mips-range-of-jump-instruction) – markgz

Antwort

0

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.

+0

Wenn ich rückwärts verzweigen muss, werde ich feststellen, dass die Adresse in der Brach ist negativ entsprechend dem 2er Komplement oder? – dan

+0

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. –

+0

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) –