函數調用規則

2018年4月12日星期四

函數調用規則

函數調用過程:可在vc上逐步調試查看寄存器,內存的變化情況

1.一些寄存器的用法

     // ebp eip  esi

     // push pop(影響esp的值)  

eip(1.放的是當前執行代碼(當前指令)的地址

2.call,ret(從當前函數返回),這倆指令將會影響eip的值

break,// 可翻譯爲jmp(無條件跳轉))

jne

       棧幀(大小:1M):ebp(棧幀地址),esp(入參做準備)(相當於棧指針)有關

    //text

     Data

    Heap

    Stack

2. 【z = fun(x,y): move eax,[ebp-8h]  push eax】eax(累加器)

(push指令esp的值,同時將eax的值壓入指定位置(壓入內存))

Lea :取偏移地址

3.call指令(只要函數被調動,一定會分配一個新的棧幀,包括遞歸)(esp,eip)

  Esp-4,把後續地址入棧   

4.深刻理解棧幀:

問題一:不同編譯器,棧幀撤銷後,申請新的棧幀殘留值可能還在,可能初始化清理了

  問題二:

5.int fun(int a,…)(不定參數問題)(函數返回值借用cpu通用寄存器(本身就具有長性)作爲作爲橋樑傳值,不允許改變通用寄存器裏的值(高級語言裏))

?爲什麼不能給表達式賦值     

   答:因爲表達式的值存放在通用寄存器裏,本身就具有長性,其值不可被改變

6.棧平衡(由調用者完成)

作業:查找:__stdcall

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章