1. ホーム
  2. assembly

[解決済み] アセンブリMIPS .ALIGNとメモリアドレスの理解

2022-02-19 02:09:09

質問内容

このコースを受講しているのですが、ディレクティブの理解にとても苦労しています。 .align というコンセプトがあります。

以下は、私が理解できなかった例です。

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

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

さて、私が理解していないのは、どのように、そしてなぜ var2 は、アドレス 0x10010010 の中にあるのですか? str1 が0x10010003の中にあるのは、そのために3ビットを予約したからです。 var1 .

最後に、このディレクティブは一体何なのかということです。 .align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used align 3` and up, but I don't really get it.

このような状況下で、私は必死になっているのです。

どのように解決するのですか?

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

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

.WORDフィールドは4の倍数にアライメントされなければならないので、文字列の次に空いている0x1001000Eには置けません。 アセンブラは意図的に値をずらし、2バイトを未使用のままにしています。 4の倍数である次のアドレス、0x10010010へ。

.ALIGN指令は、デフォルトのアライメント規則を上書きする方法です。 このディレクティブの次のフィールドは、2のn乗になるようにアラインされます。 あなたの場合、それはpow(2, 3) = 8 bytesです。

.ALIGN指令がなければ、.HALFフィールドは0x10010014に格納されるでしょう。 8の倍数ではないので、0x10010018に移動されます。

.HALFは2の倍数のアライメントを必要とするだけなので、0x10010014に保存しても問題ないでしょう。