回答編集履歴

1

一応、説明を追加

2019/08/01 14:27

投稿

pepperleaf
pepperleaf

スコア6383

test CHANGED
@@ -15,3 +15,45 @@
15
15
 
16
16
 
17
17
  こんなのが明確で無いと、正確な答えは出ません。
18
+
19
+
20
+
21
+ [追記]
22
+
23
+ 一応、大体の説明 (厳密にはちょっと自信無いが)
24
+
25
+ sub esp, 136 // esp レジスタの値を 136だけ減じる。 esp = esp - 136 (128 + 8(引数))
26
+
27
+ sub esp, 8 // esp = esp - 8 (8 => 64bitアドレス分か?)
28
+
29
+ push dword [ebp+8] // 多分、s の先頭アドレスを スタックに入れる
30
+
31
+ lea eax, [ebp-136] // 引数 aの値をスタックにいれる。
32
+
33
+
34
+
35
+ call <strcpy> // <strcpy> はリンク時に実際の値が設定される。
36
+
37
+ // さて、リンクとは? の問題が発生するが、こちらは分かりますか?
38
+
39
+ add esp, 16 // スタック(esp)に 16を加算 esp = esp + 16、
40
+
41
+ // esp, ebp はレジスタですが、その役割は?
42
+
43
+ // esp, ebpレジスタとか、アセンブラ命令から、Intel系 CPUでしょうか。
44
+
45
+ // あちこちに 8と言う数字が出ることから、 64bit CPUでしょうか?
46
+
47
+ // 関数呼び出し時の引数の指定方法は、CPUとコンパイラ依存です。
48
+
49
+
50
+
51
+ あ、
52
+
53
+ > strcpy(s, a);
54
+
55
+ > return s;
56
+
57
+
58
+
59
+ ここで、s を戻していますが、この `char s[128]` はスタック上に領域を確保しているで、元の Cプログラムは正しく動かないと思います。