2010-11-24 35 views
0

J'essaie de comprendre une application MIPS, mais je suis un peu confus sur les instructions suivantes:besoin d'éclaircissements sur la mémoire MIPS adressage pv

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

Dans ma compréhension cela équivaudrait à la pseudo suivante code C:

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

savoir donc les éléments suivants:

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

Vous obtiendrez:

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

Départ: $ k1 = 0x9FC02114. Cependant ce décalage est à mi-chemin à travers un bloc de code que j'ai déjà regardé et confirmé pour être correct. Alors, est-ce que ma compréhension de ces instructions et de l'adressage de la mémoire est erronée?

Répondre

1

Il se traduit par ce code:

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

k1 obtient d'abord chargé avec l'adresse qui pointe vers le début d'une table des constantes. C'est ce que fait la pseudo-instruction. Il se traduit par «adresse de chargement».

Ensuite, un accès à la mémoire est effectué qui prend l'adresse juste chargée comme base et utilise la différence entre deux entrées comme décalage.

L'adressage est simple dans un tableau.

+0

Ok, mais cela ne me laisse toujours pas $ k1 contenant 0x9FC02114? Ce qui ne semble pas être un endroit valable pour sauter à. – PeterBelm

+0

Je comprends maintenant, tout se résume à la manière stupide dont IDA sort l'assemblage, essayant d'être intelligent mais à moins que vous ne reconnaissiez le comportement, il est assez obscur. L'instruction réelle est: lw $ k1, 0x2C ($ k1) – PeterBelm