回答編集履歴

1

追記

2019/08/01 13:07

投稿

otn
otn

スコア84566

test CHANGED
@@ -27,3 +27,37 @@
27
27
 
28
28
 
29
29
  「Cのプログラムをコンパイルした結果」ですね。
30
+
31
+
32
+
33
+ #追記
34
+
35
+ > どこまで理解したいのかにも依りますが、
36
+
37
+
38
+
39
+ 言葉だけで説明すると、
40
+
41
+
42
+
43
+ 1.関数の入り口でスタック上にローカル変数(仮引数も含む)のエリアを確保します。つまりスタックポインタをそのエリアサイズだけずらします。引数のサイズはポインタ1つで8バイト、ローカル変数128バイトで合計136バイト
44
+
45
+ 2.scrcpyを呼びます。Cの関数を呼び出す手順が決まっていて(コンパイラにも依りますが)、2つの引数をスタックに積んで呼び出し、戻ってきたら、積んだ引数を捨てます(スタックポンタを引数サイズここではポインタ2つで16バイトずらす)。
46
+
47
+ 3.1でずらしたスタックポインタを戻します(LEAVE命令)。
48
+
49
+ 4.呼び出し元に戻る(RET命令)。
50
+
51
+ ベースポンタの説明は省略。
52
+
53
+
54
+
55
+ 136を引いたあとに、さらに8引いている8の意味は調べないと分からない。CじゃなくてJavaScriptのように関数の中で関数を定義できる言語だと、スタックフレームのリンク用だと思うのですが。
56
+
57
+
58
+
59
+ > なぜ136と8を分けて足してるのか、
60
+
61
+
62
+
63
+ は、最適化すれば多分1つになるでしょう。