[解決済み] アセンブリMIPS .ALIGNとメモリアドレスの理解
質問内容
このコースを受講しているのですが、ディレクティブの理解にとても苦労しています。
.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に保存しても問題ないでしょう。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MIPSで整数の絶対値?
-
[解決済み] 着信側セーブレジスタ、発信側セーブレジスタとは何ですか?
-
[解決済み] NASMでscanfを使うには?
-
[解決済み] アセンブリ言語で数字をプリントアウトする?
-
[解決済み] なぜSet on Less ThanはALU演算なのか?
-
[解決済み] ビットシフト演算子を使って10進数を2進数で表示するMIPS
-
[解決済み] 8086アセンブリ言語での2つのレジスタのスワッピング(16ビット)
-
[解決済み] ARMはSDIVとUDIVを区別していますが、ADD、SUB、MULでは区別していないのはなぜですか?
-
ファイルまたはアセンブリを読み込めませんでした ... 不正なフォーマットでプログラムをロードしようとしました。
-
[解決済み] MIPSの擬似命令 "move "の "addi "と "add "の違い?