2011-03-28 7 views
0

Je suis un débutant dans MIPS et j'essaye d'écrire un code simple qui court sur un tableau donné dans la mémoire qui est plus petit que 10 cellules, disons 9 cellules, et imprime l'écran le plus grand nombre.MIPS - aide convertir le code de C

J'ai écrit un code C qui résout ce problème, mais je ne sais pas comment le convertir (sans mips gcc) en un code d'assemblage MIPS fonctionnel.

Le code I a écrit:

int N = 9 , i = 0 , biggest = 0 ; 
int arr [N] = -2 , 3 , 9 , -1 , 5 , 6 , 10 , 52 , 9 ; 

while (i <= N) 
{ 
    if (arr [i] > biggest) 
     biggest = arr [i] ; 

    i++ ; 
} 

printf ("biggest number is: %d" , biggest) ; 

je serai plus heureux si quelqu'un peut écrire ce code dans l'assemblage MIPS et me l'expliquer.

Merci!

+0

Est-ce devoir? –

+1

Pas de devoirs ... – Batman

Répondre

0

se concentrer uniquement sur la boucle, essayez quelque chose comme ça:

.text 
    .set noreorder 
    .global get_max 
get_max: 
    li $4, array    // start pointer 
    li $5, array_end-array-4 // end pointer 
    li $2, 0     // 'biggest' as result 
    lw $6, 0($4)    // load first table entry 
1: slt $3, $2, $6    // boolean flag (biggest<arr[i]) 
    movn $2, $6, $3    // update 'biggest' when flag is set 
    lw $6, 4($4)    // load next table entry 
    bne $4, $5, 1b    // continue until we hit end of array 
    addiu $4, 4     // advance to next cell (using bne delay slot) 
    jr $31      // return to the caller 
    nop       // safely fill the delay slot 

      .data 
array:  .long -2 , 3 , 9 , -1 , 5 , 6 , 10 , 52 , 9 
array_end: .long 0 

Compile ceci dans un fichier source de montage séparé et un lien avec votre code C principal.

Ne pas oublier d'appeler la fonction de votre code C:

printf("biggest=%d\n",get_max()); 
+0

Merci pour la réponse détaillée ! Que voulez-vous dire par: "notez que vous devez définir la directive noreorder pour que cela fonctionne"? avez-vous dire que ce devrait être comme ceci: .text \t .globl __start __start: li tableau t4 $ li $ t5 array_end li t2 $ 0 pv $ s6 0 (t4 $) 1: slt $ $ s3 s2 $ s6 movn $ $ s2 s3 s6 $ lw $ s6 4 (s4 $) bne $ $ s4 s5 1b addiu $ s4 4 .data tableau: .long -2, 3, 9 , -1, 5, 6, 10, 52, 9 array_end: .long 0 – Batman

+0

Je ne peux pas écrire une réponse de code normale .... pouvez-vous écrire le programme complet comme il se doit? J'ai juste besoin de voir comment cela se passe, et comment puis-je ajouter une impression sur l'écran le plus grand nombre? thnx !! – Batman

+0

Je ne peux pas écrire le programme entier pour vous, parce que je ne connais pas votre environnement exec. Si vous êtes intéressé à voir le code s'exécuter, écrivez C, utilisez objdump pour le démonter et essayez de comprendre ce qui s'y passe. Si vous êtes coincé, copiez-collez un extrait de l'assemblage et demandez des explications. Je ne me soucie pas d'écrire assembly qui appelle printf (le compilateur C fait mieux que moi), seule la boucle vaut la peine d'être écrite à la main (ici je peux faire beaucoup mieux que le compilateur) –

0

Vous avez un problème avec votre initialisation ...