LW в MIPS (также немного C) - PullRequest
2 голосов
/ 07 июня 2011

У меня есть домашнее задание, и оно меня беспокоит. Это похоже на

sll $t0, $s0, 2    // $t0 = $s0 << 2;

add $t1, $t0, $s2  // $t1 = $t + $s2;

lw  $s3, $0($t1)

Я запутался в $0, имеет ли он тот же эффект, что и 0?

Какое значение даст результат?

Это вопрос, который просит меня перевести mips в c, где $ s0 представляется как имя переменной a, $ s1 b, $ s2 c и т. Д.

Ответ для этого раздела должен быть d = c[a];, но я действительно не понимаю, почему.

1 Ответ

5 голосов
/ 07 июня 2011

В 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 байт с начала массива, чтобы достичь соответствующей точки в памяти.

...