回答編集履歴
1
一応、説明を追加
answer
CHANGED
@@ -6,4 +6,25 @@
|
|
6
6
|
また、アセンブラと言うと、CPUに依存しますが、CPUは何? (予想できますが)
|
7
7
|
コンパイル環境等はどうなっているか?
|
8
8
|
|
9
|
-
こんなのが明確で無いと、正確な答えは出ません。
|
9
|
+
こんなのが明確で無いと、正確な答えは出ません。
|
10
|
+
|
11
|
+
[追記]
|
12
|
+
一応、大体の説明 (厳密にはちょっと自信無いが)
|
13
|
+
sub esp, 136 // esp レジスタの値を 136だけ減じる。 esp = esp - 136 (128 + 8(引数))
|
14
|
+
sub esp, 8 // esp = esp - 8 (8 => 64bitアドレス分か?)
|
15
|
+
push dword [ebp+8] // 多分、s の先頭アドレスを スタックに入れる
|
16
|
+
lea eax, [ebp-136] // 引数 aの値をスタックにいれる。
|
17
|
+
|
18
|
+
call <strcpy> // <strcpy> はリンク時に実際の値が設定される。
|
19
|
+
// さて、リンクとは? の問題が発生するが、こちらは分かりますか?
|
20
|
+
add esp, 16 // スタック(esp)に 16を加算 esp = esp + 16、
|
21
|
+
// esp, ebp はレジスタですが、その役割は?
|
22
|
+
// esp, ebpレジスタとか、アセンブラ命令から、Intel系 CPUでしょうか。
|
23
|
+
// あちこちに 8と言う数字が出ることから、 64bit CPUでしょうか?
|
24
|
+
// 関数呼び出し時の引数の指定方法は、CPUとコンパイラ依存です。
|
25
|
+
|
26
|
+
あ、
|
27
|
+
> strcpy(s, a);
|
28
|
+
> return s;
|
29
|
+
|
30
|
+
ここで、s を戻していますが、この `char s[128]` はスタック上に領域を確保しているで、元の Cプログラムは正しく動かないと思います。
|