MIPS — массив в индексе массива

#arrays #assembly #mips

#массивы #сборка #mips #mips32

Вопрос:

Каков следующий код C в MIPS?

 f = A[B[i]]
 

Мне сказали, что это можно сделать в 6 строках, но я не совсем понимаю, как это сделать.
f находится внутри $t0 , i находится внутри $t3 , A[] находится внутри $s0 и B[] находится внутри $s1 . Все типы являются целыми числами.

Лучшее, о чем я могу думать, это

 lw $t5, $t3($s0);  # Doesn't work because lw syntax doesn't accept a register as an offset
lw $t6, $t5($s1);
sadd $t0, $t6, $zero
 

Очевидно, что это неправильно. Как бы мне получить правильное смещение для каждой строки?

Спасибо.

Ответ №1:

Могут быть более эффективные способы, но вот один из способов в 6 строк:

 sll $t2,$t3,2    # t2 = i * sizeof(int)
addu $t2,$t2,$s1 # t2 = amp;B[i]
lw $t0,0($t2)    # t0 = B[i]
sll $t0,$t0,2    # t0 *= sizeof(int)
addu $s0,$s0,$t0 # s0 = amp;A[B[i]]
lw $t0,0($s0)    # t0 = A[B[i]]
 

Прочтите справочник по набору команд MIPS, чтобы получить дополнительную информацию о том, что делают отдельные инструкции.

Комментарии:

1. Вау, теперь это имеет невероятный смысл. Большое вам спасибо.