第一次接觸C語言裸函數
先上代碼:
naked.cpp:
#include "stdafx.h"
extern "C" int __declspec(naked) add2(int x,int y) //引用說明支持跨文件的調用
{
__asm{ //函數的環境初始化(升棧、保護現場、填充緩存區)
PUSH EBP
MOV EBP,ESP
SUB ESP,0X40
PUSH EBX
PUSH ESI
PUSH EDI
LEA EDI,DWORD PTR SS:[EBP-0X40]
MOV EAX,0XCCCCCCCC
MOV ECX,0X10
REP STOSD
}
__asm{ //函數功能
MOV EAX,DWORD PTR SS:[EBP+0X8]
ADD EAX,DWORD PTR SS:[EBP+0XC]
}
__asm{ //恢復現存降棧返回
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
RET
}
}
====================================================
base.cpp
#include "stdafx.h"
extern "C" int add2(int,int); //聲明外部函數
int _tmain(int argc, _TCHAR* argv[])
{
//test
int sum=0;
printf ("add2(50,76):%d\n",add2(50,76));
return 0;
}
今天加深理解的一個C語言函數的運行機制。
第一次接觸C語言裸函數