<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • c語言課設總結(c語言基礎知識)


    C語言第一課學習目標:

    1. 運行第一個C語言的程序

    2. 熟悉VC開發環境

    3. C函數的格式

    4. C函數的調用

    5. 函數的反匯編分析——空函數

    6. 函數的反匯編分析——簡單功能

    7. 函數的反匯編分析——嵌套調用

    運行第一個C語言的程序,熟悉VC開發環境

    #include <stdio.h> //頭文件

    int main() //程序入口點

    {

    printf(“Hello Word!”);

    return 0;

    }

    C函數的格式

    無參數、無返回值的函數格式

    void 函數名()

    {

    //代碼

    }

    有參數,無返回值的函數格式

    void 函數名(參數類型 參數名,參數類型 參數名)

    {

    //代碼

    }

    裸函數

    void __declspec(naked) Function()

    {

    //此處可以無任何代碼

    }

    如何在C語言里寫匯編

    void __declspec(naked) Function()

    {

    //通過匯編寫一個函數實現任意兩個數相加

    __ASM

    {

    //提升堆棧

    push ebp

    mov ebp,esp

    add esp,0x40

    //保護現場

    push ebx

    push esi

    push edi

    //填充溢出緩沖區

    mov ecx,0x10

    mov eax,0xCCCCCCCC

    lea edi,dword ptr ss:[ebp-0x40]

    ret stos dword ptr es:[edi]

    //實現功能

    mov eax,dword ptr ss:[ebp+8]

    add eax,dword ptr ss:[ebp+c]

    //恢復現場

    pop edi

    pop esi

    pop ebx

    //恢復原始堆棧

    mov esp,ebp

    pop ebp

    //返回調用Call的下一行

    ret

    //平衡堆棧(假設傳了兩個參數)

    add esp,0x8

    }

    }

    調用約定

    調用約定參數壓棧順序平衡堆棧

    __cdecl從右至左入棧調用者清理堆棧

    __stdcall從右至左入棧自身清理堆棧

    __fastcallECX/EDX傳遞前兩個參數,剩下的參數從右至左入棧自身清理堆棧

    觀察下列三個函數在匯編中參數是如何入棧的

    例1.

    int __cdecl plus1(int x,int y)

    {

    return x+y;

    }

    例2.

    int __stdcall plus1(int x,int y)

    {

    return x+y;

    }

    例3.

    int __fastcall plus1(int x,int y,int l,int k)

    {

    return x+y+l+k;

    }

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费