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;

}

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/272833.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:02
下一篇 2024-12-17 14:02

相關推薦

發表回復

登錄後才能評論