C++(アセンブリ)わけわからん…2

32	int main(int argc, char * argv[])
33	{
34	  Employee *yamato;
35	  yamato  = new Employee;
36	
37	  printf("size: %lX\n",sizeof(Employee));
38	
39	  yamato->number = 0x1111;
40	  strcpy(yamato->name,"Ymamamoto");
41	  yamato->pay = 0x100;
42	
43	  yamato->ShowData();
44	
45	  delete yamato;
46	  return 0;
47	}

new演算子使って、

   0x00001e30 <+0>:	push   ebp
   0x00001e31 <+1>:	mov    ebp,esp
   0x00001e33 <+3>:	push   esi
   0x00001e34 <+4>:	sub    esp,0x34
   0x00001e37 <+7>:	call   0x1e3c <main(int, char**)+12>
   0x00001e3c <+12>:	pop    eax
   0x00001e3d <+13>:	mov    ecx,DWORD PTR [ebp+0xc]
   0x00001e40 <+16>:	mov    edx,DWORD PTR [ebp+0x8]
   0x00001e43 <+19>:	mov    esi,0x88
   0x00001e48 <+24>:	mov    DWORD PTR [ebp-0x8],0x0
   0x00001e4f <+31>:	mov    DWORD PTR [ebp-0xc],edx
   0x00001e52 <+34>:	mov    DWORD PTR [ebp-0x10],ecx
   0x00001e55 <+37>:	mov    DWORD PTR [esp],0x88
   0x00001e5c <+44>:	mov    DWORD PTR [ebp-0x18],eax
   0x00001e5f <+47>:	mov    DWORD PTR [ebp-0x1c],esi
   0x00001e62 <+50>:	call   0x1efe
   0x00001e67 <+55>:	mov    ecx,DWORD PTR [ebp-0x18]
   0x00001e6a <+58>:	lea    edx,[ecx+0x137]
   0x00001e70 <+64>:	mov    esi,0x88
   0x00001e75 <+69>:	mov    DWORD PTR [ebp-0x14],eax
   0x00001e78 <+72>:	mov    DWORD PTR [esp],edx
   0x00001e7b <+75>:	mov    DWORD PTR [esp+0x4],0x88
   0x00001e83 <+83>:	mov    DWORD PTR [ebp-0x20],esi
   0x00001e86 <+86>:	call   0x1f04
   0x00001e8b <+91>:	mov    ecx,DWORD PTR [ebp-0x18]
   0x00001e8e <+94>:	lea    edx,[ecx+0x142]
   0x00001e94 <+100>:	mov    esi,DWORD PTR [ebp-0x14]
   0x00001e97 <+103>:	mov    DWORD PTR [esi],0x1111
   0x00001e9d <+109>:	mov    esi,DWORD PTR [ebp-0x14]
   0x00001ea0 <+112>:	add    esi,0x4
   0x00001ea6 <+118>:	mov    DWORD PTR [esp],esi
   0x00001ea9 <+121>:	mov    DWORD PTR [esp+0x4],edx
   0x00001ead <+125>:	mov    DWORD PTR [ebp-0x24],eax
   0x00001eb0 <+128>:	call   0x1f0a
   0x00001eb5 <+133>:	mov    ecx,DWORD PTR [ebp-0x14]
   0x00001eb8 <+136>:	mov    DWORD PTR [ecx+0x84],0x100
   0x00001ec2 <+146>:	mov    ecx,DWORD PTR [ebp-0x14]
   0x00001ec5 <+149>:	mov    DWORD PTR [esp],ecx
   0x00001ec8 <+152>:	mov    DWORD PTR [ebp-0x28],eax
   0x00001ecb <+155>:	call   0x1d70 <Employee::ShowData()>
   0x00001ed0 <+160>:	mov    eax,DWORD PTR [ebp-0x14]
   0x00001ed3 <+163>:	cmp    eax,0x0
   0x00001ed8 <+168>:	mov    DWORD PTR [ebp-0x2c],eax
   0x00001edb <+171>:	je     0x1eec <main(int, char**)+188>
   0x00001ee1 <+177>:	mov    eax,DWORD PTR [ebp-0x2c]
   0x00001ee4 <+180>:	mov    DWORD PTR [esp],eax
   0x00001ee7 <+183>:	call   0x1ef8
   0x00001eec <+188>:	mov    eax,0x0
   0x00001ef1 <+193>:	add    esp,0x34
   0x00001ef4 <+196>:	pop    esi
   0x00001ef5 <+197>:	pop    ebp
   0x00001ef6 <+198>:	ret  


わけわからん①

本なら、push 88hして、callしてるから、0x88バイト分の
領域を割り当ててるんだな。ってわかるけど、
pushもしてないし、callもしてないし、ワケガワカラナイヨ.

(o´・ω・`)

わけわからん②

ちょっとまって…このアセンブリmovばっかりで
pushなくね?どうやってメンバ変数やったり、関数の引数を表現してるの?

って書いてて思いついたんだけど、pushしないでもespに直接movすれば
同じことを表現できるってことか。憶測でしか無いけど.
(for example)

   0x00001e78 <+72>:	mov    DWORD PTR [esp],edx

push使おうや…


ucqさんやポテチ先生みたいな憶測パワー欲しい…

実を言うと、gdbが動的解析ツールなのに、まだdisassしてしか見てないとかいう
クソ人間です。使い方が「美しき策謀」あと2回ぐらい見ます…

広告を非表示にする