. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了??  [待解决] 回复[ 7次 ]   点击[ 1234次 ]  
240420643
[帖 主]   [ 发表时间:2008-04-07 13:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-22 09:32
没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了??
w0922
[第1楼]   [ 回复时间:2008-04-07 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:5
注册日期:2007-11-13 22:57
原有的···ss
wdm
[第2楼]   [ 回复时间:2008-04-08 21:39 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
程序加载后ss有默认值,其与sp构成默认的栈空间。
huige
[第3楼]   [ 回复时间:2008-05-12 13:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-15 23:01
程序加载后ss有默认值,其与sp构成默认的栈空间。
------------------
而且一般情况下,sp=0
也就是默认的栈为64k
onei
[第4楼]   [ 回复时间:2008-05-27 15:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-02-26 16:41
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里的值被覆盖了。那么原程序就被破坏了么???
onei
[第5楼]   [ 回复时间:2008-05-27 15:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-02-26 16:41
实验了一下。MASM成功生生obj文件,但LINK不成功,哈哈报错了。

C:\ASM>masm 1.asm;
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.

      0 Warning Errors
      0 Severe  Errors

C:\ASM>link 1.obj;

Microsoft (R) Overlay Linker  Version 3.60
Copyright (C) Microsoft Corp 1983-1987.  All rights reserved.

LINK : warning L4021: no stack segment
1.OBJ(1.asm) : fatal error L1103: attempt to access data outside segment bounds
 pos: 38 Record type: 8A

C:\ASM>
lanji83
[第6楼]   [ 回复时间:2008-05-28 09:10 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:4
注册日期:2008-05-23 05:44
回楼主:无论什么时候,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的值,那么随着指令的执行,两者只会相距越来越远,因为他们一个是减,一个是加,背道而驰的,那又怎么会破坏原程序呢?
leefox
[第7楼]   [ 回复时间:2008-06-01 02:02 ]   [引用]   [回复]   [ top ] 
荣誉值: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