2016-11-21 4 views
1

Je comprends que les registres en mémoire sont de 32 bits. Je comprends aussi que lb va charger le contenu de la mémoire dans les 8 bits inférieurs d'un registre, et que si jeÉcrire dans l'octet suivant d'un registre

lb $t1, $a3 
lb $t1, 4($a3) 

La deuxième commande lb écrase le contenu chargé dans le premier. Cependant, existe-t-il un moyen d'écrire dans le deuxième octet d'un registre (chargement à partir d'une partie différente dans la mémoire, donc pas deux octets juste à côté de l'autre) et conserver les informations du premier octet?

Répondre

0

Je suppose que vous voulez utiliser ici est lbu (octet de charge non signé) et non lb parce que vous ne voulez pas que le registre soit signe étendu (par exemple, copie l'octet AA dans le registre entraînera 000000AA et pas FFFFFFAA).

Si vous voulez écrire sur le deuxième octet d'un registre, vous pouvez d'abord utiliser lbu pour charger l'octet de la mémoire à un autre registre , puis décalage à gauche 8 bits, et addu au registre d'origine.

Par exemple:

lbu $t1, $a3  # 0x000000AA 
lbu $t2, 4($a3)  # 0x000000BB 
sll $t2, $t2, 8  # 0x000000BB -> 0x0000BB00 
addu $t1, $t1, $t2 # 0x000000AA + 0x0000BB00 = 0x0000BBAA