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

回答編集履歴

1

一応、説明を追加

2019/08/01 14:27

投稿

pepperleaf
pepperleaf

スコア6385

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プログラムは正しく動かないと思います。