char* test1()
26: {
00401590 push ebp
00401591 mov ebp,esp
00401593 sub esp,44h
00401596 push ebx
00401597 push esi
00401598 push edi
00401599 lea edi,[ebp-44h]
0040159C mov ecx,11h
004015A1 mov eax,0CCCCCCCCh
004015A6 rep stos dword ptr [edi]
27: char* pstr = "Hello"; //“Hello”在内存的数据区。即data标签里
004015A8 mov dword ptr [ebp-4],offset string "Hello" (0046f01c) //直接将“Hello”的地址赋给pstr ,而不是里面的内容。
28: // pstr = "123";
29: return pstr;
004015AF mov eax,dword ptr [ebp-4] //由 eax返回给调用函数
30: }
004015B2 pop edi
004015B3 pop esi
004015B4 pop ebx
004015B5 mov esp,ebp
004015B7 pop ebp
004015B8 ret
//test2
32: char* test2()
33: {
004015D0 push ebp
004015D1 mov ebp,esp
004015D3 sub esp,48h
004015D6 push ebx
004015D7 push esi
004015D8 push edi
004015D9 lea edi,[ebp-48h]
004015DC mov ecx,12h
004015E1 mov eax,0CCCCCCCCh
004015E6 rep stos dword ptr [edi]
34: char pstr[] = "Hello2"; ///用数组定义
004015E8 mov eax,[string "Hello2" (0046f024)] //先将“Hello2”这个些数据复制到eax中去,
004015ED mov dword ptr [ebp-8],eax //在栈中的[ebp-8] 复制eax的数据,但因eax只有32位,所以只能复制“Hell”四个字母,每字母8位,即 4*8 = 32
004015F0 mov cx,word ptr [string "Hello2"+4 (0046f028)] //然后,继续将数据区的剩余数据复制到栈中,注意此时的栈是本函数的栈,当本函数返回,而主函数再调用其他函数时,本区的栈将会变成其他函数的数据,这也是临时变量的具体含义吧。
004015F7 mov word ptr [ebp-4],cx
004015FB mov dl,byte ptr [string "Hello2"+6 (0046f02a)]
00401601 mov byte ptr [ebp-2],dl //最后一个byte型的是 “00”,即是字符串最后的‘\0’。以保证字符串结束。
35:
36: return pstr;
00401604 lea eax,[ebp-8] //也是由eax返回一个地址给调用函数
37: }
00401607 pop edi
00401608 pop esi
00401609 pop ebx
0040160A mov esp,ebp
0040160C pop ebp