|
主题 : : 没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了?? [待解决] |
回复[ 7次 ]
点击[ 1234次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-04-07 13:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-22 09:32 |
没有定义ss的段地址,直接用push,是不是自动就分配ss的段地址了?? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-04-07 13:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:5
注册日期:2007-11-13 22:57 |
|
|
|
|
|
[第2楼]
[ 回复时间:2008-04-08 21:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
程序加载后ss有默认值,其与sp构成默认的栈空间。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-05-12 13:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-15 23:01 |
程序加载后ss有默认值,其与sp构成默认的栈空间。
------------------
而且一般情况下,sp=0
也就是默认的栈为64k | | |
|
|
|
|
[第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里的值被覆盖了。那么原程序就被破坏了么??? | | |
|
|
|
|
[第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> | | |
|
|
|
|
[第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的值,那么随着指令的执行,两者只会相距越来越远,因为他们一个是减,一个是加,背道而驰的,那又怎么会破坏原程序呢? | | |
|
|
|
|
[第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到一定的程度时,就会覆盖原来程序的代码,破坏原程序! | | |