家里穷 发表于 2013-6-19 12:40:53

第三章 寄存器访问 2.2习题

为什么运行后debug中的2000:0~2000:F中的内容会发生改变?
请给个详细的过程 是怎么样发生改变的   

Nedong 发表于 2013-6-19 12:40:54

SS:SP联合指向栈顶,而对它们的设置应该连续完成。如果在执行完设置SS的指令后,CPU响应中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。而SS改变,SP并未改变,SS:SP指向的不是正确的栈顶,将引起错误。

mov ss, 2000后,栈段为2000。为了使程序能正常运行,设置栈顶指针的时候,不能被打断,以免栈顶指针还未设置好,而又产生了入栈或出栈指令,这样可能会破坏数据。
执行 mov sp, 10 时会产生中断。标志寄存器入栈,CS, IP依次入栈。所以 2000:0 ~ 2000:f中值发生改变

zer0 发表于 2013-6-19 13:13:27

你的那个sp栈指针设置为10h了相当于十进制16 ,你push进去的数据都是ax格式就是占2个字节
所以就是e f一个位置 所以f就会改变
栈有一个特性就是push进的数据是从高地址向低地址扩展的!
不是回复过你了吗??
http://bbs.fishc.com/thread-33058-1-1.html
不懂欢迎追问!

家里穷 发表于 2013-6-19 13:26:53

comethat 发表于 2013-6-19 13:13 static/image/common/back.gif
你的那个sp栈指针设置为10h了相当于十进制16 ,你push进去的数据都是ax格式就是占2个字节
所以就是e f一个位 ...

他的前面3个步骤执行后就已经改变了2000:0 f中的值是什么情况
mov ax 2000
mov ss ax
mov sp 10
三个步骤执行完了就已经改变了他的0 f的值   这是为什么   我不是指他push进去改变的值

zer0 发表于 2013-6-19 13:33:57

本帖最后由 comethat 于 2013-6-19 13:35 编辑

家里穷 发表于 2013-6-19 13:26 static/image/common/back.gif
他的前面3个步骤执行后就已经改变了2000:0 f中的值是什么情况
mov ax 2000
mov ss ax

因为在debug使用T等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,你的栈里就有些不是你操作的数据了。

这个问题后面会学到,不过这里也要有个印象,因为如果是在中断过程中压栈是栈越界的话,在windows下的命令窗口会强制关闭的。这个可能在你跟踪一些程序的时候会遇到,到时候有个思考方向。

书上解释的很清楚嘛!等你学到后面了!你就明白了!因为你用 -t命令 一步一步调试肯定会中断的!
ps:感觉现在很多书都是喜欢这样,给你留个问题!让你不知所措,直到你学到了一定的部分,或者等到某天,你突然觉悟了想通了!你就感觉得心应手,非常容易了!

团鱼之徒 发表于 2013-6-19 13:42:57

路过~~顶一下。

在等待 发表于 2013-6-21 21:01:17

同样路过帮忙顶一下~~
页: [1]
查看完整版本: 第三章 寄存器访问 2.2习题