unicn 发表于 2014-3-23 12:56:03

求助:关于实例程序中的栈操作的问题


大神,我想问下,红圈圈里面的栈操作命令。

示例程序中并没有定义过栈,那么这几个栈命令操作的栈空间是要在调用程序里面定义么,可是调用程序里面没有定义栈,貌似也没问题啊。还有,iret指令进行的也是栈操作,它操作的栈是哪里呢?我们始终没有声明过栈。

麻烦大神能帮忙解答下。

unicn 发表于 2014-3-24 02:10:19

可能大神们都觉得我这个问题过于弱智吧,没有人回答。但是我真的是目前没有相通,为什么没有声明栈,却依然可以用呢,是因为计算机有什么其他约定,还是其他原因。

oggplay 发表于 2014-3-24 19:26:27

本帖最后由 oggplay 于 2014-3-24 19:28 编辑

因为不需要你定义 。8086一个段最大64K ,你给出的小程序堆栈不需要那么大,才2个push指令,占32个字节,所以不需要定义了,当然你也可以自己定义。
另外80386以上更不需要你操心了,寻址空间4G ,你的小程序堆栈就更不需要了

unicn 发表于 2014-3-25 00:50:12

oggplay 发表于 2014-3-24 19:26 static/image/common/back.gif
因为不需要你定义 。8086一个段最大64K ,你给出的小程序堆栈不需要那么大,才2个push指令,占32个字节,所 ...

这位大神,谢谢你。我貌似明白了你的意思。就是说初始化的时候分配的栈段足够大,足够应付这种小程序对栈的要求,哪怕是不自己定义,程序也会按照初始化的栈地址就行工作。我是这么理解的,你应该是这个意思吧。

万分感谢!

kyod 发表于 2014-3-25 02:29:21

oggplay 发表于 2014-3-24 19:26 static/image/common/back.gif
因为不需要你定义 。8086一个段最大64K ,你给出的小程序堆栈不需要那么大,才2个push指令,占32个字节,所 ...

是的,其实栈段,数据段,代码段都是我们自己定义的,计算机根本就不认识。在汇编中,定义数据段,代码段,是为了告诉编译器。其实栈段也可以是数据段,就看你怎么去定义。

oggplay 发表于 2014-3-25 19:04:59

本帖最后由 oggplay 于 2014-3-25 19:21 编辑

unicn 发表于 2014-3-25 00:50 static/image/common/back.gif
这位大神,谢谢你。我貌似明白了你的意思。就是说初始化的时候分配的栈段足够大,足够应付这种小程序对栈 ...
你可以debug一下,程序启动后,ds es ss cs gs fs 都是同一个值(前提是你没自己定义这些段),但是sp的值是指向高地址的(如果不是,赋值高地址给sp。其他指针都在低地址)。只要你的压栈数据不覆盖你的其他数据即可,不要忘了,如果自己不定义这些段,最大段内偏移地址FFFF,最小偏移地址是0。0~FFFF=64K。
最后说一句:定义这些段靠你把握、调试 ,不要 指望 系统。32位系统不用你操心了 ,百度平坦内存模式。      

无名侠 发表于 2014-3-25 20:40:54

有默认的栈:big:big
页: [1]
查看完整版本: 求助:关于实例程序中的栈操作的问题