注册 登录
编程论坛 汇编论坛

下面的程序为什么会栈溢出。

随风的飞叶 发布于 2015-10-13 11:24, 4846 次点击
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 开始的地方了吗。
14 回复
#2
随风的飞叶2015-10-13 16:22
版主大神,请指教。
#3
随风的飞叶2015-10-13 16:24
如果程序修改下。
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
在第四次压栈操作时,数据就被改变。但是程序能完成。   
#4
wmf20142015-10-13 17:28
回复 3楼 随风的飞叶
这样压会破坏前面定义的数据。
#5
随风的飞叶2015-10-13 19:06
主要是第一贴的问题。执行到第七次压栈就会给踢出程序。10 00 c8 13 d4 0d我明白是怎么来的。但是前面的c7 13 00 00是怎么来的弄不明白。还有,压栈后溢出的数据应该存在13c7:fffe 13c7:fffc.......可是怎么就程序给踢出来了,后面全是00 00的。
只有本站会员才能查看附件,请 登录
#6
hu9jj2015-10-13 19:53
只能说明你堆栈的容量定义的太小了。
#7
随风的飞叶2015-10-13 20:01
我知道我定义的栈小,问题不是这个。我的问题是,单步操作三次压栈,那两个字的内容是怎么改变的。为什么第七次压栈时程序给踢出来了。看五楼的图。
#8
随风的飞叶2015-10-13 20:05
就是单步操作除了pushf,push cs,push ip外,还有两次压栈,这两次压栈是那来的。是外中断引起的吗,刚看到外中断这章,看不明白。
#9
随风的飞叶2015-10-13 20:08
操作改为中断。
#10
hu9jj2015-10-14 07:30
以下是引用随风的飞叶在2015-10-13 20:05:53的发言:

就是单步操作除了pushf,push cs,push ip外,还有两次压栈,这两次压栈是那来的。是外中断引起的吗,刚看到外中断这章,看不明白。

debug在执行程序的时候也要用到堆栈的。
#11
随风的飞叶2015-10-14 07:56
以下是引用hu9jj在2015-10-14 07:30:01的发言:

 
debug在执行程序的时候也要用到堆栈的。
debug执行程序时单步中断用到压栈这个我知道,只是还有两个字的内容的改变是什么引起的。还有,执行到第七次压栈时怎么程序就给踢出来了。溢出内容没有看到改变什么原有数据啊。
#12
wmf20142015-10-14 08:40
这小伙子好执着啊!
1、最前面的数据就是debug单步中断保护现场改写的数据,不过它已经将SP指针值还原,不影响你定义的栈空间大小。
2、溢出的数据根本不会存储,当栈指针为0,再次压栈,栈指针会变为FFFF,此时会产生1号中断,通知栈溢出,SS的值保持不变。
#13
随风的飞叶2015-10-14 08:55
我第七次压栈会被踢出程序大概明白了。因为数据丢失,无法恢复现场,所以程序崩溃。那么压栈时,ss:fffe的内容也改变了啊,本来全是00的。随着压栈的进行。后面的数据也在变化,就是那五个字的内容会逐次改写的。
#14
随风的飞叶2015-10-14 08:57
栈溢出不是要进行循环存放的吗,汇编语言不是不对栈顶越界作检查吗
#15
随风的飞叶2015-10-14 13:53
最后三章看的实在是糊涂,先看c语言去,回头再来学吧,实验实在是做不出来。
1