2010-11-24 11 views
0

Adressierung Ich versuche, eine MIPS-Anwendung zu verstehen, aber ich bin ein wenig verwirrt auf den folgenden Anweisungen:benötigen Klärung MIPS Speicher in lw

la  $k1, off_9FC005A8 
lw  $k1, (off_9FC005D4 - 0x9FC005A8)($k1) 
jr  $k1 

In meinem Verständnis dies auf den folgenden Pseudo entspräche C-Code:

$k1 = *off_9FC005A8; 
$k1 = *($k1 + (*off_9FC005D4 - 0x9FC005A8)); 

So wissen die folgenden:

off_9FC005A8: .word 0x9FC01508 
off_9FC005D4: .word 0x9FC011B4 

Sie erhalten würde:

$k1 = 0x9FC01508; 
$k1 = *($k1 + (0x9FC011B4 - 0x9FC005A8)); 

Verlassen: $ k1 = 0x9FC02114. Dieser Offset ist jedoch auf halbem Weg durch einen Block von Code, den ich bereits gesehen habe und der bestätigt wurde, dass er korrekt ist. Also ist mein Verständnis dieser Anweisungen und Speicheradressierung fehlerhaft?

Antwort

1

Es schlägt sich in diesem Code:

$k1 = &off_9FC005A8;       // we load an address here! 
$k1 = *($k1 + (&off_9FC005D4 - &0x9FC005A8)); // we do a memory access here 

k1 wird zuerst mit der Adresse geladen, die von Konstanten zu Beginn einer Tabelle zeigt. Dies ist, was die La-Pseudo-Anweisung tut. Es bedeutet "Adresse laden".

Dann wird ein Speicherzugriff durchgeführt, der die gerade geladene Adresse als Basis verwendet und die Differenz zwischen zwei Einträgen als Offset verwendet.

Es ist einfache Adressierung in ein Array.

+0

Ok, aber das lässt mich immer noch mit $ k1 mit 0x9FC02114? Was scheint kein gültiger Ort zu sein, um zu springen. – PeterBelm

+0

Richtig, ich verstehe das jetzt, es kommt alles auf die blöde Art und Weise an, wie IDA die Assembly ausgibt und versucht, clever zu sein, aber wenn du das Verhalten nicht erkennst, ist es ziemlich verwirrend. Die eigentliche Anweisung lautet: lw $ k1, 0x2C ($ k1) – PeterBelm