teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

スタックの使い方を追記

2017/11/21 05:36

投稿

Harahira
Harahira

スコア245

answer CHANGED
@@ -28,4 +28,39 @@
28
28
 
29
29
  そちらの元のC言語のソースに問題があるのではないでしょうか。
30
30
 
31
- また、「%ebp(1)から%esp(1)の間」には、呼び出し元に戻るためのリターンアドレスがあります
31
+ また、「%ebp(1)から%esp(1)の間」には、呼び出し元に戻るためのリターンアドレスがあります
32
+
33
+ ---
34
+ 追記
35
+
36
+ 私も読み違えていましたが、私が提示したアセンブラソースでも1ワード分、スタックに余りがありました。
37
+ ```
38
+ subl $16, %esp
39
+ ```
40
+ これは、スタックポインタを16byte境界で動かすためで、intの変数を5つ使うようにすると、スタックは32byte取られるようになり、8byteは未使用になります。
41
+
42
+ 但し、私の環境(Ubuntu 17.04、gcc 6.3.0)では、sample2.cは以下のようになります。
43
+ ```
44
+ pushl %ebp
45
+ movl %esp, %ebp
46
+ subl $16, %esp
47
+ call __x86.get_pc_thunk.ax
48
+ addl $_GLOBAL_OFFSET_TABLE_, %eax
49
+ movl $2, -12(%ebp)
50
+ movl $3, -8(%ebp)
51
+ movl $4, -4(%ebp)
52
+ movl -12(%ebp), %edx
53
+ movl -8(%ebp), %eax
54
+ addl %eax, %edx
55
+ movl -4(%ebp), %eax
56
+ addl %edx, %eax
57
+ leave
58
+ ret
59
+
60
+ __x86.get_pc_thunk.ax:
61
+ movl (%esp), %eax
62
+ ret
63
+ ```
64
+ そちらの環境では、未使用領域を0で初期化しているようですが、こちらではなりません。
65
+
66
+ 使用する変数の数を変化させてコードを生成すれば、より情報が得られるかもしれません。