. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  栈空间大小 分配  [待解决] 回复[ 18次 ]   点击[ 531次 ]  
sailyfirm
[帖 主]   [ 发表时间:2009-11-26 12:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-23 10:46
怎么初始化 栈段 空间 大小呢

  3章 说了 栈顶。可这个分配的大小空间 具体有多大呢?

  有点不解。

 希望得到各位的解答 谢谢
scuzg
[第1楼]   [ 回复时间:2009-11-26 23:37 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
一、先说说堆栈的建立
    建立一个堆栈有两项工作要做:
①定义一个名字有堆栈含义的段:
mystack segment stack
        dw 40h dup(?)
mystack ends
   上述语句为这个段分配了80h个字节的空间。特别需要明确的是,这个段现在除了名字似乎和堆栈有点关系外,本质上仅仅是一个普通的段,还没有被用作堆栈。
②在代码段执行了如下代码后:
         mov ax,mystack
        mov ss,ax
        mov sp,80h
    即当ss指向mystack后,该段才被用作堆栈段。
    将sp初始化为80h,即让sp指向堆栈段偏移量为80h的单元,即使sp的初值和被用作堆栈的存储器段所申请的字节数相等,是为了完整地使用段定义开辟的80h个字节空间。仔细分析我们会发现,mystack段定义的80h个字节的偏移量是从0到7fh,那么sp初始化时为什么指向堆栈之外呢?之所以这样是因为数据入栈(如push  ax)时,首先会将sp的内容减2,这时sp就进入了堆栈段的空间范围之内,然后再把一个字的内容送入堆栈。

二、ss、sp和堆栈结构元素的关系
    堆栈似乎有很多和其结构相关的术语,比如堆栈段、堆栈容量、栈底、栈顶等。其实堆栈的这些结构元素都是由ss和sp的初值决定的;
    和其他段一样,ss的内容就是堆栈段的段基址,这应该很明确、容易理解的;
    而sp的初值使得以这个初值为偏移量的以下所有单元都被用作堆栈。举例来说,假设sp的初值是80h,那么从偏移量为0到7fh的80h个字节就被用作堆栈。由此可见,sp的初值和堆栈的容量就是一回事。
    再说说栈底。栈底是这样定义的:堆栈存放第一个字信息的位置就是栈底。显然,存放第一个字信息时就是将sp的初值减2,即栈底的偏移量和sp初值的关系就是:
    栈底的偏移量=sp初值-2
    至于栈顶,第一是很简单:始终就是sp指向的那个字单元,显然会随数据入栈和出栈不断地变化;第二是要能够理解,当sp初始化时,栈顶在栈底之下;当第一次压栈后,栈顶和栈底齐平;其他情况下才会“恢复顶上底下”的“正常”情况。
dushiyufu
[第2楼]   [ 回复时间:2013-07-24 20:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-26 09:12
回复:[第1楼]
------------------
data segment
     dw 9 dup(12666)
data ends
stack segment
     dw 40h dup(0) 
 stack ends 
这时候的sp是怎么算的,是数据段占用的值+栈空间大小=20H+80H=100H ?
zz63948992
[第3楼]   [ 回复时间:2013-08-01 23:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-08-01 17:00
谈谈我的想法:
首先,栈的基址是由SS决定的,而SS肯定是16的倍数;
然后,由SP决定栈顶的位置,其值的范围是0000~FFFF,在初始的时候,SP可以取当中任意一个值,当SP=0000时,这个栈的空间达到最大64KB。当0<SP<=FFFF时,SP越大,说明栈的空间越大,SP越小则栈的空间越小。因为,假设不停的PUSH,使得SP不停的-2,减到最后肯定会接近0000,所以,SP越大,栈空间越大,因为可以减的次数多。解释一下为什么SP=0000时,栈的空间达到最大64KB。因为只有
0000H-0002H=FFFEH;或者这样想,假设这个大小为64KB的栈中有最后一个元素,那么此时SP=FFFE,执行POP,弹出这最后一个元素,则SP需要+2,有FFFE+2=10000,而SP是一个16字节的数,只能表达为0000.
cyberknight
[第4楼]   [ 回复时间:2019-03-08 17:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2019-03-07 08:20
分析的很透彻,学习了
1003286410
[第5楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第6楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第7楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第8楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第9楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第10楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第11楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第12楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第13楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第14楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第15楼]   [ 回复时间:2020-01-28 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
3楼讲的简单明了,特别好
1003286410
[第16楼]   [ 回复时间:2020-01-28 13:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-01-28 11:13
不好意思网速问题...
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved