2010-11-24 1 views
0

Я пытаюсь понять приложение MIPS, но я немного запутался следующими инструкции:нужны разъяснения по памяти MIPS адресации в липидном весе

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

В моем понимании это было бы равносильно следующим псевдо код C:

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

Так, зная следующее:

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

Вы бы получить:

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

Оставляем: $ k1 = 0x9FC02114. Однако это смещение на полпути через блок кода, на который я уже посмотрел и подтвердил правильность. Так я понимаю, что эти инструкции и адреса памяти ошибочны?

ответ

1

Это переводит на этот код:

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

k1 первый загружается с адресом, который указывает на начало таблицы констант. Это то, что делает псевдо-инструкция. Он переводится как «адрес загрузки».

Затем создается доступ к памяти, который берет только что загруженный адрес в качестве базы и использует разницу между двумя записями как смещение.

Простая адресация в массив.

+0

Хорошо, но разве это не оставляет меня с $ k1, содержащим 0x9FC02114? Кажется, что это не подходящее место для перехода. – PeterBelm 2010-11-24 10:45:48