elite 发表于 2011-12-10 03:05:52

关于栈顶为什么要是高位偏移地址的问题

这两天一直在想一个问题,为什么栈顶要是高位偏移地址,在群里讨论了也没有结果,现在特地来发帖求教。下面我阐述问题:
我在看视频的时候看到第16讲的时候,发现一个问题,就是在进行栈操作时,假设段地址是ss=1000H,
(1)假设
课件中:把栈顶设置为sp=0010H。然后每一次push,sp-2;每一次pop,sp+2;然后栈顶是ss:sp。(想法1)
我现在有另一种想法:是将sp=0000H,然后每次push,sp+2;每次pop,sp-2。然后栈顶也是ss:sp。(想法2)

(2)比较

2.1 )我们接下来看看栈,栈有2个操作 1个特性 ;2个操作是 入栈 出栈 ;特性是 后进先出。上面两种想法都是可行的。

2.2 )接下来我们看看求栈长,我们的一般思路是:栈长=栈顶-栈低;这个也是符合我们的逻辑的,那么看看结果
想法1:栈长求出来是负数。正好是栈长的相反数。
想法2:栈长求出来是正数。
但是这个如果放在数据结构里面:if(push)栈长++;if(pop)栈长--;应该是这样实现,而不是单纯的:栈长=栈顶-栈低。


2.3 )我们再看看push和pop,按照常理,是不是压栈了,栈元素应该增多才是,所以sp应该有增加才是,而出栈pop,栈元素少了,那么应该是sp减少才是。
而第一种想法是:每一次push,sp-2;每一次pop,sp+2;
第二种想法是:每次push,sp+2;每次pop,sp-2。
显然第二种更符合逻辑。

(3)问题
问题来了,为什么第二种想法是错的,计算机没有采取第二种想法而采用第一种?求高人解答,如果说就是这么规定的,那么我无话可说了。


后知淡然 发表于 2011-12-10 10:18:51

我是这样理解的,假设你的第二种方法,SP=0,这是初始栈顶。
可你怎么告诉计算机你申请的栈是多大呢?
再看第一种,SP=10H,计算机就知道这段栈为10H个字节。
纯属个人见解。如有不对之处,请大牛指正!

幸福你懂得_し゛ 发表于 2011-12-10 10:30:49

首先要知道的是,push和pop本身就具有2个操作的含义,一个是移动偏移地址,一个是压/出栈操作,是系统本身就定义好的,我理解你的想法,就是栈的开口朝向问题,现在只不过是微软就是这么定义的,开口是在上面,呵呵,就像生活中的一些事情,有很多解决办法和方向,但是选择了一个,就得按照这个,懂?

kane080824 发表于 2011-12-11 16:19:41

栈指针总是从高地址指向低地址的,push时,指针向低地址移动,pop时,相反,仅仅是规定这样。好比火箭发射都用倒计时,但其实也可用正计时,1,2。。。9,发射

ever.g 发表于 2011-12-11 21:15:33

:loveliness: 不爽的话,以后LZ自己设计个!

回到过去 发表于 2011-12-12 14:49:51

貌似操作(1)和操作(2)在逻辑上还有一点区别,操作(1)在进行push操作的时候,先是使sp=sp-2,然后复制数据进栈;而操作(2)是先复制数据进栈,然后再sp=sp+2;这样才能符合intel处理器的小端法存数。
我在想,这种逻辑上得差别是不是CPU内部的硬件设置的原因,所以归根来说应该还是一个规定的问题吧~~
还有一个就是甲鱼老师在视频里面一直强调的 CPU只懂得ss:sp在哪里,它不管栈有多长,所以逻辑上去理解栈的概念,也是靠程序员自己的吧~~
页: [1]
查看完整版本: 关于栈顶为什么要是高位偏移地址的问题