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