捉到初学汇编的一个误区,这个地方被小甲鱼老师忽略了
在学习小甲鱼老师的视频的时候,第五章有一个这样的题,看图在这章中,小甲鱼老师没有为我们亲自单步调试,哎呀,这天意啊!前面小甲鱼老师都是亲自调试的
所以这个地方我是自己写好程序自己单步调试的,但是最后无论如何都无法通过,整整纠结了一天,睡觉做梦都在想这个问题,因为代码没错,我最后是照抄的了,可是还是出错和崩溃,就在今天,突然间想到了问题所以,豁然开朗
其实我在想,还是我的只是不够,如果是老手有经验的应该一看就知道会出问题的
还是真心希望各位大牛能多指点下我们这样潜心学习的好学生
分析问题: 图上下都有一点残缺,希望大家能看懂
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两个重合出错,也不会是栈存放数据时覆盖了代码段的代码
继续学习,要是多学习,这个问题应该不算是问题,谁叫我还是新手呢
帮你顶一个。。。 图片搞错了,真的不好意思啊 把栈放到代码段本身就不合适!容易修改指令代码! 本帖最后由 深渊 于 2013-12-30 13:13 编辑
:huffy:亲爱的小甲鱼老师怎么错了呢?我没说老师错啊
这图片是老师视频中戒的图,按照图中的程序代码,是会报错和崩溃的
前面视频中这个程序代码显示用的sp=16,图上的这集视频用的是sp=32,按照我自己的理论,这两个栈顶指针指向的位置都是错误的,如果是16,那么栈空间不够,程序崩溃, 换做32的话,栈顶指针指向的其实也就是代码段的代码,把数据放入栈中的时候同时也覆盖了代码段的代码,程序最后就不是自己缩所写的代码了
这本书我还没看,所以不知道书上怎么写的,我想书上应该也是这样的,因为甲鱼老师是按着书本讲的
刚好这一段没有单步调试,让我们自己上鸡 给你顶一下喽。。。。。 修炼中,你简直是在写小说,不可以明了简单一点吗?
页:
[1]