La permutation des éléments dans le tableau en MIPS de l'assemblée? (plus un)

Je sais il y a une question similaire ici. J'aimerais penser que c'est un prolongement de cette question, mais plus approfondie.

Voici les pièces d'un code C qui je veux traduire de MIPS:

int a = [100];
...
j = 0;
while (j<50){
    if (a[j] > a[99-j]) {
        tmp = a[99-j];
        a[99-j] = a[j];
        a[j] = tmp;
    }
    j = j+1;
}

(Donc il fonctionne essentiellement comme un inverse)

Jusqu'à présent j'ai fait dans MIPS:

    .data
array:  .word 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80,
79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60,
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40,
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20,
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,0
.text
.globl main
main:   
la  $s1, array  # $s1 = array address
la  $s3, array
li  $s0, 0      # j = 0
lw  $t0, 0($s1) # $t0 = a[0]
lw  $t1, 396($s3)   # $t1 = a[99]
while:  beq $s0, 50, end    # break from while loop once j = 50
if: blt $t0, $t1, iterj # if the if statement not satisfied, branch to iterj
sw  $t1, 0($s1) # write to a[99-j]
sw  $t0, 396($s1)   # write to a[j]
iterj:  addi    $s0, $s0, 1 # increment j
addi    $s1, $s1, 4 # increment source address starting with j = 0
addi    $s3, $s3, -4    # decrement source address starting with j = 99
lw  $t0, 0($s1) 
lw  $t1, 396($s3)   
j   while
end:

Résumé de ce que j'ai fait en MIPS:

En gros, j'ai essayé d'initialiser le tableau dans $s1 et essayé de mon mieux pour faire des swaps sur elle. Puis j'ai réalisé que j'ai aussi besoin d'incrémenter l'adresse de la source à un[0] et en même temps de décrémentation de la source adresse à un[99]. Je pensais donc je ne peux pas utiliser seulement 1 tableau, que j'ai ensuite fait identique d'un tableau dans $s3 pour le manipuler:

addi    $s1, $s1, 4 # increment source address starting with j = 0
addi    $s3, $s3, -4    # decrement source address starting with j = 99

Maintenant est la partie que j'ai besoin d'aide:

Le code fonctionne (permutation correctement) de manière séquentielle à partir de 0 à 31 (tous dans l'hex de la forme présentée en MARS) puis 31 à 1 puis, soudain, 63 à 47. Il y a évidemment quelque chose que je fais mal. Tous j'ai juste besoin de faire est de retour, de 0 à 63 (en hexadécimal) ou de 0 à 99 (en décembre) par permutation. Un indice?

InformationsquelleAutor compski | 2013-07-22