2013-10-26 9 views
5

私はこのコースを受講しており、私は指示.alignの概念を理解することに本当に苦労しています。アセンブリーMIPSの.ALIGNとメモリアドレス指定の理解

は、ここで私は理解できませんでした、例です:

enter image description here

私はデータセグメント内など、0x10010000,0x10010020で始まるアドレスがあることを知っています。

私は各アドレスの中に8つのメモリフィールドがあり、それぞれに32ビットがあることを知っています。

ここで、わからないことは、どうやってvar2がアドレス0x10010010の中にあるのですか? str1は、var1の3ビットを予約しているため、アドレス0x10010003の内部にあります。

最後のことは、ちょうど指示.align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I usedが3行以上整列することですが、実際にはそれを取得しません。

これは非常に混乱している人には申し訳ありませんが、私はここで絶望的です。

答えて

9

アライメントはMIPSプロセッサにとって重要です。アライメントは、データサイズの倍数のアドレスにあるマルチバイト値をメモリから読み取ることが好きです。

文字列が一度に1バイトずつ読み込まれるため、.ASCIIZフィールドはどこにでも配置できます。だから0x10010003に置いても問題ありません。

.WORDフィールドは、4の倍数に揃えられている必要があります。したがって、文字列の次の使用可能な場所である0x1001000Eに配置することはできません。アセンブラは意図的に値をシフトし、未使用の2バイトを残します。 4の倍数である次のアドレス、0x10010010。

.ALIGNディレクティブは、デフォルトのアラインメントルールをオーバーライドする方法です。ディレクティブの次のフィールドは、2の倍数にnの累乗に揃えられます.nは.ALIGN値です。あなたの場合、それはpow(2、3)= 8バイトです。

どのようなことが起こっているかは、.ALIGNディレクティブがなければ、.HALFフィールドは0x10010014に格納されます。 8の倍数ではないので、0x10010018に移動されます。

この例は人工的なものですが、.ALIGNディレクティブを使用する明白な理由はありません.HALFは2の倍数のアライメントしか必要としないため、0x10010014に格納するとうまくいきます。

+1

私の答えは電話で入力していましたが、あなたのものは別のものの必要性を取り除いていませんでした。 – gnometorule

+0

あなたのお返事ありがとうございます!質問:0x10010010はどのように4の倍数ですか? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4、これは4の掛け算です。計算に意味がない場合は、16進数で再度読んでください。 – gnometorule

3

特定のアセンブリ命令は、データが一揃いに格納されていることを意味します。つまり、アドレスがで始まり、2の累乗がであることを意味します。 MIPSでの規則の最初のカップルを思い出してください:

(1) "という言葉は、" 4バイト(あなたは時にはそれが2バイトとして定義されて表示されます)、

(2)ハーフワードである(.half)されている2バイト、および

(3).asciiz nullは、(Cのように)文字列を終了します。

これを使用して、var1とstr1がどのように格納されているかについて説明しました。なぜvar2の前に2つの空のバイトのバッファ?これは.wordと宣言されているので(上記(1)で)、4の倍数のメモリ位置から格納されます。これを.halfと宣言した場合、str1とおよびvar2。

var2が宣言されています。ハーフ - 1に収まる16ビット(2バイト)のアドレスです。しかし、それを宣言する前にアラインメントが3に変更されました。最初の文章を確認してください:これはの力です。つまり、実際には8に整列します。これは、オーバーライドされるまで変数が宣言されたとおりに配置されることを意味しますが、初期格納場所は8の倍数でなければなりません。したがって、var3を格納するために4の空のバイトが8の倍数で挿入されます。

関連する問題