为什么2000:0~2000:f中的内容会发生改变?

来源:百度知道 编辑:UC知道 时间:2024/05/31 14:45:22
debug
-a
0b39:0100 mov ax,2000
0b39:0103 mov ss,ax
0b39:0105 mov sp,10
0b39:0108 mov ax,3123
0b39:010b push ax
0b39:010c mov ax,3366
0b39:010f push ax
0b39:0110
-
-e 2000:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-
-d 2000:f
2000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
-
-r
ax=0000 bx=0000 cx=0000 dx=0000 sp=feee bp=0000 si=0000 di=0000
ds=0b39 es=0b39 ss=0b39 cs=0b39 ip=0100 nv up ei pl nz na po nc
0b39:0100 b80020 mov ax,2000
-t

ax=2000 bx=0000 cx=0000 dx=0000 sp=feee bp=0000 si=0000 di=0000
ds=0b39 es=0b39 ss=0b39 cs=0b39 ip=0103 nv up ei pl nz na po nc
0b39:0103 8ED0 mov ss,ax

-t

ax=2000 bx=0000 cx=0000 dx=0000 sp=0010 bp=0000 si=0000 di=0000
ds=0b39 es=0b39 ss=2000 cs=0b39 ip=0108 nv up ei pl nz na po nc
0b39:0103 b82331 mov ax,3123
-d 2000:0 f
2000:0000 00 00 00 00 00 00 00 20-00 00 08 01 39 0b 9d 0

执行mov ss,ax 时其后边的指令将立即被执行[这是MOV SS,**指令特点]。这也是为什么强调mov ss,ax 后边必须跟上mov sp,10的原因。
这么规定是便于控制栈段大小,防止特别是在有子程序调用时出错。
至于这两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。

【注意:】楼上几位关于定义栈段时栈顶内存就有改变的回答不正确。因为此时尚未执行到PUSH等传值类的语句。

1、前三条指令指定了堆栈段的段地址和偏移地址
0b39:0100 mov ax,2000
0b39:0103 mov ss,ax
0b39:0105 mov sp,10
堆栈段地址:2000H
栈顶指针:0010H

2、接下来的四条指令
0b39:0108 mov ax,3123
0b39:010b push ax
0b39:010c mov ax,3366
0b39:010f push ax
分别把两个字数据压入堆栈,相当于,
mov ss:[sp-2],3123h
mov ss:[sp-4],3366h

这样就改变了2000:0~000FH中的内容。

原因在于push指令
push ax
ax 入栈 相当于
mov ax,ss:[sp]
sub sp,2
当然格式是不允许这样的
由于ss:sp是2000:10所以肯定会变