Нужно уточнить адресацию памяти MIPS в lw - PullRequest
0 голосов
/ 24 ноября 2010

Я пытаюсь понять приложение 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 Ответ

1 голос
/ 24 ноября 2010

Это переводится в этот код:

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

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

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

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

...