2014-06-27 7 views
0

Je suis bloqué à la conversion de l'instruction MIPS en code machine ci-dessous.MIPS Instruction to Machine Code

sb $t3, 40($s2) 
    beq $s0, $s1, Lab1 
    j Lab1 

    jr $s0 

Jusqu'à présent, je

101000 10010  01011  101000 
000100 10000  10001  0x00400000 

Comment puis-je aller d'ici? Depuis 0x00400000 est l'adresse pas la valeur, je ne pense pas que je le traduis en binaire. Et ainsi de suite ... Je ne peux pas vraiment trouver un exemple à partir d'ici. S'il vous plaît aider.

Répondre

0

Ah je pense que je reçois une meilleure idée maintenant en regardant MIPS: Calculating BEQ into Hexadecimal Machine Code et la réponse de Lưu.

beq $s0, $s1, Lab1 
=>000100 10000 10001 0x00400000 
=>0001 0010 0001 0001 (0x004000040 + 1 away instruction) 
=>0001 0010 0001 0001 0000 0000 0000 0101 
=12110001 
    j Lab1 
=>0000 1000 0001 0000 0000 0000 0000 0000 
=08100000 
    jr $s0 
=>0000 0000 0000 0000 0000 0000 0000 1000 
=02000008 

Voici ce que j'ai obtenu. Si une erreur s'il vous plaît faites le moi savoir.

0

Les valeurs immédiates dans les instructions MIPS sont codées directement en tant que représentations binaires.

+0

Comment est-ce que je peux faire cela quand 0x00400000 est représenté 010000000000000000000000 (24 bits) quand dans I-type il devrait être 16? comment est-ce que je le comprime? – user3754212

+0

Si '' 0x00400000'' représente l'adresse de '' Lab1'', alors vous devez encoder le nombre d'instructions que vous voulez sauter, ce que je crois juste '' adresse de l'instruction cible - adresse de l'instruction de branchement - 1'', mais je peux me tromper à ce sujet. Cependant, si '' 0x00400000'' représente déjà ce saut, alors ce n'est pas possible, et votre code doit être ajusté. –

+0

En fait, à la réflexion j'ai réalisé qu'il serait possible d'assembler si '' 0x00400000'' était un décalage, mais il faudrait ajouter des instructions supplémentaires pour sauter plus loin que 16 bits normalement –

0

Le codage dépend du type d'instruction.

Pour branche relative comme beq, l'immédiat est le décalage, vous devez donc spécifier la distance entre l'instruction actuelle et la cible de branche. Par exemple, pour passer 3 prochaines instructions dont vous avez besoin beq $s0, $s1, +3 qui code comme

opcode  $s0  $s1      +3 
000100 10000 10001 0000 0000 0000 0011 

Pour saut absolu vous devez vous assurer que la cible et le 6 courant d'instruction élevé bits sont les mêmes. L'adresse immédiate est faible 26 bits de la cible décalé de 2. Le format de l'instruction j est 0000 10ii iiii iiii iiii iiii iiii iiii si j 0x00400000 sera codé comme

0000 1000 0001 0000 0000 0000 0000 0000 

Vous pouvez en savoir plus sur l'encodage en this question ainsi que les cours ici:

L'encodage des instructions est également disponible. here

Mais pourquoi utilisez-vous à la fois la branche conditionnelle et le saut à Lab1 l'un à côté de l'autre? C'est inutile parce que finalement il va sauter sans rien faire

+0

Il est assigné par le prof. Il l'a probablement fait pour que les élèves sachent ce qu'il fait. – user3754212