2 votes

Comment utiliser le mot de charge MIPS

Cette question peut paraître stupide :) mais je suis un peu confus, quelqu'un peut-il m'expliquer pourquoi le code utilise lw pour charger un mot de la mémoire dans le registre pendant que 0x1b430010 est déjà dans le registre $t1 en utilisant lui y ori ?

lui $t1,0x1b43 
ori $t1,$t1,0x0010 
lui $t2,0xabbb 
ori $t2,$t2,0x8050

lw $t0,0($t1) 
srl $t0,$t0,6 
andi $t0,$t0,0x3

lw $t3,0($t2) 
andi $t3,$t3,0xff9f 
sll $t0,$t0,5 
or $t3,$t3,$t0 
sw $t3,0($t2)

1voto

Ped7g Points 12668

0x1b430010 est en t1 un nombre (entier non signé de 32 bits) représentant l'adresse de la mémoire. Les lui + ori construire cette constante dans t1 à partir de valeurs immédiates partielles encodées directement dans lui/ori les opcodes des instructions (chaque instruction MIPS est codée sous la forme d'un mot de 32 bits, de sorte qu'une partie de ces bits forme un motif connu de l'unité centrale sous le nom de lui l'instruction, ou ori et les 16 bits restants, IIRC, forment la valeur immédiate à utiliser par l'instruction).

Les lw $t0,0($t1) est tout à fait différent, il utilisera d'abord la valeur dans t1 (modifié par la constante "déplacement" +0 - c'est ce "0" avant les parenthèses) comme adresse mémoire, c'est-à-dire que l'UC mettra les fils du bus d'adresse à la valeur 0x1b430010, puis signalera à la puce mémoire qu'elle doit utiliser ces fils d'adresse et charger la mémoire à partir de cette adresse, en établissant la valeur de lecture sur les fils de données du bus. Une fois que la puce mémoire aura signalé à l'unité centrale que les données ont été lues et que les fils de données sont dans le bon état, l'unité centrale stockera cet état en tant que nouvelle valeur de t0 .

En bref, il chargera un mot de la mémoire de l'ordinateur à l'adresse 0x1b430010 dans le registre t0 - mais quelle est la valeur réelle stockée en mémoire à cet endroit, il n'est pas possible de le dire à partir de votre court extrait.

JFYI : la mémoire sur MIPS est adressable par octets (le bus d'adresse a une largeur de 28 ou 30 bits ? ou 32 ? Cela dépend probablement du matériel informatique cible = la largeur du bus d'adresse définit la zone maximale que vous pouvez adresser, c'est-à-dire qu'elle limite la mémoire maximale possible disponible dans l'espace d'adressage du CPU). Ainsi, en définissant une adresse particulière, vous pouvez lire/modifier n'importe quel octet de la mémoire (tant que vous avez suffisamment de privilèges pour le faire, et qu'il ne s'agit pas d'une mémoire en lecture seule, ou d'un espace vide non cartographié par une puce mémoire).

Il y a un petit problème : les instructions load/store word exigent (pour simplifier la conception HW de l'unité de gestion de la mémoire) que l'adresse mémoire soit "alignée sur le mot", c'est-à-dire divisible par 4 (ce qui équivaut à "les deux bits inférieurs sont à zéro"). De même, pour lire un demi-mot, l'adresse mémoire doit être alignée sur un demi-mot (divisible par 2 = le bit inférieur de l'adresse est nul). Si vous travaillez avec des tampons de données non alignés, vous devez les charger par octets individuels (et composer la valeur d'un mot à partir de quatre octets lus), afin d'éviter un plantage lors de l'accès à la mémoire non alignée. lw sur une mauvaise adresse.

La valeur 0x1b430010 est divisible par 4 (les quatre bits inférieurs sont à zéro, alors que deux suffiraient, cette valeur est en fait divisible par 16), et cette adresse mémoire est probablement dirigée vers .data de la région, de sorte que l'action lw devrait fonctionner sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X