Ссылки на массивы выполняются с помощью арифметического указателя c. Сначала мы должны узнать расположение переменных string1
и i
. Давайте предположим, что string1
в $a0
и i
в $t0
. Нам нужно будет добавить эти две переменные вместе. Всякий раз, когда мы выполняем арифметическую операцию c, мы должны отправлять результат куда-нибудь, и здесь идея состоит в том, чтобы отправить результат в новый еще неиспользованный регистр, скажем $t1
. ($a0
и $t0
в этом сценарии было бы плохим местом для отправки результата, поскольку эти регистры содержат значения, которые нам понадобятся позже в текущей или следующей итерации l oop.)
add $t1, $a0, $t0
Следующая разыменование этого временного указателя с использованием lbu
:
lbu $t2, 0($t1)
, снова нацеленного на неиспользуемый регистр.
Версия C с использованием трехадресный код будет выглядеть так:
char *p;
char ch;
p = string1 + i;
char ch = *p;
Сравнение выполняется либо с помощью инструкции beq
, либо bne
, в обоих из которых для сравнения используются два регистра (соответственно, для равенства или неравенства) и цель ветвления в виде метки.
Мы используем условные ветки, чтобы пропустить вперед if-then. Идея состоит в том, чтобы рассуждать, когда пропустить часть then, а когда пропустить, противоположно условию if, как мы записали бы его в C. В сборке: пропустите это, если это, тогда как в C: сделайте это, если это. Таким образом, при сборке проверяется противоположное условие, чтобы пропустить потом часть.