#include 'stdio.h'
int test(int x, int y, double& z)
{
z = x + y;
return 0;
}
void main()
{
double sum = 1.2;
int a = 2 ,b = 3 , ret = 0;
ret = test(a, b, sum);
printf('ret:%d', ret);
}
void main()
11: {
寄存器 棧單元地址 棧單元內(nèi)容或解釋
00410990 push ebp //壓入之前調(diào)用棧的棧底地址,棧元素增加1
00410991 mov ebp,esp //新??臻g的棧底地址EBP設(shè)置為增加的這個(gè)棧元素地址(即調(diào)用者棧棧幀的棧底地址)
00410993 sub esp,54h //分配54h 即84字節(jié)棧內(nèi)存
00410996 push ebx //保存各寄存器內(nèi)容
00410997 push esi
00410998 push edi
00410999 lea edi,[ebp-54h] //取新分配內(nèi)存的低地址
0041099C mov ecx,15h //計(jì)數(shù)器設(shè)置15h, 及21個(gè)4字節(jié)
004109A1 mov eax,0CCCCCCCCh //寫(xiě)入eax, 0CCCCCCCCh表示初始化的內(nèi)存
004109A6 rep stos dword ptr [edi] //將eax內(nèi)容寫(xiě)入內(nèi)存地址,計(jì)數(shù),寫(xiě)15h次。
12: double sum = 1.2;
004109A8 mov dword ptr [ebp-8],33333333h
004109AF mov dword ptr [ebp-4],3FF33333h
13: int a = 2 ,b = 3 , ret = 0;
004109B6 mov dword ptr [ebp-0Ch],2
004109BD mov dword ptr [ebp-10h],3
004109C4 mov dword ptr [ebp-14h],0
//變量初始化, EBP-X 表示變量地址,先分配的變量減的少,后分配的減的多
14: ret = test(a, b, sum);
004109CB lea eax,[ebp-8]
004109CE push eax
004109CF mov ecx,dword ptr [ebp-10h]
004109D2 push ecx
004109D3 mov edx,dword ptr [ebp-0Ch]
004109D6 push edx
004109D7 call @ILT+10(test) (0040100f) //跳轉(zhuǎn)到test的函數(shù)執(zhí)行,請(qǐng)先看test部分,test執(zhí)行完
標(biāo)記A
004109DC add esp,0Ch //釋放調(diào)用時(shí)壓棧參數(shù)再看這邊。
004109DF mov dword ptr [ebp-14h],eax //將返回值保存到棧臨時(shí)變量
15: printf('ret:%d', ret); //此段不解釋
004109E2 mov eax,dword ptr [ebp-14h]
004109E5 push eax
004109E6 push offset string 'ret:%d' (00426fd8)
004109EB call printf (00410910)
004109F0 add esp,8
16: }
004109F3 pop edi //恢復(fù)各寄存器
004109F4 pop esi
004109F5 pop ebx
004109F6 add esp,54h //釋放臨時(shí)變量
004109F9 cmp ebp,esp //此時(shí)兩者應(yīng)該相等
004109FB call __chkesp (00401170)
00410A00 mov esp,ebp //恢復(fù)上層調(diào)用者棧頂
00410A02 pop ebp //恢復(fù)上層調(diào)用者棧底
00410A03 ret //調(diào)轉(zhuǎn)到上層調(diào)用者執(zhí)行
至此主函數(shù)執(zhí)行結(jié)束。
main ret后的代碼
00401299 add esp,0Ch
0040129C mov dword ptr [mainret],eax
0040129F mov edx,dword ptr [mainret]
004012A2 push edx
004012A3 call exit (00402360)
----------------------------------------------------------------------------------------------------------------------
Test函數(shù)源碼
3: int test(int x, int y, double& z)
4: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
5: z = x + y;
00401038 mov eax,dword ptr [ebp+8] //ebp+X引用調(diào)用者傳入?yún)?shù)變量
0040103B add eax,dword ptr [ebp+0Ch]
0040103E mov dword ptr [ebp-4],eax //ebp-X 引用本函數(shù)塊分配的變量
00401041 fild dword ptr [ebp-4] //fild是將整數(shù)轉(zhuǎn)化為長(zhǎng)雙精FP80壓棧(壓到st0
00401044 mov ecx,dword ptr [ebp+10h]
00401047 fstp qword ptr [ecx] //fstp是將彈棧指令,將st0彈出。
6: return 0;
00401049 xor eax,eax
7: }
0040104B pop edi //各寄存器值出?;謴?fù)
0040104C pop esi
0040104D pop ebx
0040104E mov esp,ebp //釋放本函數(shù)棧空間
00401050 pop ebp //恢復(fù)EBP指針,同時(shí)ESP指針下移一個(gè) push 指令ESP自動(dòng)上移,pop自動(dòng)下移。至此,??臻g又恢復(fù)到main函數(shù)的棧空間。
00401051 ret //函數(shù)調(diào)用結(jié)束彈出棧頂元素(返回地址),跳轉(zhuǎn)到此地址執(zhí)行。請(qǐng)回到標(biāo)記A處繼續(xù)閱讀。
聯(lián)系客服