Индексирование массива C в сборке MIPS? - PullRequest
0 голосов
/ 16 февраля 2019

Вопрос:

void swap (int v[], int k)
{
int temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
}

Мой вопрос: почему int v[] добавляется $t1?(кто бы это ни сделал, он даже не прокомментировал это, так что я предполагаю, что $a0 - это v[], а $a1 - k).

Ответ в мипсах:

swap: sll $t1, $a1, 2
add $t1, $a0, $t1
lw $t0, 0($t1)
lw $t2, 4($t1)
sw $t2, 0($t1)
sw $t0, 4($t1)
jr $ra

Я знаю, что это используется для обмена переменными, но что он делает здесь, почему он добавляет v[] с k?Разве v[] не является массивом объявленных переменных, как вы можете добавить его с целым числом k?

1 Ответ

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

кто бы это ни сделал, он даже не прокомментировал это, поэтому я предполагаю, что $ a0 - это v [], а $ a1 - это k

Это соглашения о вызовах MIPS .Первые 4 аргумента функции находятся в $a0..$a3, а возвращаемое значение (здесь не требуется) находится в $v0$v1, если требуется).Адрес возврата находится в регистре $ra.

Я знаю, что это используется для замены переменных, но что он здесь делает, почему он добавляет v [] с k?Разве это не v [] массив объявленных переменных, как вы можете добавить его с целым числом k?

v [] действительно массив int.То, что содержит переменную v, является адресом массива.Добавление значения к адресу массива - это путь к определенным элементам массива.

swap:                   # void swap (int v[], int k)
                        ; so v[] is in $a0 and k in $a1
      sll $t1, $a1, 2   ; k*=4 (ie sizeof(int))
      add $t1, $a0, $t1 ; $t1=@v+4*k==@(v[k])
      lw $t0, 0($t1)    #   temp = v[k];
      lw $t2, 4($t1)    ; 4(t1) is @(v[k])+4==@(v[k+1]
                        ; $t0==temp==v[k], $t2==v[k+1]
      sw $t2, 0($t1)    #   v[k] = v[k+1]; 
      sw $t0, 4($t1)    #   v[k+1] = temp;
      jr $ra            ; go back to caller
...