标题:下面的程序为什么会栈溢出。
取消只看楼主
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
结帖率:83.33%
已结贴  问题点数:20 回复次数:10 
下面的程序为什么会栈溢出。
assume cs:codesg,ds:datasg,ss:stack
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h
datasg ends
stack segment
     dw 8 dup(0)     
stack ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov sp,16
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start     
在单步执行到第六次push后,查看data段,数据没有被改变。
根据王爽老师的汇编语言第二版教材,第十二,十三章,
我知道了单步操作是中断,要进行压栈操作。pushf.
push cs,push ip
这是进行了三次压栈操作。可是在程序中,在进行第七次压栈时
直接无效操作。给踢出程序了。
如果把dw 8 dup(0)给改为6,那么第五次压栈操作时就给踢出去了。
但是,数据段的内容并没有改变。

进行第七次压栈时。



     

这是进行第三次压操作后,栈段的数据,那么第四次压栈就应该会溢出了。
那么我的问题就是,单步操作要进行三次压栈,另外的两个字的内容是被什么操作
改变的。溢出的数据存在了那儿。是存在了13c7:fffe 开始的地方了吗。
搜索更多相关主题的帖子: start 
2015-10-13 11:24
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
版主大神,请指教。
2015-10-13 16:22
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
如果程序修改下。
assume cs:codesg,ds:datasg
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h

     dw 8 dup(0)     
datasg ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ss,ax
      mov sp,32
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start
在第四次压栈操作时,数据就被改变。但是程序能完成。   
2015-10-13 16:24
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
主要是第一贴的问题。执行到第七次压栈就会给踢出程序。10 00 c8 13 d4 0d我明白是怎么来的。但是前面的c7 13 00 00是怎么来的弄不明白。还有,压栈后溢出的数据应该存在13c7:fffe 13c7:fffc.......可是怎么就程序给踢出来了,后面全是00 00的。
2015-10-13 19:06
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
我知道我定义的栈小,问题不是这个。我的问题是,单步操作三次压栈,那两个字的内容是怎么改变的。为什么第七次压栈时程序给踢出来了。看五楼的图。
2015-10-13 20:01
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
就是单步操作除了pushf,push cs,push ip外,还有两次压栈,这两次压栈是那来的。是外中断引起的吗,刚看到外中断这章,看不明白。
2015-10-13 20:05
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
操作改为中断。
2015-10-13 20:08
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
以下是引用hu9jj在2015-10-14 07:30:01的发言:

 
debug在执行程序的时候也要用到堆栈的。
debug执行程序时单步中断用到压栈这个我知道,只是还有两个字的内容的改变是什么引起的。还有,执行到第七次压栈时怎么程序就给踢出来了。溢出内容没有看到改变什么原有数据啊。
2015-10-14 07:56
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
我第七次压栈会被踢出程序大概明白了。因为数据丢失,无法恢复现场,所以程序崩溃。那么压栈时,ss:fffe的内容也改变了啊,本来全是00的。随着压栈的进行。后面的数据也在变化,就是那五个字的内容会逐次改写的。
2015-10-14 08:55
随风的飞叶
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:90
专家分:158
注 册:2015-10-8
得分:0 
栈溢出不是要进行循环存放的吗,汇编语言不是不对栈顶越界作检查吗
2015-10-14 08:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-458138-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.181280 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved