これをコンパイルするとき:
// external definitions
int value1 = 0;
static int value2 = 0;
gccコンパイラは次のアセンブリを生成します。
.globl value1
.bss
.align 4
.type value1, @object
.size value1, 4
value1:
.zero 4
.local value2
.comm value2,4,4
ただし、変数をゼロ以外の値に初期化すると、次のようになります。
// external definitions
int value1 = 1;
static int value2 = 1;
gccコンパイラは以下を生成しました:
.globl value1
.data
.align 4
.type value1, @object
.size value1, 4
value1:
.long 1
.align 4
.type value2, @object
.size value2, 4
value2:
.long 1
私の質問は次のとおりです。
- 最初のケースでは値がbssセグメントに割り当てられ、2番目のケースではデータセグメントに割り当てられるのはなぜですか。
- value2変数が最初のケースでは.localおよび.commとして定義され、2番目のケースでは定義されないのはなぜですか。