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.