刚发错地方了。。。org!
很多人都分析过实验二了,但一来他们都用了复杂的操作来表示简单的问题,二来也不是每个人有耐心看他们长篇大论的所以 我这里出个傻瓜版 包看,包懂,包理解!
OK
首先我打开debug手动设置 ss为2000H,sp为10H 然后我d ss:0结果如下
2000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
大家看这个栈是空的啊
之后我手动设置 cs=1234H,ip=99 H然后我用a cs:99 键入mov ax,0000,先不运行我们在看下 ss:0
2000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
大家看这个栈依然是空的啊
ok
最后 我轻轻的键入了T然后回车 我们再看下ss:0
2000:0000 00 00 00 00 00 00 00 00-00 00 9C 00 34 12 82 06
我解释下 0682 你们现在不用理会他 他是标志寄存器 psw的值
1234 很明显是 cs地址了
009c 保存是的ip地址关于 009c怎么来的请看下面
-u cs:99
1234:0099 B80000 MOV AX,0000
1234:009C 0000 ADD [BX+SI],AL
看到了吧 009c是 mov ax,000后下一条指令的偏移地址
那么究竟发生了什么呢?你按T的时候 产生了中断信息,所以cpu在运行完当前指令后立即产生中断,
(cpu ip指向的是下条指令) 由于中断, 为了保护现场 cpu用栈 来把 psw,cs,ip
分别送入栈中(注意是有顺序的),然后 跳转到 中断处理程序
所以我们看到 这个栈内 他保存了 原先的一些信息,以便于中断处理完成后能根据这些信息继续执行下面的指令
具体一些复杂的地方这里就不说了 用王爽老师的话说 这叫知识屏蔽 会分散大家注意力的! |