В MIPS $0
или $zero
является 0-м индексированным и первым регистром и имеет значение 0. См. здесь .
Хотя это выглядит как опечатка, так как lw
использует 16-битное смещение, которое является не значением из регистра, а скорее константой (напомним, что регистр является 32-битным). Так что на самом деле это должно быть lw $s3, 0($t1)
.
Причина, по которой код выполняет d = c[a]
, может показаться проще, если я переведу MIPS в псевдо-C-код:
$t0 = a*4
$t1 = $t0 + c (= c + a*4)
d = *(c + a*4)
Таким образом, мы в конечном итоге загружаем в d
значение в памяти в местоположении c + 4a
, которое является базовым адресом массива c
и индексом элемента, который мы хотим, a
. Мы умножаем на четыре, потому что тип массива, очевидно, является 4-байтовым длинным типом, например, 4-байтовым целым числом, поэтому нам нужно прыгнуть 4*a
байт с начала массива, чтобы достичь соответствующей точки в памяти.