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