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

回答編集履歴

1

追記

2019/08/01 13:07

投稿

otn
otn

スコア86378

answer CHANGED
@@ -12,4 +12,21 @@
12
12
  あと、
13
13
  > Cのプログラムをアセンブルした結果
14
14
 
15
- 「Cのプログラムをコンパイルした結果」ですね。
15
+ 「Cのプログラムをコンパイルした結果」ですね。
16
+
17
+ #追記
18
+ > どこまで理解したいのかにも依りますが、
19
+
20
+ 言葉だけで説明すると、
21
+
22
+ 1.関数の入り口でスタック上にローカル変数(仮引数も含む)のエリアを確保します。つまりスタックポインタをそのエリアサイズだけずらします。引数のサイズはポインタ1つで8バイト、ローカル変数128バイトで合計136バイト
23
+ 2.scrcpyを呼びます。Cの関数を呼び出す手順が決まっていて(コンパイラにも依りますが)、2つの引数をスタックに積んで呼び出し、戻ってきたら、積んだ引数を捨てます(スタックポンタを引数サイズここではポインタ2つで16バイトずらす)。
24
+ 3.1でずらしたスタックポインタを戻します(LEAVE命令)。
25
+ 4.呼び出し元に戻る(RET命令)。
26
+ ベースポンタの説明は省略。
27
+
28
+ 136を引いたあとに、さらに8引いている8の意味は調べないと分からない。CじゃなくてJavaScriptのように関数の中で関数を定義できる言語だと、スタックフレームのリンク用だと思うのですが。
29
+
30
+ > なぜ136と8を分けて足してるのか、
31
+
32
+ は、最適化すれば多分1つになるでしょう。