回答編集履歴

1

スタックの使い方を追記

2017/11/21 05:36

投稿

Harahira
Harahira

スコア243

test CHANGED
@@ -59,3 +59,73 @@
59
59
 
60
60
 
61
61
  また、「%ebp(1)から%esp(1)の間」には、呼び出し元に戻るためのリターンアドレスがあります
62
+
63
+
64
+
65
+ ---
66
+
67
+ 追記
68
+
69
+
70
+
71
+ 私も読み違えていましたが、私が提示したアセンブラソースでも1ワード分、スタックに余りがありました。
72
+
73
+ ```
74
+
75
+ subl $16, %esp
76
+
77
+ ```
78
+
79
+ これは、スタックポインタを16byte境界で動かすためで、intの変数を5つ使うようにすると、スタックは32byte取られるようになり、8byteは未使用になります。
80
+
81
+
82
+
83
+ 但し、私の環境(Ubuntu 17.04、gcc 6.3.0)では、sample2.cは以下のようになります。
84
+
85
+ ```
86
+
87
+ pushl %ebp
88
+
89
+ movl %esp, %ebp
90
+
91
+ subl $16, %esp
92
+
93
+ call __x86.get_pc_thunk.ax
94
+
95
+ addl $_GLOBAL_OFFSET_TABLE_, %eax
96
+
97
+ movl $2, -12(%ebp)
98
+
99
+ movl $3, -8(%ebp)
100
+
101
+ movl $4, -4(%ebp)
102
+
103
+ movl -12(%ebp), %edx
104
+
105
+ movl -8(%ebp), %eax
106
+
107
+ addl %eax, %edx
108
+
109
+ movl -4(%ebp), %eax
110
+
111
+ addl %edx, %eax
112
+
113
+ leave
114
+
115
+ ret
116
+
117
+
118
+
119
+ __x86.get_pc_thunk.ax:
120
+
121
+ movl (%esp), %eax
122
+
123
+ ret
124
+
125
+ ```
126
+
127
+ そちらの環境では、未使用領域を0で初期化しているようですが、こちらではなりません。
128
+
129
+
130
+
131
+ 使用する変数の数を変化させてコードを生成すれば、より情報が得られるかもしれません。