Вопросы о масштабе на 4 для размера слова из C преобразования на ассемблере
Я новичок в ассемблере, поэтому надеюсь, что любой, кто даст мне ответ, сможет объяснить более конкретно.
Вопрос конвертируется из C в язык ассемблера.
C-код:
while(save[i] == k)
i += 1;
i
а также k
находятся в $s3
а также $s5
и база массива save[]
в $s6
Ответ на рисунке.
Что я неправильно понимаю, вот почему $S3 multiple 2^2(==4)
, а затем сохранить в $t1
,
Я проверяю stack overflow на похожие вопросы, некоторые люди говорили: "Вы должны добавить основание и индекс вместе, и не забудьте увеличить на 4 для размера слова".
Но поскольку я новичок, я все еще в замешательстве.
Например,
после одного цикла,
i == 2
(в$S3
).а затем начать все сначала,
i == 2
в$S3
умножить на 4, мы получаем 8 здесь, а затем записывает в$t1
,
Так что возникает вопрос, почему 8? Я думаю, что нам нужно save[2]
не save[8]
,
Я подумал, что могу запутаться в ценности и адресе.
Другой вопрос: сколько битов записано как $S1
, $t1
? Я думаю, что это 32 бита, поэтому это должно быть 1 слово.
2 ответа
lw
Должен быть указан адрес первого байта слова для загрузки.
Если каждый элемент save
имеет размер 32 бита или 4 байта, тогда
save[0]
найдено 0 байт после началаsave
,save[1]
находится в 4 байтах после началаsave
,save[2]
находится в 8 байтах после началаsave
,- ...
Каждая запись в save
32-битный Это означает, что i-запись имеет смещение i * 32 Бит = i * 4 байта, начиная с базового адреса $s6
C, действительно очень разумно и рассчитывает это для вас самостоятельно. Таким образом, в написании C-кода save[i] совпадает с *(save + i). Добавление к указателю будет умножено на его размер, поэтому C переведет его в save + 4 * i.
Размер регистра зависит от вашей локальной архитектуры, но, как правило, 32 бит для примеров / упражнений.