2011-02-02 16 views
1

J'ai cherché en ligne et sur ce site et je ne trouve pas un bon exemple d'implémentation d'un tableau 2D dans MIPS. Je voudrais être en mesure de voir un exemple de comment passer par le tableau afin de placer des données à un index spécifique et comment imprimer le tableau comme indiqué ci-dessous.Tableau 2D dans MIPS

Comme un tableau 5x5 où $ serait les données de chaque index.

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

Répondre

3

Vous pouvez configurer un tableau 2D en termes de tableau 1D. Vous avez juste besoin de mapper correctement les éléments du tableau 1D au tableau 2D. Ce site a des photos:

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

Vous pouvez utiliser un format standard pour traiter chaque cellule. Par exemple:

 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 

Il faut être en mesure de voir le motif :) En général, s'il y a des M colonnes et N lignes, la cellule à la ligne i, on peut accéder au point j de la colonne (-indexé zéro) i * M + j - 1

+0

Normalement id dessine quelque chose out mais se sentait paresseux:/ –

+0

Avez-vous du code que je peux voir dans MIPS? – DomX23

+0

en utilisant le mappage dans ma réponse révisée, vous pouvez accéder à un point arbitraire dans le tableau 2D en utilisant les techniques d'accès au tableau standard –

11

Tout ce que vous devez savoir sur 2 tableaux: dimensions

  1. Allouer
  2. Mettre en oeuvre des boucles imbriquées

Pour vous allouez vous devez calculer (#row X #column) X #byte nécessaire

concernant le nombre d'octets dont vous avez besoin pour 1 char, 4 entier, 4 flottant simple précision, 8 pour double précision flotte. Par exemple:

Pour allouer gamme de 150 éléments à double précision de telle sorte que 15 lignes et 10 colonnes dynamiquement:

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 

Pour obtenir l'adresse de index (3,4):

  • Ligne principale: 8 X (10 X 3 + 4) = 272, puis ajoutez-le à l'adresse de base
  • Colonne major: 8 X (15 X 4 + 3) = 504, puis ajoutez-le à l'adresse de base

Note latérale: je décalage à gauche logique au lieu de se multiplier en raison de décalage (sll) dans MIPS prend le cycle 1 de l'horloge mais mul instruction prend 33 cycles d'horloge. Ainsi, améliorer l'efficacité du code.

enter image description here


Mise à jour/Modifier (il a été plus de 3 ans passé depuis que j'ai écrit cette réponse, je vais améliorer ma réponse):

Le pseudo-code à itérer 2 matrice bidimensionnelle de nombres entiers (double pas) en format de rangée principale est le suivant:

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 
    } 
} 

Cependant, pseudo-code à itérer 2 matrice bidimensionnelle de nombres entiers (double pas) en format colonne majeure est la suivante:

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 
    } 
} 

Remarque: Comme on le voit, la structure du la boucle reste la même mais la partie de calcul de l'adresse a été légèrement modifiée. Maintenant, mettre en œuvre les pseudo-codes ci-dessus sont simples. Nous avons besoin de 2 boucles imbriquées. En supposant que:

$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 

Mise en oeuvre des valeurs de lecture dans matrice de lignes-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: 

Mise en oeuvre des valeurs de lecture en colonne principale matrice:

.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: