|
#include"stdio.h"
_declspec(naked) int fun(int a,int b)//naked表示后面的代码都是以汇编的形式写入
{
_asm
{
push ebp//ebp是当前堆栈的栈底指针,这样主要是为了保存当前堆栈栈底的指针,在后期我们好恢复对战的平衡
mov ebp,esp//在上面一条语句中push ebp我们将栈底指针压入了栈底,现在讲esp栈顶指针,保存进ebp
//也就是将原来的栈顶指针现在保存在原来的栈底,现在的栈底保存的是,之前的栈顶指针,而原来的ebp
//栈底指针我们压入了堆栈中区
sub esp,0x80//将当前的栈顶指针移动80,假如当前的栈顶指针通过push ebp,mov ebp,esp之后的值是0012fff0的话
//那就减去0x80 刚好是128个字节,每4个字节成为内存地址的形式那就是32个内存地址
mov ebx,0x12345678//这个时候讲0x12345678的值,存进ebx中
push ebx//并且将ebx压入堆栈,这个时候ebx的值在执行完上面一条mov ebx,0x12345678的时候值已经是0x12345678
//此时的栈顶指针指向的是压入堆栈的ebp地址处
//为什么一定要pop处eax 测试其他寄存器(你乐意的话写那个通用寄存器都可以,不要写栈顶和栈底2个就行还有eip)
pop eax//将eax弹出堆栈,
mov esp,ebp//恢复原来的堆栈
pop ebp//弹出原来保存在堆栈中的栈底指针
ret//返回并且按照原来的顺序继续执行
}
}
int main()
{
int a;//整形变量a
a=fun(1,2);//函数调用
printf("%x\n",a);//打印
return 0;//返回值因为是int 需要返回值,void则不需要
}
详细得图文笔记在pdf文档中
|
评分
-
查看全部评分
上一篇: c++ primer plus 6 函数指针梳理&笔记下一篇: win32汇编笔记
|