アセンブラ、調べてもすぐ忘れるのでまとめる。
intelシンタックスで、 -pieか-no-pieかでだいぶ違うみたいだが、以下は最近主流の-pieを前提とする。
セッション
アセンブリプログラムは、複数のセッションで構成される。 グローバル変数の配置を理解するには、まずセッションの違いを理解しておく必要があるのでまとめておく。
違うセッションに配置したからといって、必ずSEGVるわけではなく、動いてしまうこともある。
- .text
- 命令、要は関数定義とか
- 定数なら配置できる?
- .textセッションでwriteしようとするとSEGVる。
- .bss
- .data
グローバル変数の定義
初期化しないグローバル変数の定義
.comm v,4,4
.commはリンカがまとめて.bssセクションに配置してくれるらしいので、初期値は0になっている。 .commの第2引数はサイズ, 第 3 引数はアライメントの指定サイズらしい。配列などのサイズは型×配列長で求まる。 (アライメントはどう決まるのか、決めるのかはよくわからない。)
0で初期化したグローバル変数の定義(gccの場合)
.bss v: .zero 4
初期化するグローバル変数の定義
v: .long 4
ちなみに.longは4バイトの型を示す。