Когда я пишу в MIPS, я не уверен, использовать ли li или addi. Мне до сих пор неясно, в чем разница.
Например, у меня есть фрагмент кода C, который я пытаюсь преобразовать в MIPS для практики, но для переменной count я не знаю, использовать ли addi $t0,0 или li $t0, 0. Могу ли я использовать либо либо, либо? А какая разница?
Void haarPredict (int vector[], int N)
{
int half = N >> 1;
int count = 0;
for(int i = 0; i < half; i++)
{
int predictVal = vector[i];
int j = i + half;
vector[j] = vector[j] - predictVal
}
}
Это то, что у меня есть после преобразования приведенного выше кода в MIPS. Предполагая, что $a0 равен vector[], а $a1 равно N. Опять же, я не уверен, правильно ли использовать li или addi.
srl $t0, $a1, 1 #t0 holds half. half = N >> 1
addi $t1, $t1, 0 #t1 holds count. count = 0
addi $t2, $t2, 0 #t2 holds i. i = 0
loop: slt $t3, $t2, $t0 #t3 holds 1 if i < half
beg $t3, $zero, exit #exit if t3 == 0
lw $t4, 0($a0) #t4 holds predictValue
addi $a0, $a0, 4 #4 bytes for next word address
addi $t5, $t2, $t0 #t5 holds j. j = i + half
lw $t6, $t6, $t4 #vector[j]=vector[j]-predivtVal
addi $t2, $t2, 1 #i++
j loop
exit: jr $ra
1 ответ
Инструкция li (немедленная загрузка) загружает определенное числовое значение в регистр.
Addi (Add inmediate) добавляет регистр и немедленное значение с расширением знака и сохраняет результат в регистре.
Поэтому, если вы не уверены на 100%, что регистр имеет нулевое значение, вам не следует использовать инструкцию addi для установки регистра.
Например:
addi $t1, $t1, 0 #t1 holds count. count = 0
Вы не знаете, равен ли $ t1 нулю в данный момент. Если это подпрограмма, вы можете использовать мусорное значение $t1 (значение до вызова подпрограммы, до перехода к адресу подпрограммы).
Таким образом, безопасный способ состоит в том, чтобы установить регистр с помощью li (таким образом, count=0), не принимая во внимание предыдущее значение регистра.