首页
社区
课程
招聘
[旧帖] 汇编里栈空间是不是没有规定大小的,我们SP指向哪,哪就是栈顶 0.00雪花
发表于: 2012-3-2 23:48 12589

[旧帖] 汇编里栈空间是不是没有规定大小的,我们SP指向哪,哪就是栈顶 0.00雪花

2012-3-2 23:48
12589
今天一直在看王爽汇编里讲栈的问题,有一些概念很模糊。
我想问一下,栈空间是怎么来的,他是程序启动后,就自动分配一个固定大小栈空间吗?

还是我们用PUSH的时候,SP指向的就是栈顶,PUSH的时候,就一直往低处覆盖数据,没有固定栈空间大小?

我们用PUSH的时候,CPU就自动分配一段空数据的内存单元给你当栈空间?下次又PUS的时候,他又接着在上一个PUSH的地方接着SP-2的地方写入数据?那如果我们修改SP的时候,又是在另一个内存单元又当栈空间?不用接着前面的继续PUSH?
如果栈是随着PUSH自动增加栈空间大小的,那栈就没有固定大小,又怎么会溢出呢

我才学汇编没几天,还在学基础的低层知识,麻烦大家给我一个正确的栈空间的正确思路

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
栈空间是怎么来的,他是程序启动后,就自动分配一个固定大小栈空间吗?

注意学会使用 segment ,栈段是你自己分配的,兄弟看书不认真。回头再复习一下
2012-3-3 08:44
0
雪    币: 71
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
王爽老师讲解的8086CPU,SS,SP都是16bit 的寄存器,那就是一个固定值。所以8086CPU栈的寻址范围为:0000~FFFF(FFFF转换成二进制,64KB)

示例:8086CPU加电启动或复位后,CS和IP指向的值为,CS=FFFFH,IP=0000。当我们把SS:SP分别指向CS和IP后,那么SS=CS=FFFFH,SP=IP=0000H,SS:SP从内存FFFF:0000开始指向的栈空间范围为:FFFF:0000~FFFF:FFFF 。当SS:SP指向FFFF:FFFF时,SS=FFFF,SP=FFFE,因栈操作都是以字为单位的。):

注:栈不存放于CPU中,CPU中的寄存器(SS:SP)指向内存一段空间构成了栈。
不知道我上面说明白了木有?呵呵~~
2012-3-3 09:03
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在实模式下栈是自己分配的空间。
而在XP保护模式下 是系统设定好的。
想改也改不了的·
2012-3-3 20:57
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
说保护模式中栈变不了的也不对。实际上是有一个默认栈为你保留好了连续的地址并为你提交了两页内存。你仍然可以自己申请内存并自行改变esp的
2012-3-7 03:58
0
雪    币: 139
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
一同学习学习
2012-3-10 00:15
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
编译的时候就确定了栈的大小,VC默认是2MB吧,然后运行时操作系统会分配PE文件里指定大小的栈空间,将栈顶地址保存到ESP中。不断的用的话,ESP越来越小,栈空间可能会越来越少,所以递归过多会爆栈,实际上就是ESP超过栈空间下界了,下面可能是代码或者其他数据或者不可写的,甚至压根就没有分配空间,写入就会内存错误。栈空间不够用可以运行时动态调整的,也可以编译时指定一个更大的栈大小,一般来说2MB是足够用的。理论上来说ESP可以被手动修改指到其他任何地方,只要那块内存可以写入数据就可以,当然要小心破坏掉其他数据或者代码,另外要小心你修改了ESP不改回去很可能导致函数无法返回,最后程序没法正常退出之类的问题。
还有问题可以继续问我,我自己写过代码实现最基本的操作系统功能,因此还算清楚。
2012-4-14 22:26
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
无论是实模式,还是虚拟86模式,操作系统会在程序加载好后为它分配一个64k的内存做栈,也就是说,当程序刚执行时,Ss:sp指向那个系统分配的栈。
2012-4-15 07:23
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
64KB内存足够你使用了。
2012-4-15 09:18
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
在win xp下是PE头指定的,默认貌似是64K吧,反正分配是在线程启动时正式分配的。
2012-4-23 04:36
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
当你一个程序启动,都会给你分配一个2G的栈空间,足够你使用的。程序自己占了0到100M的栈空间,然后你说我要用函数A,需要100M的空间,然后程序就给函数A分了100M到200M的内存空间给A,如果A说要用B,则在此基础上继续分配,然后B和A都用完了,他们所占用的空间就都归还了,则如果C出来要空间的话,程序会继续从100M的位置开始分配,okay?你kx好多啊咋弄的?
2012-4-23 09:42
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
世间本无栈,ESP指向哪里 哪里便为栈了...
2012-4-23 10:36
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
在windows里,堆栈是线程启动时分配的,大小由PE头指定,一般高级语言都默认是64K
2012-4-25 12:46
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
默认是16KB
2012-4-25 12:47
0
雪    币: 2993
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
栈空间原则上是要用segment自己定义的,但是如果你运行的是一个很小的程序,在x86的机器上即使不定义,系统也会自动分配给你一个小的栈(我印象中是16KB大小)。教材上的例子大部分只有几十行,所以程序很小,即使不定义栈,系统分配的也够用了。

如果自己在写的时候,建议分配一个足够大的,因为现在空间的成本很低,分配小了万一溢出得不偿失。
2012-4-25 12:53
0
游客
登录 | 注册 方可回帖
返回
//