Когда я пишу в MIPS, я не уверен, использовать ли li или addi.Мне до сих пор неясно, в чем разница. - PullRequest
0 голосов
/ 15 октября 2018

Например, у меня есть фрагмент кода на 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 - это вектор [], а $ a1 - это Н. Опять же, я не уверен, правильно ли использовать 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 Ответ

0 голосов
/ 15 октября 2018

Инструкция li (немедленная загрузка) загружает определенное числовое значение в регистр.

addi (добавить промежуточное звено) добавляет регистр и знакрасширенное непосредственное значение и сохраняет результат в регистре.

Итак, если вы не уверены на 100%, что регистр имеет нулевое значение, вам не следует использовать инструкцию addi для установкизарегистрироваться.

Например:

addi $t1, $t1, 0    #t1 holds count. count = 0

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

Таким образом, безопасный способ - установитьрегистр с li (таким образом, count = 0), не принимая во внимание предыдущее значение регистра.

...