2D массив C в MIPS

#c #mips

#c #mips

Вопрос:

Я пытаюсь преобразовать следующую функцию C в MIPS, но я не могу понять, как перевести ее часть 2D массива.

     int distance(unsigned arr[15][15],
                          int coord[2], unsigned target) {
      for (int i = 0 ; i < 15 ;    i) {
        for (int j = 0 ; j < 15 ;    j) {
          if (arr[i][j] == target) {
            return ((i - coord[0]) * (i - coord[0])  
                    (j - coord[1]) * (j - coord[1]));
       } 
    }

  }
    return -1; 
}
  

Пока все, что у меня есть, это цикл double for в MIPS, но было бы здорово, если бы кто-нибудь мог помочь в том, как я мог бы выполнять операторы if и return.

 distance:
    li $t0, 0 # i
    li $t1, 0 # j

    loop_one:
        bge $t0, 15, loop_one_done
        loop_two:
            bge $t1, 15, loop_two_done

            addi $t1, $t1, 1
            j loop_two
        loop_two_done:
            addi $t0, $t0, 1
            j loop_one
    loop_one_done:

    jr  $ra
  

Комментарии:

1. Вы должны помнить, что в C, когда вы передаете массив функции, он распадается до указателя на его первый элемент. И компилятор при переводе аргументов массива преобразует его как указатель, а не как массив. Это означает, что ваш аргумент unsigned arr[15][15] действительно unsigned (*arr)[15] . Итак, все, что у вас есть, на самом деле, это указатель , а не массив.

2. @Someprogrammerdude Итак, когда у меня есть одномерный массив, передаваемый через, например, int * array, я могу получить к нему доступ с помощью mul и добавлять для перемещения каждые 4 бита, но я не знаю, как выполнить перевод с помощью 2d массива. Как я мог бы это сделать? Кроме того, я новичок в сборке / MIPS, поэтому все это для меня довольно ново.

3. godbolt.org/z/RW2ixj

4. Вы должны помнить, что «2d» массив на самом деле является массивом массивов . За «обычным» массивом у вас a[0] непосредственно следует a[1] etc., верно? Но если a[0] это массив, то это ничем не отличается. Я предлагаю вам нарисовать небольшой «2d» массив (например, int arr[3][2] ) на листе бумаги и попытаться вычислить шаблон для доступа к элементу каждого подмассива (подсказка: это одно умножение и в общей сложности два добавления). Of, и это, вероятно, поможет, если вы поймете, что для любого массива arr и индекса i выражение arr[i] точно равно *(arr i) .

5. @Someprogrammerdude Это полезно, спасибо за это объяснение.