Все, что вам нужно знать о 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 тактов. Таким образом, повышается эффективность кода.
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:
Обычно идентификатор рисовать что-то но чувствовал себя ленивым:/ –
У вас есть код, который я могу видеть в MIPS? – DomX23
, используя сопоставление в моем пересмотренном ответе, вы можете получить доступ к произвольной точке в 2D-массиве с помощью стандартных методов доступа к массиву –