首页 > 编程知识 正文

汇编堆栈使用方法,奔驰c200esp故障码

时间:2023-05-06 00:29:41 阅读:119914 作者:2575

我有点好奇,跟踪一下esp的变化情况,不知道这样理解是否可以。

我是初学者,想和大家交流,你怎么理解的?

//编译环境WIN XP sp2

//vc 6.0

//e-mail: shoow@126.com

#include char *aa='esp in test=xn ';

int k;

void _ _ declspec (已命名) test ) )

{

__asm

{

推送ebp

mov k,esp

mov ebp,esp

}

__asm

{

JMP退出

推送k

push aa

呼叫打印

add esp,4*2

}

__asm

{

exit:

推送k

push aa

呼叫打印

add esp,44h

mov esp,ebp

pop ebp

ret

}

}

intvirtualesp(int_esp ) )

{

/*

push _esp

呼叫虚拟

*/

//保存函数调用前的esp的值。 因为压迫呼叫

//因为在前面按下_esp,所以_esp减4

int esp=_esp-4;

//以及压入函数的返回地址

esp -=4;

/*

0040B7C0 55 push ebp

0040B7C1 8B EC mov ebp,esp

0040B7C3 83 EC 44 sub esp,44h

0040B7C6 53 push ebx

0040B7C7 56 push esi

0040B7C8 57 push edi

0040B7C9 8D 7D BC lea edi,[ebp-44h]

0040B7CC B9 11 00 00 00 mov ecx,11h

0040B7D1 B8 CC CC CC CC mov eax,0cccccccccccccch

040 b 7d6F3 abrepstosdwordptr [ EDI ]

*/

esp -=4; 为了保存//ebp的值,按下ebp的值

esp -=68; //为局部变量准备44h的空间

esp -=4; 按下//EBX的值

esp -=4; 按下//ESI的值

esp -=4; 按下//EDI的值

返回esp;

}

是intesp(inta )

{

int k;

_asm

{

mov k,esp

}

printf(espinesp=x(n ),k );

返回0;

}

Void主() )

{

int k;

int ret;

__asm

{

mov k,esp

}

printf(espinmain=x(n ),k );

ret=virtualesp(k;

printf(ESPinvirtualesp=x(n ),ret );

//esp(100; 仅用于说明具有与virtualesp相同的参数

ESP(100;

}

//调试版编译结果

/*

esp in main=0012ff2c

esp in virtualesp=0012fed0

esp in esp=0012fed0

*/

//注意:发行版的结果不同,可能是VC优化的结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。