九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
從匯編源碼逐步分析函數(shù)調(diào)用過(guò)程

C源碼

#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);

}

對(duì)應(yīng)的匯編代碼

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ù)閱讀。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【代碼真相】函數(shù)調(diào)用 堆棧 轉(zhuǎn)載 - liangxiufei - 博客園
C++函數(shù)調(diào)用原理理解C++函數(shù)調(diào)用原理理解
如何獲知DLL中函數(shù)的參數(shù)
函數(shù)調(diào)用約定和堆棧
VS2008查看匯編代碼
函數(shù)調(diào)用堆棧變化情況
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服