标题:入栈的地址问题?
取消只看楼主
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
 问题点数:0 回复次数:10 
入栈的地址问题?

例如:mov ax,2000h
mov ss,ax
mov sp,0 ; 即 栈顶为2000:0
用T 命令调试时会产生中断,为保护现场,CPU将 标志寄存器,CS ,IP 入栈。
1, 那请问它们在哪个地址呢?
因为栈顶为2000:0,入栈后 标志寄存器,CS ,IP 的地址不是应该比2000:0小吗?
为何用 d 2000:fff0 查看得到标志寄存器,CS ,IP 的值呢?
2, 2000:0H 不是可以等价于 1FFF:10H 吗
既然栈顶为2000:0 那可以说栈顶为1FFF:10H 吗?
如果是 那为什么 d 1FFF:00 查看不到标志寄存器,CS ,IP 的值呢

谢谢大家的解答,小的才刚学,见笑了。

[此贴子已经被作者于2007-5-14 18:56:35编辑过]

搜索更多相关主题的帖子: 入栈 寄存器 地址 mov CPU 
2007-05-14 18:55
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 

首先: 谢谢你了。 你先试试这个吧。
debug 的T 命令在执行修改寄存器SS的指令时,下一条指令会紧接着被执行。
例如: mov ax,2000h
mov ss,ax ;你T单步,执行看看,是不是mov sp,10也被自动执行了,看看IP 值吧
mov sp,10
这时你用 d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。
你看看2000:0 f的内容是不是存贮着 标志寄存器,CS ,IP 的值。
这就是中断的一种表现。
我的问题还是那两个。。。。。。。。

还有就是CPU 可以用不同的段地址和偏移地址形成一个物理地址。
2000:0H =20000+0=20000H
1FFF:10H = 1FFF0+10=20000H
你可以查看一下是不是2000:0H 和1FFF:10H 的内容一样。因为都是指向内存地址20000H。
不知道我说的对吗。


2007-05-14 21:42
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
你先试一下吧mov ax,2000h
mov ss,ax ;
mov sp,10
d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。

2007-05-14 21:59
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
回复:(guancracker)入栈的地址问题?
对不起打错了,不要H
你先试一下吧mov ax,2000
mov ss,ax
mov sp,10
d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。

2007-05-14 22:16
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
就是因为
用T 命令调试时会产生中断,为保护现场,CPU将 标志寄存器,CS ,IP 入栈。
2000:0 f的改变内容 就是 标志寄存器,CS ,IP 入栈的值
在 王爽 《汇编语言》这本书的 239页有。我现在的问题就是那两个问题了。


2007-05-14 22:41
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
是这样的 CMD 下DEBUG 调试

a mov ax,2000
mov ss,ax
mov sp,10
T单步执行 mov ax,2000 ;AX的值为2000H
T单步执行 mov ss,ax ;SS的值为2000H ,再看看SP 是不是变成10了。
因为执行mov ss,ax 时mov sp,10被自动执行了。
这时你d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?


2007-05-15 13:18
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
你说的那个 后面的1E-06是指什么 ? 可能是 标志寄存器的值吧。
每台电脑的值都不一样的吧。

像这个
mov ax,2000
mov ss,ax
mov sp,10
是先后把 标志寄存器,CS ,IP 的值 压入 2000:10 地址。
所以用 d 2000:0 f 可以查看到它们的值。

但是像这个
mov ax,2000
mov ss,ax
mov sp,0
先后把 标志寄存器,CS ,IP 的值 压入 2000:0 地址。
为何用d 2000:FFF0 才能查看到它们的值呢?
这就回到了我前面的问题。

2007-05-15 21:38
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 

哦,标志寄存器,CS ,IP 的值 被压入堆栈 应该只有一个地址显示吧
你的那个 d 2000:0 f 查看 是 MOV SP,4 吧
而那个 d 2000:fff0 查看的是 MOV SP,0 吧

你是 CMD 下 先后执行过 MOV SP,4和 MOV SP,0 这两个指令。
当然两个地方都可以查看吧。

你重新来
mov ax,2000
mov ss,ax
mov sp,0

看看是不是只有d 2000:FFF0 才能查到


2007-05-15 22:15
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 
当然了!如果是
mov ax,2000
mov ss,ax
mov sp,4
d 2000:0 f 查看的是 标志寄存器,CS 的值
d 2000:fff0 查看的是 IP 的值
因为 栈顶是 2000:4
先把标志寄存器的值入栈 这时 SP为2
再把CS 的值入栈 这时 SP为0
再把IP 的值 入栈 好像只能存到 2000:fff0
对吧。



2007-05-15 22:27
guancracker
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2007-5-14
得分:0 

谢谢你了啊
现在先不管它了,接着看书先,也许以后会懂。


2007-05-15 22:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-139357-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.560854 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved