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?
Ok, aber das lässt mich immer noch mit $ k1 mit 0x9FC02114? Was scheint kein gültiger Ort zu sein, um zu springen. – PeterBelm
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