Wie funktionieren die Anweisungen Store Word (SW) und Load Word (LW), MIPS

Geben Sie hier die Bildbeschreibung ein

Die SW- und LW-Befehle sind wie folgt definiert:

     sw $t, offset($s)  : 1010 11ss ssst tttt iiii iiii iiii iiii
     lw $t, offset($s)  : 1000 11ss ssst tttt iiii iiii iiii iiii

SW führt die Operation MEM[$s + offset] = $t durch, aber im Datenpfad sieht es so aus, als hätten sie die Operation MEM[Data($s)+ offset] = $t durchgeführt, weil statt den Wert $ zu nehmen s als Eingabe in die ALU nahm sie die in $s gespeicherten Daten auf.

LW führt die Operation $t = MEM[$s + Offset] aus, aber wenn man sich den Datenpfad ansieht, sieht es so aus, als würde es $t = MEM[Data($s) + Offset] ausführen.

Eine andere Sache, die ich nicht verstehe, ist, warum wir die Vorzeichenerweiterung verwenden, anstatt nur das Vorzeichen auf das 32. Bit zu verschieben und den Rest der Daten mit Nullen zu füllen. Wenn Sie einen Offset definiert haben, ist

0x8fff : 1000 1111 1111 1111

es wird Zeichen erweitert zu 0xffff8fff : 1111 1111 1111 1111 1000 1111 1111 1111 , was eine völlig andere Zahl als der Offset ist, die Zahl, die wir wirklich brauchen, ist 0x80008ffff.

Antworten (1)

$sund $tsind Registerbezeichner. Ihre Interpretation MEM[RegisterData(s) + offset]ist grundsätzlich richtig. $sbedeutet im Wesentlichen "die Daten aus der Registernummer sin der Registerdatei abrufen". Wenn also sin der Anweisung das Bitmuster steht 10001, dann $sbedeutet das: Lesen Sie den Wert aus Register 17, fügen Sie die vorzeichenerweiterten Offset-Bits hinzu (die 16 Bits, die in ider Codierung durch dargestellt werden), und verwenden Sie diese als Adresse für den Zugriff auf den Speicher. Ähnlich für die $tin der lwAnleitung. Das bedeutet, dass die Daten in das Register mit der Nummer zurückgeschrieben werden t.

Ihre Frage zur Vorzeichenerweiterung: Zweierkomplement nachschlagen . Die 16-Bit-Zweierkomplementzahl 0000 1111 1111 1111 ist dezimal +4095. Die 16-Bit-Zweierkomplementzahl 1000 1111 1111 1111 ist dezimal -28673. Die 32-Bit-Zweierkomplementzahl 0xffff8fff ist ebenfalls -28673. Die 32-Bit-Zweierkomplementnummer 0x80008fff ist dezimal -2147446785, was eindeutig nicht das ist, was Sie wollen.