La compréhension de l'Assemblée MIPS .ALIGNER et d'Adressage de Mémoire
Je suis de ce cours, et j'ai vraiment du mal comprendre la directive .align
concept.
Voici un exemple, que je ne pouvais pas comprendre:
Je sais qu'à l'intérieur du segment de données, il y a des adresses, en commençant par 0x10010000,0x10010020,etc.
Et je sais, qu'à l'intérieur de chaque adresse, il y a 8 mémoire de champs, chacun a 32 bits.
Maintenant, ce que je ne comprends pas, comment et pourquoi var2
à l'intérieur de l'adresse 0x10010010? str1
est à l'intérieur de l'adresse 0x10010003 parce que nous avons réservé 3 bits pour le var1
.
La dernière chose est, qu'est-ce exactement la directive .align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used
aligner 3` et jusqu', mais je n'ai pas vraiment l'obtenir.
Je suis désolé si cela est très confus, les gars, je suis un peu désespérée ici.
Vous devez vous connecter pour publier un commentaire.
L'alignement est important pour un processeur MIPS, il aime seulement pour lire multi-valeurs d'octets de la mémoire à une adresse qui est un multiple de la taille des données.
L' .ASCIIZ champ peut être placé n'importe où depuis une chaîne de caractères est de lire un octet à la fois. Donc, en mettant à 0x10010003 est fine.
L' .MOT de champ doit être aligné sur un multiple de 4. Donc il ne peut pas être mis à 0x1001000E, le prochain emplacement disponible après la chaîne. L'assembleur intentionnellement décale la valeur et les feuilles de deux octets inutilisés. À l'adresse suivante qui est un multiple de 4, 0x10010010.
L' .ALIGNER la directive est un moyen de remplacer la valeur par défaut de l'alignement des règles. Le champ suivant, après que la directive sera aligné à un multiple de 2 à la puissance n où n est le .ALIGNER la valeur. Dans votre cas, c'est pow(2, 3) = 8 octets.
Qui est ce que vous voyez se passe, sans .ALIGNER la directive de l' .La MOITIÉ de terrain devrait être stocké à 0x10010014. Pas un multiple de 8, de sorte qu'il est déplacé vers 0x10010018.
L'exemple est autrement artificielle, pas de raison évidente pour utiliser le .ALIGNER la directive ici depuis .La MOITIÉ ne nécessite qu'un aligment à un multiple de 2, afin de les stocker à 0x10010014 aurait été bien.
Certaines assemblée directives implique que les données sont stockées alignés, ce qui signifie en commençant à une adresse qui est un puissance de deux. Rappeler d'abord un couple de conventions en MIPS:
(1) un "mot" est de 4 octets (vous verrez souvent défini comme 2 octets),
(2) un halfword (.la moitié) sont 2 octets, et
(3) .asciiz null termine la chaîne (comme en C).
En utilisant cela, vous avez déjà expliqué comment var1 et str1 sont stockées. Pourquoi la mémoire tampon de 2 vide octets avant var2? Parce qu'il est déclaré .word, et (par (1) ci-dessus) seront donc stockées dans un emplacement de la mémoire qui est un multiple de 4. Aviez-vous déclaré .la moitié, vous n'auriez pas 2 vide octets entre str1 et var2.
var2 est déclaré .moitié - c'est un 16 bits (2 octets) adresse qui s'inscrit dans l'un. Toutefois, avant de déclarer qu'il l'alignement modifié à 3. Maintenant, vérifiez la première phrase: c'est le puissance vous lever 2; nous sommes donc en train d'aligner à 8. Cela signifie que jusqu'à ce remplacées, les variables seront placés comme il l'a déclaré, mais en outre leur premier emplacement de stockage doit être un multiple de 8. Par conséquent, l'assembleur insère 4 vide octets pour stocker var3 à un multiple de 8.