ufo9876 发表于 2016-1-16 19:13:48

如果在程序中突然用到栈,是否需要回去定义一段内存为栈空间


我们前面学习栈的时候,在程序的开始都单独定义一段内存为栈,sp指针指向它的底部,但我看到有些程序一开始并没有定义栈空间,一样用到了push和pop,我想是不是cpu在看到push的时候可以自己临时定义一段内存为栈?

yundi 发表于 2016-1-16 19:13:49

本帖最后由 yundi 于 2016-1-18 13:57 编辑

做题时也想到同样的问题了,然后测试了一下,结果如下:

程序ds:00指向起始位置,cs:00指向入口位置,用户没定义栈的时候,默认(ss)=cs,(sp)=0也指向入口位置.入栈时(sp)=(sp)-2=(0-2)=FFFE,第一个保存的位置是ss:FFFE

ufo9876 发表于 2016-1-17 19:45:05

{:10_250:}{:10_250:}怎么没人回答俺呀

995621097和00 发表于 2016-1-17 22:44:59

我赌5毛你说的是实验10.1的答案里没设栈对吧= =

yundi 发表于 2016-1-17 23:46:19

调试时看ss值,它会告诉你用的栈在哪里。

ryxcaixia 发表于 2016-1-18 08:32:05

push ax
等价于
sub sp, 2
mov ss:, ax

你push的时候 是往栈空间里存数据 sp指针先自减 腾出个空间, 然后把数据 存到栈顶指针里
如果你定义的栈非常小 比如只有16个字节 而此时push的数据已经超过了第16个字节 那么这就是传说中的堆栈溢出了

995621097和00 发表于 2016-1-18 10:38:16

ryxcaixia 发表于 2016-1-18 08:32
push ax
等价于
sub sp, 2


额,我想他应该说的是为何实验10.1的答案中没有定义栈就可以push和pop

995621097和00 发表于 2016-1-18 10:42:51

ufo9876 发表于 2016-1-17 19:45
怎么没人回答俺呀

如果是实验10.1答案那样我想应该放在了是call时cpu自定义的栈里了吧,纯个人见解= =

ufo9876 发表于 2016-1-18 22:54:17

本帖最后由 ufo9876 于 2016-1-21 19:34 编辑


21asaa 发表于 2016-3-17 16:21:42

系统本身有默认的地方放栈的··就是ss:sp,和cs:ip一样。

乍泄1996 发表于 2016-3-24 11:08:25

{:10_256:}{:10_256:}包括call指令等与栈有关的指令使用时其实都不用定义栈空间的哦。。原来是这样
页: [1]
查看完整版本: 如果在程序中突然用到栈,是否需要回去定义一段内存为栈空间