回答編集履歴
1
一応、説明を追加
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プログラムは正しく動かないと思います。
|