. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  书上说:将10000h~1ffffh这段空间当作栈段,初始状态栈是空的,此时ss=1000h SP=? 这句话是不是印刷错误啊  [待解决] 回复[ 17次 ]   点击[ 866次 ]  
ghost2003
[帖 主]   [ 发表时间:2010-11-28 17:36 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2010-04-03 11:03
http://k9jtmq.bay.livefilestore.com/y1pVtrwfmNCqsto5RlmC9dOOZOYncwOxIUVP1urdSH5aM6jA2byghLquLMbys49HzaDZpY36Gi3oysyrZp-F1P-RS4o4Rcompux/%E5%9B%BE4.jpg?psid=1
ghost2003
[第1楼]   [ 回复时间:2010-11-28 17:45 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2010-04-03 11:03
那位能告诉我该这是为什么吗?
515332695
[第2楼]   [ 回复时间:2010-11-28 19:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-01 22:23
ss是16位寄存器,怎么等于10000H,求解释~~~  sp初始为0,当有一个push指令,sp=fffe,然后递减,所以木有问题。
guoqingshun123
[第3楼]   [ 回复时间:2010-12-06 21:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-18 22:02
啊,楼主混淆了吧?SS是栈的段地址,SP是栈的偏移地址,他们都是16位寄存器,最大值FFFF,栈空的话,SP会指向栈底的下一单元,也就是内存物理地址20000h这个单元,但是这个栈的下一单元已经超出栈段了,就返回栈顶10000H,所以SP是0,也可以用老师说的俩种计算角度来讨论的。
yy0000111
[第4楼]   [ 回复时间:2010-12-16 11:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-16 11:41
ss是1000H,楼上上看错了吧…10000H=ss*16+sp
linfeng0928
[第5楼]   [ 回复时间:2011-01-19 12:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-01 18:29
还是不太明白栈的问题,努力学
linfeng0928
[第6楼]   [ 回复时间:2011-01-20 01:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-01 18:29
这题犹豫了下我选SP=0,栈的下一单元已经超出栈段,超出部分会造成覆盖,最合适的SP值,我选了0,不知道有没可以做实验体现出来
binbr
[第7楼]   [ 回复时间:2011-02-16 12:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-15 16:28
不是很明白.  SS:SP指向的是栈顶.  由SP来定义栈空间.  照书上所说. 为0的话. 是不是说明这个栈空间为0?
既然栈空间为0,数据又怎么能放到栈中.?
mmloster
[第8楼]   [ 回复时间:2011-02-22 14:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-19 19:44
SP 为0并不是说空间为0,只是初始化了栈顶。告诉你入栈时从这个位置开始。
dingjianzheng
[第9楼]   [ 回复时间:2011-06-11 11:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-09 16:34
实践是检验真理的唯一标准,你可以用下面的方法来验证:
一般情况下10000H~1FFFFH这段内存中都是0,你将这段内存空间设置为栈:
-r ss
SS 2000
:1000
-r sp
SP FFFE
:0000
-a
1380:010A push ax
-t 执行push ax ,我的ax中是1000H
然后你再用d 1000:fffe ffff查看这两个内存中的内容,原来是00 00现在是00 10,正是push ax的结果
说明什么呢???自己想想吧!
其实,栈顶是可以环绕的,绕到10000H,又绕到1FFFFH的下一个内存单元200000H,一定不要把段和物理内存搞混了!
boble
[第10楼]   [ 回复时间:2011-08-13 07:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12
实践是检验真理的唯一标准,你可以用下面的方法来验证:
一般情况下10000H~1FFFFH这段内存中都是0,你将这段内存空间设置为栈:
-r ss
SS 2000
:1000
-r sp
SP FFFE
:0000
-a
1380:010A push ax
-t 执行push ax ,我的ax中是1000H
然后你再用d 1000:fffe ffff查看这两个内存中的内容,原来是00 00现在是00 10,正是push ax的结果
说明什么呢???自己想想吧!
其实,栈顶是可以环绕的,绕到10000H,又绕到1FFFFH的下一个内存单元200000H,一定不要把段和物理内存搞混了!
------------------
回复:最后这句,又绕到1FFFFH的下一个内存单元20000H,这里应该不是20000H吧?好像是10000H
SP=0的时候,入栈一个因素时SP就应该指向FFFE,即SS:SP=1000:FFFE
这样循环的
boble
[第11楼]   [ 回复时间:2011-08-15 12:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12
在第十层回帖错误,确实是20000H处,而不是10000H处,更正下
haker007
[第12楼]   [ 回复时间:2011-09-09 17:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-10 12:45
100000H-1FFFFH 这段栈空间,当空栈时候是sp=0,栈顶指向1000:0,当压入一个字单元过程中,栈顶从1000:0 指向2000:0 紧接着 指向1000:fffe ,就是所谓的环绕过程是吧?
那直接理解成当栈空间最大化的时候即利用64k空间作为栈,那么直接将这个64k的栈看做首尾相接的环不就得了?
pandas12
[第13楼]   [ 回复时间:2012-04-15 10:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-15 10:33
楼上的验证和猜测都是错误的,应该这么验证,重启debug,进入后首先
-e 1000:fffe //回车
1000:fffe 00.12 00.34 //这里是给栈只放一个元素,2次空格之后赋值,回车
1000:0000 00. //继续回车,不管他
-d 1000:fff0 //回车,查看这一段栈
1000:fff0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 12 34 //可以看出,这个栈只有一个元素,
-r ss //改变栈顶段地址
ss 0b4f //每个人机子不一样,不管他
:1000 //段地址1000
-r sp //改变栈顶偏移地址
sp ffee //每个人机子不一样,不管他
:fffe  //偏移地址fffe 现在指向栈顶1000:fffe
-a //写指令
0B4F:0100 pop ax //每个人指令地址不一样,别去管他,ax内容不管他,这是出栈,为3412
0B4F:0101 push ax// 入栈一次,看看指针变化
0B4F:0102 //回车,这里指令还没执行
-t //执行出栈指令,注意观察ss sp的变化 你会发现ss=1000,sp= 0000!!这说明什么,他指向了1000:0
-t //执行入栈指令。SS= 1000, SP=FFFE   !!!ok这里说明了入栈之后指针立刻指向了1000:FFFE而不是所谓的指向2000:0再指向1000:fffe debug体现不出来这种猜测。

总结,栈是人为定义的,所以不要把栈想象成直线连续到底,指针可以在栈指针sp偏移范围内64k空间来回动;楼上那种定义2000:0出入栈明显不妥,脱离了王老师的初衷。
pandas12
[第14楼]   [ 回复时间:2012-04-15 11:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-15 10:33
总结修改下:栈是人为定义的,所以不要把栈想象成直线连续到底,越界了指针还可以继续往下指,除非你人为把指针指向越界的下一个,比如,问题3.7,那是强制指定初始指针是1000:0010h,和问题3.11的描述明显不同。指针可以在栈指针sp偏移范围内64k空间来回动;楼上那种定义2000:0出入栈明显不妥,脱离了王老师的初衷。
pandas12
[第15楼]   [ 回复时间:2012-04-15 11:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-15 10:33
补充一下,问题3.11是一个sp为0--ffffh的范围,一旦指向pop的下一个就越界了,超过了64k范围,8086好像没有边界检测,但是有趣的事在xp下的debug虚拟8086却把指针指向了1000:0,真实的8086估计就直接溢出了,求解答为啥会出现这种情况?另外,问题3.11之前的哪些问题,明显没有吧0--ffffh用完,自然可以指向如1000:0010H这种地址
myfreedom520
[第16楼]   [ 回复时间:2012-05-01 12:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-30 08:46
回15楼,sp=fffe的时候再pop,sp=fffe+2=1,0000 但sp是16位寄存器,所以sp=0000,ss:sp自然就是1000:0了。就是应为溢出才导致这个结果的
walykyy
[第17楼]   [ 回复时间:2012-06-12 11:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-21 22:36
10000~1FFFFH,楼主可以提取一下,1000:0~FFFF,SS=1000H,SP的地址在0~FFFF(64KB)符合栈的存储条件,SP是16位寄存器,仅当有一个字单元,SP=FFFE,当pop 内存单元,sp=FFFE+2=20000,16位寄存器只能取4个字节所以SP=0H,栈顶是可以环绕的,里面的数据被覆盖了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved