Я изучаю язык ассемблера 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
Я прав, что это ошибка в книге или я что-то неправильно понимаю.
Редактировать: Исправлена ошибка в исправленном коде MIPS, указанная Крисом Доддом