Я изучаю язык ассемблера 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