2011-02-02 2 views
1

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

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

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

ответ

3

Вы можете настроить 2D-массив в терминах 1D-массива. Вам просто нужно правильно отобразить элементы из массива 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 

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

+0

Обычно идентификатор рисовать что-то но чувствовал себя ленивым:/ –

+0

У вас есть код, который я могу видеть в MIPS? – DomX23

+0

, используя сопоставление в моем пересмотренном ответе, вы можете получить доступ к произвольной точке в 2D-массиве с помощью стандартных методов доступа к массиву –

11

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

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

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

относительно числа байт, необходимо 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 

Чтобы получить адрес индекса (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


Update/Edit (это было более 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: