Преобразование MIPS32 в C: добавление базового адреса массива к произвольному значению и его значение

Я работаю над домашним заданием прямо сейчас, и мне дали эту информацию:

$s6 — расположение базового адреса массива A, $s0 — расположение значения f > (не указано).

Он хочет, чтобы я преобразовал некоторые инструкции в оператор C. Вот мой вопрос, потому что, если на него ответить, я могу очень легко решить остальную часть этой проблемы:

добавить $t0, $s6, $s0

Это говорит $t0 = (the base address of array A) + f или $t0 = A[0+f]?

Потому что, если базовый адрес A был 0x04000000, и я использовал addi, чтобы добавить 4 к этому базовому адресу, получив 0x04000004, и присвоив это значение t0, я говорю, что t0 = A[1] (при условии, что я храню целые числа).

Но так как я не знаю значение f, я не уверен, как представить это в C, потому что я знаю, что изменяю индекс, но я не знаю, насколько. Было бы точнее сказать (учитывая инструкцию выше):

$t0 = A[f/4]

Я новичок во всем этом ха. Надеюсь, я продемонстрировал, что провел небольшое исследование, пытаясь понять это.

Спасибо

ОСФТВ


person OpenSrcFTW    schedule 07.02.2013    source источник


Ответы (1)


В этой инструкции нет разыменования:

add $t0, $s6, $s0

Это как сказать

t0 = s6 + s0;

В C-подобном псевдокоде. Или для вашего примера:

t0 = (char *)A + f;

Чтобы получить значение из A, это будет выглядеть примерно так:

lw $t1, 0($t0)

После выполнения предыдущей инструкции add так, чтобы $t0 указывала на нужное место в массиве.

person Carl Norum    schedule 07.02.2013
comment
О, так это вроде как кастинг? Потому что на s6 нет ничего, кроме адреса памяти, верно? Итак, мы приводим это как (в этом сценарии) int? - person OpenSrcFTW; 07.02.2013
comment
Кастинг что-то значит только в том случае, если у вас есть типы, а в языке ассемблера их нет. Я точно не знаю, к чему ты клонишь. - person Carl Norum; 07.02.2013
comment
Вот в чем заключается мое замешательство: мы добавляем адрес к какому-то неясному целому числу. Результат не имеет смысла, если он не помещен в контекст этого массива и если это целое число не делится на четыре (в случае массива целых чисел). Чтобы прояснить, что позже делает проблема, это следующее: lw $s0,0($t0) Итак, теперь он обрабатывает t0 как массив, пытаясь получить к нему доступ по его базовому адресу. И, если предположить, что f делится на 4 и является положительным, все, что мы делаем, — это ссылаемся на элемент массива с некоторым увеличенным индексом, только по-другому, правильно? Что-то вроде: s0 = A[f/4] - person OpenSrcFTW; 07.02.2013
comment
Ок, отлично. Таким образом, следующие строки кода в основном означают f = A[f/4] ?: add $t0, $s6, $s0 lw $s0,0($t0) - person OpenSrcFTW; 07.02.2013
comment
Предполагая, что f находится в s0, а указатель на первый элемент A находится в s6 (как описано в вашем вопросе), да. И этот A представляет собой массив 4-байтовых объектов. - person Carl Norum; 07.02.2013
comment
Это полностью отвечает на мой вопрос, спасибо! Извините, мне потребовалось немного времени, чтобы описать суть моей проблемы, но я ценю ваше время и усилия. - person OpenSrcFTW; 07.02.2013