Чему соответствует этот ассемблерный код MIPS? - PullRequest
0 голосов
/ 04 февраля 2019

Я изучаю язык ассемблера MIPS.Это упражнение, которое я пытаюсь понять.Вопрос:

Что соответствует следующему коду?

Name:   move    $t0,    $zero
Loop:   add     $t1,    $t0,    $t0
        add     $t1,    $t1,    $t1
        add     $t2,    $a0,    $t1
        sw      $zero,  0($t2)
        addi    $t0,    $t0,    1
        slt     $t3,    $t0,    $a1
        bne     $t3,    $zero,  Loop
        jr      $ra

Я уже знаю значение каждой инструкции, как работают директивы и для чегопетля есть.Когда я пытаюсь запустить код в MIPS Mars Simulator, он заканчивается ошибкой, возможно потому, что для начала нужны значения, содержащиеся в регистрах $ a0 и $ a1.

Я не вижу большей картины.Что происходит во время каждой итерации цикла?Это просто часть большего алгоритма?Что он должен делать?

1 Ответ

0 голосов
/ 04 февраля 2019

Читая комментарии, я думаю, что ответ несколько яснее.В начале кода $a0 и $a1 уже должны иметь какое-то значение, допустим, x и y соответственно.

Первая строка move $t0, $zero будет int i = 0; в высокомязык программирования уровня или начальное значение цикла do-while (condition).

Следующее:

Loop: add $t1, $t0, $t0
      add $t1, $t1, $t1

- это когда цикл начинается и будет выглядеть так:

int j = 2 * i;
    j = 2 * j;

, что коротко означает int j = 4 * i;, итератор умножается на 4, потому что регистры MIPS состоят из 32 битов, что означает 4 байта.

Тогда add $t2, $a0, $t1 соответствует int k = x + j; или другими словами int k = x + 4 * i.

Следующая инструкция sw $zero, 0($t2) сохраняет 0 в памяти, адрес которой смещен на 0 от адреса значения, содержащегося в $t2.

addi $t0, $t0, 1 увеличивает i++; и

slt  $t3,  $t0,   $a1
bne  $t3,  $zero, Loop
jr   $ra

проверяет, удовлетворяется ли i < y, что является условием цикла do - while (i < y).Если это все еще верно, цикл продолжает устанавливать 0 следующий элемент в памяти, в противном случае цикл завершается возвращением к $ra.

...