Вопросы о масштабе на 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 для размера слова".

Но поскольку я новичок, я все еще в замешательстве.

Например,

  1. после одного цикла, i == 2$S3).

  2. а затем начать все сначала, 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 бит для примеров / упражнений.

Другие вопросы по тегам