|
主题 : : 书上说:将10000h~1ffffh这段空间当作栈段,初始状态栈是空的,此时ss=1000h SP=? 这句话是不是印刷错误啊 [待解决] |
回复[ 17次 ]
点击[ 866次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-11-28 17:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2010-04-03 11:03 |
|
|
|
|
|
[第1楼]
[ 回复时间:2010-11-28 17:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2010-04-03 11:03 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-11-28 19:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-01 22:23 |
ss是16位寄存器,怎么等于10000H,求解释~~~ sp初始为0,当有一个push指令,sp=fffe,然后递减,所以木有问题。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-12-06 21:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2010-11-18 22:02 |
啊,楼主混淆了吧?SS是栈的段地址,SP是栈的偏移地址,他们都是16位寄存器,最大值FFFF,栈空的话,SP会指向栈底的下一单元,也就是内存物理地址20000h这个单元,但是这个栈的下一单元已经超出栈段了,就返回栈顶10000H,所以SP是0,也可以用老师说的俩种计算角度来讨论的。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-12-16 11:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-16 11:41 |
ss是1000H,楼上上看错了吧…10000H=ss*16+sp | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-01-19 12:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-01 18:29 |
|
|
|
|
|
[第6楼]
[ 回复时间:2011-01-20 01:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-01 18:29 |
这题犹豫了下我选SP=0,栈的下一单元已经超出栈段,超出部分会造成覆盖,最合适的SP值,我选了0,不知道有没可以做实验体现出来 | | |
|
|
|
|
[第7楼]
[ 回复时间:2011-02-16 12:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-15 16:28 |
不是很明白. SS:SP指向的是栈顶. 由SP来定义栈空间. 照书上所说. 为0的话. 是不是说明这个栈空间为0?
既然栈空间为0,数据又怎么能放到栈中.? | | |
|
|
|
|
[第8楼]
[ 回复时间:2011-02-22 14:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-19 19:44 |
SP 为0并不是说空间为0,只是初始化了栈顶。告诉你入栈时从这个位置开始。 | | |
|
|
|
|
[第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,一定不要把段和物理内存搞混了! | | |
|
|
|
|
[第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
这样循环的 | | |
|
|
|
|
[第11楼]
[ 回复时间:2011-08-15 12:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12 |
在第十层回帖错误,确实是20000H处,而不是10000H处,更正下 | | |
|
|
|
|
[第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的栈看做首尾相接的环不就得了? | | |
|
|
|
|
[第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出入栈明显不妥,脱离了王老师的初衷。 | | |
|
|
|
|
[第14楼]
[ 回复时间:2012-04-15 11:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-04-15 10:33 |
总结修改下:栈是人为定义的,所以不要把栈想象成直线连续到底,越界了指针还可以继续往下指,除非你人为把指针指向越界的下一个,比如,问题3.7,那是强制指定初始指针是1000:0010h,和问题3.11的描述明显不同。指针可以在栈指针sp偏移范围内64k空间来回动;楼上那种定义2000:0出入栈明显不妥,脱离了王老师的初衷。 | | |
|
|
|
|
[第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这种地址 | | |
|
|
|
|
[第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了。就是应为溢出才导致这个结果的 | | |
|
|
|
|
[第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,栈顶是可以环绕的,里面的数据被覆盖了。 | | |