Оптимизируйте этот ассемблерный код

Я сейчас изучаю курс компьютерной архитектуры, и мы рассматриваем основные инструкции R-типа и I-типа (также это RISC ) и т. Д. Я не могу понять, как оптимизировать этот код.

Объяснение: Этот код добавляет слова в массив чисел (на который указывает $ s1) до тех пор, пока не будет достигнут ноль. Результат сохраняется в $ t1. $ t0 содержит текущее слово.

        add   $t1, $zero, $zero      # Initialize result to zero
again:  
        lw    $t0, 0($s1)            # Load the word from the array
        beq   $t0, $zero, done       # Terminate if current word is a zero
        add   $t1, $t1, $t0          # Add current word to result
        addi  $s1, $s1, 4            # Point to the next word in the array
        beq   $t1, $t1, again        # Loop again
done:
        nop                          # Do nothing

Мне сложно оптимизировать код. Я считаю, что beq $ t1, $ t1, опять же (так как это всегда правда) не нужен, но я не знаю, как его удалить. Вот моя попытка, но теперь я понимаю, что мой код не завершится.

        add   $t1, $zero, $zero      # Initialize result to zero
again:  
        lw    $t0, 0($s1)            # Load the word from the array
        add   $t1, $t1, $t0          # Add current word to result
        addi  $s1, $s1, 4            # Point to the next word in the array
        bne   $t1, $zero, again      # If result is not zero, loop
done:
        nop                          # Do nothing

Я никогда не проверяю завершающий ноль и не перехожу к завершению. Но если я добавлю еще одну проверку, то разве код не будет таким же, как раньше?

7
задан Bill the Lizard 18 September 2012 в 16:56
поделиться