2D Array в MIPS - PullRequest
       37

2D Array в MIPS

2 голосов
/ 03 февраля 2011

Я искал в Интернете и на этом сайте, и я не могу найти хороший пример реализации 2D Array в MIPS.Я хотел бы иметь возможность увидеть пример того, как пройти через массив для размещения данных по определенному индексу и как распечатать массив, как показано ниже.

Например, массив 5x5, где $будут данные в каждом индексе.

  a b c d e
1 $ $ $ $ $
2 $ $ $ $ $
3 $ $ $ $ $
4 $ $ $ $ $
5 $ $ $ $ $

Ответы [ 2 ]

14 голосов
/ 17 августа 2013

Все, что вам нужно знать о двухмерных массивах:

  1. Выделяют
  2. Реализация вложенных циклов

Чтобы выделить вас, вам нужно вычислить (#row X #column) X #байт необходимо

относительно количества байтов, которое вам нужно: 1 для символа, 4 целого числа, 4 с плавающей запятой одинарной точности, 8 для с плавающей запятой двойной точности. Например:

Для динамического выделения массива из 150 элементов двойной точности, таких как 15 строк и 10 столбцов:

li  $t1,15
li  $t2,10
mul $a0, $t1, $t2
sll $a0, $a0, 3   # multiply number of elements by 2^3 = 8
                  # because each double precision floating point number takes 8 bytes
li  $v0, 9
syscall
move $s0,$v0   # save array address in $s0

Чтобы получить адрес index (3,4):

  • Основной ряд: 8 X (10 X 3 + 4) = 272, затем добавьте его к базовому адресу
  • Основной столбец: 8 X (15 X 4 + 3) = 504, затем добавьте его к базовому адресу

Примечание: : Я использовал логический сдвиг влево вместо умножения, потому что сдвиг (sll) в MIPS занимает 1 такт, а инструкция mul - 33 такта. Таким образом, повышается эффективность кода.

enter image description here


Обновление / редактирование (прошло более 3 лет с тех пор, как я написал этот ответ, поэтому я улучшу свой ответ):

Псевдокод для итерации по 2-мерной матрице целых чисел (не удваивается) в формате строки следующий:

for (int i = 0; i < array height; i++) {
    for (int j = 0; j < array width; j++) {

        prompt and read array value

        row index = i
        column index = j

        memory[array base address + 4 * (array width * row index + column index)] = array value
    }
}

Однако псевдокод для итерации по 2-мерной матрице целых чисел (не двойных) в мажорном столбце имеет следующий вид:

for (int i = 0; i < array height; i++) {
   for (int j = 0; j < array width; j++) {

       prompt and read array value

       row index = i
       column index = j

       memory[array base address + 4 * (array height * column index + row index)] = array value
   }
}

Примечание : Как мы видим, структура цикла остается прежней, но часть вычисления адреса была немного изменена. Теперь реализация вышеуказанных псевдокодов проста. Нам нужно 2 вложенных цикла. Предполагая, что:

$t0 <-- base address of array (or matrix or 2 dimensional array)
$t1 <-- height of matrix
$t2 <-- width of matrix
i <---- row index
j <---- column index

Реализация чтения значений в мажорную строку матрицу:

        .data
read_row_matrix_prompt_p:   .asciiz "Enter an integer: "
###########################################################

        .text
read_row_matrix:
    li $t3, 0               # initialize outer-loop counter to 0

read_row_matrix_loop_outer:
    bge $t3, $t1, read_row_matrix_loop_outer_end

    li $t4, 0               # initialize inner-loop counter to 0

read_row_matrix_loop_inner:
    bge $t4, $t2, read_row_matrix_loop_inner_end

    mul $t5, $t3, $t2       # $t5 <-- width * i
    add $t5, $t5, $t4       # $t5 <-- width * i + j
    sll $t5, $t5, 2         # $t5 <-- 2^2 * (width * i + j)
    add $t5, $t0, $t5       # $t5 <-- base address + (2^2 * (width * i + j))

    li $v0, 4               # prompt for number
    la $a0, read_row_matrix_prompt_p
    syscall

    li $v0, 5               # read a integer number
    syscall

    sw $v0, 0($t5)          # store input number into array

    addiu $t4, $t4, 1       # increment inner-loop counter

    b read_row_matrix_loop_inner    # branch unconditionally back to beginning of the inner loop

read_row_matrix_loop_inner_end:
    addiu $t3, $t3, 1       # increment outer-loop counter

    b read_row_matrix_loop_outer    # branch unconditionally back to beginning of the outer loop

read_row_matrix_loop_outer_end:

Реализация чтения значений в основной столбец матрица:

   .data
read_col_matrix_prompt_p:   .asciiz "Enter an integer: "
###########################################################

   .text
read_col_matrix:
    li $t3, 0               # initialize outer-loop counter to 0

read_col_matrix_loop_outer:
    bge $t3, $t1, read_col_matrix_loop_outer_end

    li $t4, 0               # initialize inner-loop counter to 0

read_col_matrix_loop_inner:
    bge $t4, $t2, read_col_matrix_loop_inner_end

    mul $t5, $t4, $t1       # $t5 <-- height * j
    add $t5, $t5, $t3       # $t5 <-- height * j + i
    sll $t5, $t5, 2         # $t5 <-- 2^2 * (height * j + i)
    add $t5, $t0, $t5       # $t5 <-- base address + (2^2 * (height * j + i))

    li $v0, 4               # prompt for number
    la $a0, read_col_matrix_prompt_p
    syscall

    li $v0, 5               # read a integer number
    syscall

    sw $v0, 0($t5)          # store input number into array

    addiu $t4, $t4, 1       # increment inner-loop counter

    b read_col_matrix_loop_inner    # branch unconditionally back to beginning of the inner loop

read_col_matrix_loop_inner_end:
    addiu $t3, $t3, 1       # increment outer-loop counter

    b read_col_matrix_loop_outer    # branch unconditionally back to beginning of the outer loop

read_col_matrix_loop_outer_end:
4 голосов
/ 03 февраля 2011

Вы можете настроить двумерный массив в терминах одномерного массива. Вам просто нужно правильно отобразить элементы из 1D массива в 2D массив. На этом сайте есть фотографии:

http://www.plantation -productions.com / Webster / www.artofasm.com / Windows / HTML / Arraysa2.html # 1010609

Вы можете использовать стандартный формат для адресации каждой ячейки. Например:

      a  b  c  d  e

1     0  1  2  3  4
2     5  6  7  8  9
3    10 11 12 13 14
4    15 16 17 18 19
5    20 21 22 23 24

Вы должны быть в состоянии увидеть шаблон :) В общем, если есть M столбцов и N строк, доступ к ячейке в строке i, столбце j (с нулевым индексом) можно получить в точке i * M + j - 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...