KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: MIPS verstehen - Adressen...
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

eine Frage an alle MIPS Experten...
Ich habe eine EBoot eines Spiel mit dem PRX-Tool in den MIPS-Code "übersetzt" und versuche hier folgendes zu verstehen:

Code:
- lui        $a2, 0x8DF  
- addiu      $a0, $a2, -13580


Nach meinem Verständniss wird am Ende im Register a0 eine Adresse stehen. Und zwar 0x08dfcaf4.
Nun habe ich was von der "Negativ"-Regel gehört, wonach dei Adresse dann 0x08e0caf4 wäre - richtig ?

Da dies nun eine feste Adresse ist, gehe ich davon aus, dass in dem Mips-Code vom PRXToll diese Adresse finden müsste, oder ?
Darüber hinaus würde ich davon ausgehen, dass ein ähnlicher Code zum bauen der Adresse genutzt wird, wenn daten in diese geschrieben werden, oder ?

Aber weder die Adresse selbst noch einen anderen Code diese Adresse zusammenbauf kann ich finden....

Und by the way...warum wird die adresse in 2 schritten in das Register geschrieben ? wäre ein lw oder move mit 0x08dfcaf4 nicht effektiver ?

Danke für Tipps und Hilfe..Mein Ziel:
Die genannte Addresse ist ein Parameter einer Funktion, und ich möchte zu gerne rausfinden wie dieser befüllt wird ;o)

Bei den Registern stellen doch die hohen Zahlen die negativen Zahlen dar, wenn du also eine Adresse in der höheren Hälfte erreichen willst, musst du negative Integer ansteuern (bei addu). Was ist eine negativ Regel?
Wenn du es mit move machen würdest, müsstest du ja in noch einem Schritt die Adresse verändern.

mfg D3lta

EDIT: vll. wird $a0 noch einmal gebraucht? Außerdem lädt lw aus dem Speicher und keine Konstanten!
also, der code sieht ja so aus:

- lui $a2, 0x8DF
- addiu $a0, $a2, 0xCAF4

das heißt, $a0 = 0x8DECAF4

negative rule: "Wenn die Zahl größer als 0x7FFF (32767) ist, dann addiere 0x1 zu den vorderen 2 bytes."

Da dies ja hier schon geschehen ist, musst du das ganze rückwärts rechnen, also 0x08DF - 0x1 = 0x08DE.

Wenn du nun einen Wert an diese Adreese speichern möchtest (z.B. 0x1234), machst du folgendes:

-lui $a2, 0x8DF
-ori $t0, $t0, 0x1234 //$t0 = 0x00001234
-sw $t0, 0xCAF4($a0) //0x08DECAF4 0x00001234


Das heißt, bezogen auf dein lw und move Vorschlag, lw lädt nur ein word (32-Bit) in einen register, sw speichert ein word an eine Addresse. In MIPS geschieht das Laden von Addressen nur in 16 Bit Schritten, du kannst keine 32-Bit sofort in ein register speichern. In MIPS gibt es zwar move Befehle, allerdings helfen diese dir in diesem Fall nicht.

In MIPS gibt es keine Mögichkeit, etwas wie move $t0, 0x08DECAF4 zu machen. Du wirst immer, wenn du eine Addresse in einen register laden willst, dies in zwei Schritten erledigen müssen.
Super, danke....das hab ich nun verstanden Wink

Auch wie ich selber einen Wert an diese Adresse schreibe..

Nun zum zweiten Teil meiner Frage: Wie kriege ich raus, ob der Code den ich in MIPS vor mir habe auch irgendwann daten an diese adresse schreibt....

Ein suchen im gesammten Code nach diesen Code Zeilen zum bilden exakt der selben adresse sind leider fehlgeschlagen...das müsste doch ähnlich aussehen - oder ?

der Teil lui $A, 0x8df kommt sehr oft vor Sad, aber dazu das 0xcaf4 bzw. -13580 eben nicht... Sad

Irgendeine idee ? Tipp ?
Kannst du mal die ganze Subroutine, also die ganze Funktion posten, wo die Befehle vorkommen? Denn $a2 ist ein Paramter in MIPS, die argument register $a0 - $a3 werden als Parameter in Funktionen verwendet. Evt. wird garnichts in die Addresse geschrieben, sondern lediglich von ihr geladen.
Hi,

klaro...

also so sieht es aus:

Code:
loc_08CD2974:        ; Refs: 0x08CD2868
    0x08CD2974: 0x8E060020 ' ...' - lw         $a2, 32($s0)
    0x08CD2978: 0x3C1808DF '...<' - lui        $t8, 0x8DF
    0x08CD297C: 0x8F250008 '..%.' - lw         $a1, 8($t9)
    0x08CD2980: 0x8F240004 '..$.' - lw         $a0, 4($t9)
    0x08CD2984: 0x2707CE44 'D..'' - addiu      $a3, $t8, -12732
    0x08CD2988: 0x3C140909 '...<' - lui        $s4, 0x909
    0x08CD298C: 0x0E346E2F '/n4.' - jal        sceGeListEnQueue(void*(t9+4), void*(t9+8), s0+32, 0x08DECE44)
    0x08CD2990: 0xAE802834 '4(..' - sw         $zr, 10292($s4)

an die sceGeListEnQueue funktion wird als 4. Parameter ein POinter übergeben...nach den PSPSDK-Headern ist es ein Zeiger auf eine Struktur die eine Größen-Feld und sonst nur undefiniert irgendwelche Daten enthält...
Ich würde halt gerne wissen wie diese Daten von dem Spiel gefüllt werden um eine Idee zubekommen was da inhaltlich wirklich drin stehen könnte...

Referenz-URLs