你可以确认问题出在这一段吗?
修改esp的子程序框架就是这样的
push ebp
mov ebp,esp
;上面两条就是为了保存ESP,没有特殊需求,就无需再保存
;而且,这样做会增加危险,如:
;触发保护异常
;保存的内容被其他模块意外修改,恢复时,导致堆栈失衡
;从这里开始
;mov esp,1000H
;到这里结束
;中间可以添加代码,只要保证代码块执行前后,EBP的不变,后面的mov esp,ebp指令就可以恢复ESP
;如果确认问题出在该子程序中,就应该着落在这里了
mov esp,ebp
pop ebp
ret
void main()
{
int i;
i = 5;
}
00401168 >/. 55 PUSH EBP
00401169 |. 8BEC MOV EBP,ESP
0040116B |. 51 PUSH ECX
0040116C |. C745 FC 05000>MOV DWORD PTR SS:[EBP-4],5
00401173 |. 59 POP ECX
00401174 |. 5D POP EBP
00401175 \. C3 RETN
一个很简单的程序的例子。遇到这种问题,技术性最高但可能最快的方式就是上调试器,看得一清二楚。
mov esp,1000H
mov esp,ebp 都很可疑,不要随便乱动栈指针,很少有这个必要,自己要对栈中由处理器保存的内容作到心中有数。
是汇编语言吗?你设置stack段了吗,这个得自己设的,并且设置指示栈的那个寄存器,如果你不设这些,编译时不会报错,程序会按开始的默认值跑,那就悲剧了
QQ已经解决
是在dos下还是windows下?