我在网上和这个网站上搜索过,我找不到在MIPS中实现2D数组的好例子。我希望能够看到一个如何遍历数组以便将数据放在特定索引以及如何打印数组的示例,如下所示。
例如5x5数组,其中$将是每个索引中的数据。
a b c d e
1 $ $ $ $ $
2 $ $ $ $ $
3 $ $ $ $ $
4 $ $ $ $ $
5 $ $ $ $ $
答案 0 :(得分:14)
您需要了解的所有2维数组:
要分配你,你需要计算(#row X #column)需要X #byte
关于char需要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)的地址:
旁注:我使用左移逻辑而不是乘法,因为MIPS中的移位(sll
)需要1个时钟周期,但mul
指令需要33个时钟周期。因此,提高了代码的效率。
更新/编辑(自从我写这个答案以来已经过去3年了,所以我会改进我的答案):
以行 - 主格式迭代整数(不是双精度)的二维矩阵的伪代码如下:
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
}
}
但是,以列主要格式迭代整数(不是双精度)的二维矩阵的伪代码如下:
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
将值读入 row-major 矩阵的实现:
.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:
将值读入 column-major 矩阵的实现:
.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:
答案 1 :(得分:4)
您可以根据1D阵列设置2D阵列。您只需要将元素从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 * M + j - 1点访问第i行,第j列(零索引)的单元格