2013-10-26 13 views
5

Ich nehme diesen Kurs, und ich habe wirklich Probleme zu verstehen, die Richtlinie .align Konzept.Understanding Assembly MIPS .ALIGN und Speicher Adressierung

Hier ist ein Beispiel, das ich nicht verstehen konnte:

enter image description here

Ich weiß, dass innerhalb des Datensegments gibt Adressen, mit 0x10010000,0x10010020 starten, etc.

Und ich weiß, dass innerhalb jeder Adresse gibt es 8 Speicherfelder, jedes hat 32bit.

Nun, was ich nicht verstehe ist, wie und warum var2 innerhalb der Adresse 0x10010010? str1 ist innerhalb der Adresse 0x10010003, weil wir 3 Bits für die var1 reserviert haben.

Die letzte Sache ist, was genau die Richtlinie .align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used Ausrichtung 3 `und höher, aber ich verstehe es nicht wirklich.

Es tut mir leid, wenn das sehr verwirrend ist Jungs, ich bin hier irgendwie verzweifelt.

Antwort

9

Ausrichtung ist wichtig für einen MIPS-Prozessor, es liest nur gerne Multi-Byte-Werte aus dem Speicher an einer Adresse, die ein Vielfaches der Datengröße ist.

Das Feld .ASCIIZ kann überall platziert werden, da ein String jeweils ein Byte gelesen wird. Also es auf 0x10010003 zu setzen ist in Ordnung.

Das Feld .WORD muss auf ein Vielfaches von 4 ausgerichtet sein. Es kann daher nicht auf 0x1001000E, dem nächsten verfügbaren Ort nach der Zeichenfolge, platziert werden. Der Assembler verschiebt absichtlich den Wert und lässt zwei Bytes unbenutzt. Bis zur nächsten Adresse, die ein Vielfaches von 4 ist, 0x10010010.

Die .ALIGN-Anweisung ist eine Möglichkeit, die Standardausrichtungsregeln zu überschreiben. Das nächste Feld nach der Direktive wird auf ein Vielfaches von 2 mit der Potenz von n ausgerichtet, wobei n der Wert für .ALIGN ist. In deinem Fall ist das pow (2, 3) = 8 Bytes.

Welches ist was passiert, ohne die .ALIGN-Anweisung würde das .HALF-Feld bei 0x10010014 gespeichert werden. Kein Vielfaches von 8, also wird es nach 0x10010018 verschoben.

Das Beispiel ist ansonsten künstlich, kein offensichtlicher Grund, die .ALIGN-Direktive hier zu verwenden, da .HALF nur eine Ausrichtung auf ein Vielfaches von 2 erfordert, also würde es bei 0x10010014 gespeichert werden.

+1

War meine Antwort am Telefon tippen, während es keine gab ... Ihre hätte die Notwendigkeit für eine andere vermieden. – gnometorule

+0

Vielen Dank für Ihre Antworten! Frage: Wie ist 0x10010010 ein Vielfaches von 4? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4, was eine Multiplikation von 4 ist. Wenn die Berechnung für Sie keinen Sinn ergibt, lesen Sie bitte noch einmal die Hexadezimalzahlen. – gnometorule

3

Bestimmte Assemblierungsrichtlinien implizieren, dass Daten ausgerichtet gespeichert werden, dh beginnend bei einer Adresse, die eine Potenz von zwei ist. Daran erinnern, zuerst ein paar Konventionen in MIPS:

(1) ein "Wort" ist 4 Byte (Sie werden es manchmal sehen, definiert als 2 Byte),

(2) ein Halbwort (.half) sind 2 Bytes und

(3) .asciiz null beendet die Zeichenfolge (wie in C).

Damit haben Sie bereits erklärt, wie var1 und str1 gespeichert sind. Warum der Puffer von 2 leeren Bytes vor var2? Weil es als .word deklariert ist und (durch (1) oben) wird es so gespeichert, dass es an einem Speicherplatz beginnt, der ein Vielfaches von 4 ist. Hätten Sie es als .half deklariert, hätten Sie zwischen str1 keine 2 leeren Bytes und var2.

var2 ist eine .half - es ist eine 16-Bit- (2 Byte) Adresse, die in einem passt. Bevor Sie es jedoch deklarieren, wird die Ausrichtung auf 3 geändert. Überprüfen Sie nun den ersten Satz: Dies ist die Leistung Sie erhöhen 2 zu; Also werden wir bis 8 ausgerichtet. Dies bedeutet, dass Variablen bis zum Überschreiben platziert werden, wie deklariert, aber zusätzlich muss ihr anfänglicher Speicherort ein Vielfaches von 8 sein. Daher fügt der Assembler 4 leere Bytes ein, um var3 auf einem Vielfachen von 8 zu speichern.