注册 登录
编程论坛 汇编论坛

入栈的地址问题?

guancracker 发布于 2007-05-14 18:55, 2273 次点击

例如: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编辑过]

25 回复
#2
爱以走远2007-05-14 20:29
入栈是保存当前的直 cs ip 是运行时的下一地址 他不能入栈的 也不需要入栈
计算机执行的时候 下一指令都是cs ip 除非遇到call jmp
入栈是在调用子程序的时候 保存当前寄存器的直 因为在子程序里要用到这一 个寄存器
#3
爱以走远2007-05-14 20:31
当然2的个问题就更荒唐拉
你说的那两个不可能相等
前面的是段地址 后面的是偏移地址
2000:0H 在2000这个段
1FFF:10H 在1FFF这个段
怎么可能相等呢
#4
爱以走远2007-05-14 20:32
劝lz先去看看物理地址是由什么组成的
懂得段地址和偏移地址
理解寄存器 什么是做什么的
#5
guancracker2007-05-14 21:42

首先: 谢谢你了。 你先试试这个吧。
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。
不知道我说的对吗。

#6
爱以走远2007-05-14 21:55

我先回答一的个问题 你说的sp是自动执行的 呵呵 当然拉 因为送到堆栈里
sp的直就会自动减一 也就是说 sp一直都是在栈顶
就象水杯里的水一样 sp一直就在水面
ss和sp是连用的 而cs和ip是连用的


#7
爱以走远2007-05-14 21:57
而当然后面的一个问题加起来物理地址还是相等
我在前面说过 他们的段地址都不同
你说他们还是一个存储单元嘛
#8
guancracker2007-05-14 21:59
你先试一下吧mov ax,2000h
mov ss,ax ;
mov sp,10
d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。
#9
爱以走远2007-05-14 22:00
寄存器分为拉几个段 就是为拉物理寻址
不过我才想拉一哈 我也不清楚
感觉好象是不一样的 因为他的确段地址都不同拉
我去给你查查看
#10
爱以走远2007-05-14 22:06
以下是引用guancracker在2007-5-14 21:59:50的发言:
你先试一下吧mov ax,2000h
mov ss,ax ;
mov sp,10
d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。

呵呵 对拉 你还有一个错误
在debug里 默认是16进制哈 不要那个h
你在试试看有没有东西

#11
guancracker2007-05-14 22:16
回复:(guancracker)入栈的地址问题?
对不起打错了,不要H
你先试一下吧mov ax,2000
mov ss,ax
mov sp,10
d 2000:0 f 查看一下,为什么 2000:0 f的内容会改变呀?先想一下。
#12
爱以走远2007-05-14 22:37
这个我也没搞懂  
#13
guancracker2007-05-14 22:41
就是因为
用T 命令调试时会产生中断,为保护现场,CPU将 标志寄存器,CS ,IP 入栈。
2000:0 f的改变内容 就是 标志寄存器,CS ,IP 入栈的值
在 王爽 《汇编语言》这本书的 239页有。我现在的问题就是那两个问题了。

#14
爱以走远2007-05-14 22:45

#15
菜鸟上路2007-05-15 13:07
以下是引用guancracker在2007-5-14 18:55:35的发言:

例如: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 的值呢

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

我不知道T命令会不会产生中断?
1、CS:IP地址跟2000:0没关系
2、我用d 2000:0和d 1fff:0010看到的值都是0
#16
guancracker2007-05-15 13:18
是这样的 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的内容会改变呀?

#17
菜鸟上路2007-05-15 15:12
以下是引用guancracker在2007-5-15 13:18:14的发言:
是这样的 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的内容会改变呀?

确实把CS和IP的值压入的堆栈,但后面的1E-06是指什么呢?

#18
guancracker2007-05-15 21:38
你说的那个 后面的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 才能查看到它们的值呢?
这就回到了我前面的问题。
#19
菜鸟上路2007-05-15 21:54
用 d 2000:0也可以查呀
只有本站会员才能查看附件,请 登录

[此贴子已经被作者于2007-5-15 21:55:44编辑过]

#20
guancracker2007-05-15 22:15

哦,标志寄存器,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 才能查到

#21
guancracker2007-05-15 22:27
当然了!如果是
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
对吧。


#22
菜鸟上路2007-05-15 22:34
以下是引用guancracker在2007-5-15 22:15:51的发言:

哦,标志寄存器,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 才能查到

重新来又全是0哦

#23
菜鸟上路2007-05-15 22:35
以下是引用guancracker在2007-5-15 22:27:44的发言:
当然了!如果是
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
对吧。


#24
guancracker2007-05-15 22:52

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

#25
guancracker2007-05-16 03:12
回复:(guancracker)入栈的地址问题?

找到答案了!以下内容是我转载的。
1
呵呵!玩汇编常犯的毛病,你程序写错了。

改成如下:
mov bx,ss
mov cx,sp
cli
mov ax,2000H
mov ss,ax
mov sp,0
add sp,4
pop ax
mov sp,cx
mov ss,bx
sti

在debug中一定要用go命令执行
g= 0100 0115

再次提醒,修改堆栈一定要谨慎。

当堆栈指针处于非正常状态时,确保不进行堆栈写入操作。
要禁止中断,包括debug的T、P命令,每一次跟踪都会中断目标程序,将当前地址等压栈(ss:sp= 2000:0000 或2000:0004)这里都是dos区或程序区。后继各种各样的死机都是很正常的。

#26
菜鸟上路2007-05-16 12:17
谢了!
1