楼主:无论什么时候,SS都有一个初始值,这个在你每次运行DEBUG的时候可以用-r命令查看
AX=0000 BX=0000 CX=0044 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=14FD ES=14FD SS=150D CS=150D IP=0000 NV UP EI PL NZ NA PO NC
150D:0000 B81115 MOV AX,1511
-u
这是实验五(3)的程序加载后的状态,SS与CS是相同的,SP与IP也是相同的。如果PUSH了数据后也就是说CS:IP里的值被覆盖了。那么原程序就被破坏了么???
------------------
回复:看来4楼这位兄弟还没有对栈机制进行彻底的了解啊,书中3.7节有说过,任意时刻,SS:IP指向栈顶元素,也就是说程序初始化时栈内还没有存入数据,所以不存在修改程序。而PUSH指令入栈,入栈步骤是:1、SP=SP-2,2、向栈中写入数据;PUSH入栈是SP-2,而指令执行是IP+当前执指令所占的内存单元,所以即使是在程序初始化时,SP的值等于IP的值,那么随着指令的执行,两者只会相距越来越远,因为他们一个是减,一个是加,背道而驰的,那又怎么会破坏原程序呢?
------------------
我的理解是:
通过DEBUG加载可知:在程序中如果没有改变SS段地址,SS段是和CS段是相同的,IP和SP也是相同的,都为0,都在同一段内(64K),如果不断的PUSH入栈,SP=SP-2,IP不断增加,两者的相距是越来越近的,当PUSH到一定的程度时,就会覆盖原来程序的代码,破坏原程序! |