2010-03-04 6 views
3
 .data 
VALS: .half 0xbead, 0xface 
RES: .space 4 
    .text 
    la  $t0,VALS 
    lh $t1,($t0) 
    lhu $t2,2($t0) 
    sll $t2,$t2,16 
    or $t2,$t1,$t2 
    jal AVG 
    .word -2 
    .word -6 
    la $t4,RES 
     sw $v0,($t4) 
     li  $v0,10 
    syscall 
AVG: lw $v0,($ra) 
    lw $t3,4($ra) 
    add $v0,$v0,$t3 
    sra $v0,$v0,1 
    addi $ra,$ra,8 
    jr  $ra 

Dans ce code MIPS, que font les parties .word? Mon émulateur ne peut pas gérer les directives de données dans la section de texte. Que font les directives? Et à quoi bon faire .word -2 et .word -6, plutôt que .word -8?Directives .word dans l'assemblage MIPS

Répondre

4

La directive place les valeurs de mot -2 et -6 dans le flux de code. Si vous regardez la représentation réellement binaire de ce morceau, vous trouverez, au milieu de l'encodage d'instruction, FFFFFFFEFFFFFFFA, ou FEFFFFFFFAFFFFFF en fonction de l'endianness.

L'assembleur émettra 2 mots valant des données de valeur -2 et -6 respectivement, rien de tel qu'un seul mot de -8.

Si vous regardez ce qui est à l'AVG: l'étiquette, vous remarquerez qu'il utilise

lw $v0, ($ra) 
lw $t3, 4($ra) 

qui charge 2 mots dans des registres v0 et t3 de l'adresse de retour (là où vous avez sauté, à savoir à partir des données intégrées dans le segment de code). Donc ... v0 y gagne -2, et t3 obtient -6. Notez également comment les segments de code ajoute 8 à $ ra avant de revenir, pour sauter par dessus les données incorporées. En bref, c'est un moyen de coder les valeurs constantes à charger dans les registres dans le cadre du flux de code.

Maintenant, ce que le code fait est d'ajouter les 2 ensemble, décaler droite, avant de retourner (je suppose que la mise en œuvre moyenne). Cela n'a pas beaucoup de sens dans ce cas précis de faire autant de travail, quand vous pouvez simplement calculer directement la moyenne au moment de la compilation (ou si vous écrivez asm directement, dans votre tête). Je suppose que AVG est supposé être appelé à partir de nombreux endroits, mais même alors, comme il attend ses valeurs du segment de code (généralement en lecture seule), je ne vois pas l'intérêt de calculer des maths sur des valeurs constantes.