c语言第一课学习目标:
1.运行第一个C语言程序
2.熟悉VC开发环境
3.C函数的格式
4.C函数的调用
5.函数的反汇编分析-空函数
6.功能的反汇编分析-简单功能
7.函数嵌套调用的反汇编分析
运行第一个C语言程序,熟悉VC开发环境。
# include & ltstdio.h & gt//头文件
int()//程序入口点
{
printf(“Hello Word!”);
返回0;
}
c函数的格式
没有参数和返回值的函数格式
Void函数名()
{
//代码
}
带参数且无返回值的函数格式
Void函数名(参数类型参数名,参数类型参数名)
{
//代码
}
裸函数
void __declspec(naked)函数()
{
//这里不能有代码。
}
如何用C语言写汇编
void __declspec(naked)函数()
{
//通过汇编写一个函数,把任意两个数相加。
__ASM
{
//提升堆栈
推送ebp
mov ebp,esp
添加esp,0x40
//保护现场
推送ebx
推送esi
推送edi
//填充溢出缓冲区
mov ecx,0x10
mov eax,0xCCCCCCCC
lea edi,dword ptr ss:[ebp-0x40]
ret stos dword ptr es
//实现函数
mov eax,dword ptr ss:[ebp+8]
添加eax,dword ptr ss:[ebp+c]
//还原场景
pop edi
pop esi
pop ebx
//恢复原始堆栈
mov esp,ebp
为什么要恢复栈基址
//返回调用的下一行
浸水使柔软
//平衡堆栈(假设传递了两个参数)
添加esp,0x8
}
}
调用惯例
调用约定的参数堆栈顺序来平衡堆栈。
__cdecl从右向左堆栈。调用者清除堆栈。
__stdcall从右向左堆栈,并自行清理堆栈。
__fastcallECX/EDX传递前两个参数,其余参数从右向左堆栈,以自行清除堆栈。
观察以下三个函数的参数在程序集中是如何堆叠的
例1。
int __cdecl plus1(int x,int y)
{
返回x+y;
}
例2。
int __stdcall plus1(int x,int y)
{
返回x+y;
}
例3。
int __fastcall plus1(int x,int y,int l,int k)
{
返回x+y+l+k;
}
本文来自怪你过分美丽投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/645586.html