Преобразование C в MIPS - вложенные массивы

Я изучаю язык ассемблера MIPS и наткнулся на этот пример в книге, и он кажется мне неправильным. Если это так, то это не первая ошибка, которую я нашел в этой книге.

Переменным f и g присвоены регистры $s0 и $s1 соответственно, базовыми адресами массивов A и B являются $s6 и $s7 соответственно.

Пример кода на языке c:

f = g - A[B[4]];

А соответствующий ассемблер MIPS:

lw  $t0, 16($s7)
lw  $s0, 0($t0)
sub $s0, $s1, $s0

Насколько я понимаю, приведенный выше код MIPS загрузит случайные данные из памяти по адресу, указанному в $t0, затем вычтет их из $s1 и не получит доступ к индексу $t0 массива, обозначенного в $s6.

Правильный ассемблер MIPS, насколько я понимаю, будет выглядеть так:

lw  $t0, 4($s7)
add $t0, $t0, $s6
sll $t0, $t0, 2
lw  $s0, 0($t0)
sub $s0, $s1, $s0

Я правильно понимаю, что это ошибка в книге или я что-то недопонимаю.


Edit: Fixed an error in the corrected mips code as pointeded by Chris Dodd

5
задан MitMaro 6 October 2011 в 18:40
поделиться