|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在学习小甲鱼老师的视频的时候,第五章有一个这样的题,看图
代码下面一点没截到图
在这章中,小甲鱼老师没有为我们亲自单步调试,哎呀,这天意啊!前面小甲鱼老师都是亲自调试的
所以这个地方我是自己写好程序自己单步调试的,但是最后无论如何都无法通过,整整纠结了一天,睡觉做梦都在想这个问题,因为代码没错,我最后是照抄的了,可是还是出错和崩溃,就在今天,突然间想到了问题所以,豁然开朗
其实我在想,还是我的只是不够,如果是老手有经验的应该一看就知道会出问题的
还是真心希望各位大牛能多指点下我们这样潜心学习的好学生
分析问题: 图上下都有一点残缺,希望大家能看懂
1.首先定义了数据段,8个字 (系统分配了12个字节空间)
2.接着定义了栈,也是8个字 (这里把这8个字空间当作栈使用了)
3.后面我们数据段的8个字依次放入栈中,然后依次取出,达到逆过来存放的效果!这么想应该是对的,什么都对得上
4.但是当亲自编好程序运行的时候就出错了,有2种
4.1系统分配的内存是先是数据,接着是栈数据,在接着就是代码段了!!当我们运行程序后,把第一个数据放入到栈中,栈中是会自动出现(好像是)3个字的系统数据,这三个数据还受到了保护,栈中放入一个数据这三个字的系统数据就和sp一样自动往后退,我自己发现是不能被直接覆盖的,而我们定义的栈空间只有8个字大小,结果可想而知,最后就是系统数据被排挤到栈的起始地址后(因为栈的前面是数据段,我发现这几个系统数据只存在于栈中,无法越过栈到数据段中),其中有一个是cs指向的段地址,当这个段地址被排挤掉后就是程序崩溃的时候
4.2我开始想到这个问题,所以就把sp的栈顶指针数据加大了一点,指向更大一点的偏移,这样应该不会说cs指向的这个段地址被排挤出栈! 但是系统分配的的时候,栈段和代码段是相连着的,我们把sp望栈后面指向,在把数据往里面方,其不知道sp指向的地址同时也是代码段的代码呢?我们在栈中存放数据其实也就是在覆盖代码段的中的代码,导致单步调试的时候,程序出现不认识的乱汇编指令
经过一天的冥思苦想,在今天终于得到答案了,虽然很是傻,但是还是很开心的!因为毕竟是自己想到的,而不是看,听别人得到的答案
解决1.把栈中定义的字型数据增加,这样系统会把栈段和代码段的距离拉开,这样就不会出现错误
2.把sp指向的栈顶指针继续向后,也就是sp指向我们的代码段结束的后面,前面是指向16,我们应该算上代码段所占用的字节,加起来一起算才行,这样猜不会是sp和ip两个重合出错,也不会是栈存放数据时覆盖了代码段的代码
继续学习,要是多学习,这个问题应该不算是问题,谁叫我还是新手呢
|
|