用debug查看栈顶初始化中都发生了什么,它们到底是什么?
首先我们将代码段设置在1000:0000处,在这里先输入下面代码:1000:0000 b80010 mov ax,1000
1000:0003 8ed0 mov ss,ax //代码段和堆栈段一样都是1000
1000:0005 bc5000 mov sp,50 //堆栈段的偏移设成50,离代码远点不会覆盖代码
// 实际上上面三句执行完就完成了栈的初始化,即栈顶设置在1000:50,以后入栈出栈都是发生在栈顶的上方(向低地址方向)
1000:0008 8rcc8 mov ax,cs
1000:000a 8ed8 mov ds,ax
1000:000c a10000 mov ax,
1000:000f 03060200 add ax,
1000:0013 8b1e0400 mov bx,
1000:0017 031e0600 add bx,
1000:001b 50 push ax
1000:001c 53 push bx
1000:001d 58 pop ax
1000:001e 5b pop bx
下图是输入完代码后的图,栈顶上方还什么都没有:
下面是完成前三句指令即栈顶初始化后的图,可以看到1000:40那行有了少量数据:
1、“mov ss,ax”这句在debug里面执行的时候,其实已经执行了两句,即“mov ss,ax”和“mov sp,50”。为什么会这样,因为在debug模式下就是这样的,这是debug的设定。至于为什么要这样做,因为栈是很重要的东西,所以设置栈的段值和栈指针的过程不允许其他指令打扰,中断也不行,debug自己也不行,否则会产生未知错误。你可以想一想,假如刚刚设置完栈的段值,还未来得及设置栈指针SP,这个时候发生了一个中断,我们知道中断响应后,现场是要压栈的,压栈就会使用栈,这个时候的栈不能正常使用,肯定就会发生错误,其他情况下,比如恶意访问等等也是类似的道理。2、为什么执行完“mov ss,ax”之后,栈里有东西,那是因为debug单步中断的时候,会使用到,那些产生的东西是debug单步中断产生的。那些数据的意义是什么,那就需要查看debug.exe里正在做什么了。
参考资料:
通常来说,使用堆栈的规则决定了:大于等于 sp 地址的内存是使用中的,小于等于 sp 地址的内存是还没有使用的。 call word ptr ds: 的时候 sp 是等于 0x10 的,ds 又等于 ss,按正常的程序来说这是一个未使用的内存。
当这个小程序单独运行时没什么问题,因为只有这个小程序在使用这部分内存。但是它和 DEBUG 程序一起运行的时候,你们会使用同一个内存,同一个堆栈指针, DEBUG 在运行的时候也会有一些状态需要保存,DEBUG 就会把它保存在栈里面。只要使用了debug,在按下 T 到 CPU 执行某个指令之间, DEBUG 会接管 CPU 来运行, 这段时间它会使用栈, 所以栈里又会压入一些状态数据。等到 CPU 执行某条 指令的时候栈里就有东西了。 谢谢,那些中断产生的东西不会影响后面的压栈和出栈吗? 一般会的,只要你通过SS:SP访问栈的数据,而不是通过其他方式(比如将栈段的值传送给寄存器DS,然后给个偏移去访问。),一般不会出现错误。王爽老师书的检测题里有一个这样的题目,http://bbs.fishc.com/thread-100283-1-1.html,这个题目里特别说明了不能用debug单步调试,就是讲的不按规则使用栈,这其实就是早期黑客用的手段。 http://bbs.fishc.com/thread-100283-1-1.html
看看这个帖子,王爽老师书里特别说明了不能用debug单步调试,否则结果就是错误的。 本帖最后由 bjyfcx 于 2017-11-30 13:43 编辑
在 cs 1000:0 输入一下代码并单步调试执行
mov ax,2000
mov ss,ax
mov sp,10//初始化栈顶,2000:0 ~f为栈空间
//初始化后栈区显示:00 00 00 00 00 00 00 20-00 00 08 00 00 10 A3 01
mov ax,3123
//执行后栈区显示:00 00 00 00 00 00 23 31-00 00 0B 00 00 10 A3 01
push ax
//执行后栈区显示:00 00 00 00 23 31 00 00 -0C00 00 10 A3 01 23 31
mov ax,3366
//执行后栈区显示:00 00 00 00 66 33 00 00 -0F00 00 10 A3 01 23 31
pop ax
//执行后栈区显示:00 00 00 00 66 33 23 31-00 00 10 00 00 10 A3 01 本帖最后由 兰陵月 于 2017-11-30 13:48 编辑
bjyfcx 发表于 2017-11-30 13:31
在 cs 1000:0 输入一下代码并单步调试执行
mov ax,2000
你不用debug的时候,那些稀奇古怪的东西是不会出现的,也就是说,栈的使用是不会受debug影响的。除了调试的时候,一般时候你只是执行程序,所以,除非你程序里面不正当访问栈,否则是不会发生错误的。不要去纠结debug对栈的影响了,除非你要设计一个自己的debug。人的心思总是忍不住好奇,对未知事物充满着兴趣,想当初我对这玩意鼓捣了好久,哈哈! bjyfcx 发表于 2017-11-30 13:31
在 cs 1000:0 输入一下代码并单步调试执行
mov ax,2000
栈中的数据好像蓝色的是不变的,是不是中断产生的数据?粉色的是递增的,不知道啥意思,应该也是中断产生的吧
而且往寄存器中MOV的值怎么也在栈中?左边绿色的值 兰陵月 发表于 2017-11-30 13:05
http://bbs.fishc.com/thread-100283-1-1.html
看看这个帖子,王爽老师书里特别说明了不能用debug单步调试 ...
不能用debug单步调试,那用什么调试,这段链接对我来看有点深,我刚开始学第四章 兰陵月 发表于 2017-11-30 13:47
你不用debug的时候,那些稀奇古怪的东西是不会出现的,也就是说,栈的使用是不会受debug影响的。除了调试 ...
不用debug还能用啥呀,难道这些莫名其妙的数据大家都说不清吗?不会吧? bjyfcx 发表于 2017-11-30 15:39
不用debug还能用啥呀,难道这些莫名其妙的数据大家都说不清吗?不会吧?
自己用脑袋想、用脑袋模拟调试,呵呵,其实很好理解的啊 兰陵月 发表于 2017-11-30 15:42
自己用脑袋想、用脑袋模拟调试,呵呵,其实很好理解的啊
用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致 bjyfcx 发表于 2017-11-30 16:29
用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致
我说的是王爽老师那个题目不能用debug调试,并不是说你这个题目。你这个题目里没有错啊,你压入栈的时候,栈顶指针指着的就是你压入的3123H,debug把自己弄到栈里的数据相应地调了位置,没影响你出栈入栈操作啊。至于debug带进去的是什么,那要看debug里做了什么操作了。你现在去了解这个没有意义啊。 bjyfcx 发表于 2017-11-30 16:29
用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致
你学的是哪本书的哪一页? 兰陵月 发表于 2017-11-30 16:48
你学的是哪本书的哪一页?
第二版的72页。我还想知道这个栈空间里面怎么还有寄存器里面的内容?
兰陵月 发表于 2017-11-30 16:48
你学的是哪本书的哪一页?
因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好像并不像书本中说的那么直接明了,除了数据的入栈出栈,发现还有一些莫名奇妙的数据,比如我上面标注蓝色的数据,还有向寄存器中传送的数据,比如我上面标注绿色的数据,还有粉色的像序号的数据,这么多数据都在这个栈区,并且还都在栈顶上,并且不影响出栈,这我还是第一次发现,书本上可没这么说,就是简单地一个一个垒起来。 bjyfcx 发表于 2017-11-30 19:51
因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好 ...
如果没有debug,实际上就不会有那些数据。看栈的变化,你只要看到最后压入的数据总在栈顶就可以了,要不然,你可以自己编写一个程序,把SP和栈顶的数据显示到屏幕上,这样就不用debug也能观察栈的变化了。 bjyfcx 发表于 2017-11-30 19:51
因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好 ...
老弟,不要再去纠结这些莫名其妙的数据了,你知道它是DEBUG弄出来的就行了,赶快回到C的怀抱去吧,它喊你回家吃饭呢 兰陵月 发表于 2017-12-2 17:10
老弟,不要再去纠结这些莫名其妙的数据了,你知道它是DEBUG弄出来的就行了,赶快回到C的怀抱去吧,它喊你 ...
除了栈初始化后最右边的两个数据,其他数据基本都知道了,这两个数据好像不同系统或机器,都不一样,我的是 A3 01 bjyfcx 发表于 2017-12-2 20:55
除了栈初始化后最右边的两个数据,其他数据基本都知道了,这两个数据好像不同系统或机器,都不一样,我的 ...
那是个机器码或者其他数据。反正搞陀不清
页:
[1]
2