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回ぐらい見ます…