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