. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
主题 : :  没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了??  [待解决] 回复[ 7次 ]   点击[ 1244次 ]  
240420643
[帖 主] [ 发表时间:2008-04-07 13:34 ] 
荣誉值:0
信誉值:6
注册日期:2008-03-22 09:32
没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了??
leefox
[第7楼] [ 回复时间:2008-06-01 02:02 ] 
荣誉值:0
信誉值:0
注册日期:2008-01-21 11:43
楼主:无论什么时候,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到一定的程度时,就会覆盖原来程序的代码,破坏原程序!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved