bjyfcx 发表于 2017-11-30 10:20:54

用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那行有了少量数据:

兰陵月 发表于 2017-11-30 11:35:46

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 执行某条 指令的时候栈里就有东西了。

bjyfcx 发表于 2017-11-30 12:02:13

谢谢,那些中断产生的东西不会影响后面的压栈和出栈吗?

兰陵月 发表于 2017-11-30 13:03:44

一般会的,只要你通过SS:SP访问栈的数据,而不是通过其他方式(比如将栈段的值传送给寄存器DS,然后给个偏移去访问。),一般不会出现错误。王爽老师书的检测题里有一个这样的题目,http://bbs.fishc.com/thread-100283-1-1.html,这个题目里特别说明了不能用debug单步调试,就是讲的不按规则使用栈,这其实就是早期黑客用的手段。

兰陵月 发表于 2017-11-30 13:05:26

http://bbs.fishc.com/thread-100283-1-1.html
看看这个帖子,王爽老师书里特别说明了不能用debug单步调试,否则结果就是错误的。

bjyfcx 发表于 2017-11-30 13:31:00

本帖最后由 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:47:30

本帖最后由 兰陵月 于 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:56:23

bjyfcx 发表于 2017-11-30 13:31
在 cs 1000:0 输入一下代码并单步调试执行

mov ax,2000


栈中的数据好像蓝色的是不变的,是不是中断产生的数据?粉色的是递增的,不知道啥意思,应该也是中断产生的吧
而且往寄存器中MOV的值怎么也在栈中?左边绿色的值

bjyfcx 发表于 2017-11-30 13:58:11

兰陵月 发表于 2017-11-30 13:05
http://bbs.fishc.com/thread-100283-1-1.html
看看这个帖子,王爽老师书里特别说明了不能用debug单步调试 ...

不能用debug单步调试,那用什么调试,这段链接对我来看有点深,我刚开始学第四章

bjyfcx 发表于 2017-11-30 15:39:19

兰陵月 发表于 2017-11-30 13:47
你不用debug的时候,那些稀奇古怪的东西是不会出现的,也就是说,栈的使用是不会受debug影响的。除了调试 ...

不用debug还能用啥呀,难道这些莫名其妙的数据大家都说不清吗?不会吧?

兰陵月 发表于 2017-11-30 15:42:47

bjyfcx 发表于 2017-11-30 15:39
不用debug还能用啥呀,难道这些莫名其妙的数据大家都说不清吗?不会吧?

自己用脑袋想、用脑袋模拟调试,呵呵,其实很好理解的啊

bjyfcx 发表于 2017-11-30 16:29:53

兰陵月 发表于 2017-11-30 15:42
自己用脑袋想、用脑袋模拟调试,呵呵,其实很好理解的啊

用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致

兰陵月 发表于 2017-11-30 16:45:34

bjyfcx 发表于 2017-11-30 16:29
用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致

我说的是王爽老师那个题目不能用debug调试,并不是说你这个题目。你这个题目里没有错啊,你压入栈的时候,栈顶指针指着的就是你压入的3123H,debug把自己弄到栈里的数据相应地调了位置,没影响你出栈入栈操作啊。至于debug带进去的是什么,那要看debug里做了什么操作了。你现在去了解这个没有意义啊。

兰陵月 发表于 2017-11-30 16:48:20

bjyfcx 发表于 2017-11-30 16:29
用脑袋想,还用debug干嘛,书上不是让用软件测试吗,用软件就是想看看自己想的和软件是否一致

你学的是哪本书的哪一页?

bjyfcx 发表于 2017-11-30 18:31:11

兰陵月 发表于 2017-11-30 16:48
你学的是哪本书的哪一页?

第二版的72页。我还想知道这个栈空间里面怎么还有寄存器里面的内容?

bjyfcx 发表于 2017-11-30 19:51:58

兰陵月 发表于 2017-11-30 16:48
你学的是哪本书的哪一页?

因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好像并不像书本中说的那么直接明了,除了数据的入栈出栈,发现还有一些莫名奇妙的数据,比如我上面标注蓝色的数据,还有向寄存器中传送的数据,比如我上面标注绿色的数据,还有粉色的像序号的数据,这么多数据都在这个栈区,并且还都在栈顶上,并且不影响出栈,这我还是第一次发现,书本上可没这么说,就是简单地一个一个垒起来。

兰陵月 发表于 2017-11-30 20:17:48

bjyfcx 发表于 2017-11-30 19:51
因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好 ...

如果没有debug,实际上就不会有那些数据。看栈的变化,你只要看到最后压入的数据总在栈顶就可以了,要不然,你可以自己编写一个程序,把SP和栈顶的数据显示到屏幕上,这样就不用debug也能观察栈的变化了。

兰陵月 发表于 2017-12-2 17:10:35

bjyfcx 发表于 2017-11-30 19:51
因为学习C,正好研究入栈和出栈,所以就想用debug形象地检测一下入栈和出栈的过程,这才发现入栈和出栈好 ...

老弟,不要再去纠结这些莫名其妙的数据了,你知道它是DEBUG弄出来的就行了,赶快回到C的怀抱去吧,它喊你回家吃饭呢

bjyfcx 发表于 2017-12-2 20:55:13

兰陵月 发表于 2017-12-2 17:10
老弟,不要再去纠结这些莫名其妙的数据了,你知道它是DEBUG弄出来的就行了,赶快回到C的怀抱去吧,它喊你 ...

除了栈初始化后最右边的两个数据,其他数据基本都知道了,这两个数据好像不同系统或机器,都不一样,我的是 A3 01

兰陵月 发表于 2017-12-2 21:06:52

bjyfcx 发表于 2017-12-2 20:55
除了栈初始化后最右边的两个数据,其他数据基本都知道了,这两个数据好像不同系统或机器,都不一样,我的 ...

那是个机器码或者其他数据。反正搞陀不清
页: [1] 2
查看完整版本: 用debug查看栈顶初始化中都发生了什么,它们到底是什么?