#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]]
Комментарии:
1. Вау, теперь это имеет невероятный смысл. Большое вам спасибо.