. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  当SS:SP遇到64KB栈段?  [待解决] 回复[ 16次 ]   点击[ 1025次 ]  
ghost2003
[帖 主]   [ 发表时间:2010-04-26 10:27 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2010-04-03 11:03
书上原文:
如果将10000h~1ffffh这个短的空间当做栈段(64kb),初始状态栈是空的。栈的底部内存单元地址为 1000:fffe
这个“1000:fffe”是怎么来的?
我只知道 如果将1000h~100f这个段的控件当做栈来用,初始状态栈是空的,栈的底部内存单元地址为1000:1010
scuzg
[第1楼]   [ 回复时间:2010-04-26 17:44 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
弄清楚栈底的定义就明白了。
    什么是栈底呢?栈底是堆栈存放第一个数据的位置。
    栈底偏移量的值仅仅和SP的初值有关,初始化64K堆栈时SP=0,这个时候堆栈是空的;如果存放第一个数据,按照PUSH指令功能,应该是:
        SP<-SP-2
       (SP)=入栈数据
SP的值由原来的0减去2,就是0fffeh。
static
[第2楼]   [ 回复时间:2010-11-03 14:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12
ss:sp  任意时刻指向栈顶元素
yuprxk
[第3楼]   [ 回复时间:2010-11-03 21:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-10-25 16:06
今天,我也有和楼主相同的疑问,
这个 0-2=fffe 是为什么呢?
当10000h~1000fh为栈时,栈为空,为什么不是(sp=0)呢?
masmaster
[第4楼]   [ 回复时间:2010-11-03 22:19 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
栈底≠栈顶,栈顶是由SP指定的,栈底(栈基址)是由BP指定的。
eaookii
[第5楼]   [ 回复时间:2013-03-23 10:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-16 12:52
刚刚也在困惑这个问题,说了四楼的说法,明白了。
eaookii
[第6楼]   [ 回复时间:2013-03-23 10:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-16 12:52
1楼说得也很好
stop1204
[第7楼]   [ 回复时间:2013-04-23 22:14 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
因为出栈(push)与入栈(pop)的操作都是以字为单位进行的,所以栈中存放的都是字型数据,
字型数据是两个字节 就是2个连续的内存单元 组成一个字单元
正常情况下10000h~1ffffh的底部内存单元: 为 1000:FFFF
但是 栈中的数据是以字为单位的..字单元占2字节   所以用到2个内存单元
 所以底部单元其实就是2个连续内存单元(字单元) 1000:FFFE 与 1000:FFFF

例子2:
初始化空栈 1000:999   ,  栈顶就是1000:99A  →→→ (空栈时,SP=底部单元地址 + 2)
push  入栈时 →→→ SP=SP-2           
  AX=1234 H   push AX
1000:998 = 34 H      1000:999 = 12 H



将 1 - 10 当成一个空间. 是不是也需要在 10处 写入数据呢?
为什么 空栈时 SP要 = 底部单元地址+2 ?  实验一下就知道了:
如果你 SP指向 1000:999        
当push 入栈的时候  ,  SP将会 等于 SP-2  处push 入数据
就是 从1000:997处写入 数据, 而数据只占2个内存单元, 1000:997  1000:998 
那么 1000:999 将入不到数据
benbenfei123
[第8楼]   [ 回复时间:2013-07-15 12:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-07-14 15:44
其实吧,这个问题自己画个示意图。栈为空时,指针指向的是比空间地址大的地方比如1000:ffff为空,那sp应指向2000:0单位,即(sp)=0
doyagu
[第9楼]   [ 回复时间:2014-07-30 01:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-07-30 01:03
栈顶地址1000:FFFEH书上有很好的解释,至于 0H-2H=FFFEH应该是有前提的,我是这样理解的:
 
 FFFEH+2H=10000H

然而8086CPU的每个寄存器只能存放16个字节即八个字(4个十六进制数),由于进位“1”被舍去,所以SP=0
wspylong
[第10楼]   [ 回复时间:2014-11-29 12:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-02 22:20
SP所指向的真实地址该是FFFFH + 1H(或者栈第一个字的地址+2H FFFEH + 2H)
结果真实地址是10000H
倒着想怎么让SP*10H:SS=10000H
SP是1000H
sp*10H:SS=1000H*10H:SS=10000H+SS=10000H
所以SS = 0
ijuslinasm
[第11楼]   [ 回复时间:2016-01-15 07:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2016-01-08 09:56
回复:[第8楼]
------------------
我也是理解为ss=2000H的,可是书上的SS还是1000H。
对于这一点,我也不明白。
random
[第12楼]   [ 回复时间:2017-06-16 13:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-06-16 13:57
回复:[第11楼]
------------------
因为寄存器之间是相互独立的,sp+2后有一个进位1会被舍去,与ss无关。就好像ah和al两个直接不存在al进位加到ah那去。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved