NBeeeeee 发表于 2015-10-19 19:58:10

关于中断的问题

当检测到中断信息的时候
1.取得中断类型码
2,标志寄存器,TF,IF设置为0
3、CS,ip如栈
4,设置cs ip 指向中断例程

如果在debug中运用单步中断t   假设上一条指令时mov ss,ax    movsp,0010
再用T执行他的时候,过程是怎样的?   我知道iret是返回去的指令,但SS和SP改变了,是怎么返回去的?


妈蛋刚才手残,点错了,重发一贴

y290176346 发表于 2015-10-19 19:58:11

本帖最后由 y290176346 于 2015-10-19 22:09 编辑

明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了ss,那么新中断会压入新的ss地址,iret也会从新的ss返回。就是说,你改变ss之前他已经返回了,你的命令根本就干涉不了1号内中断的内部命令

NBeeeeee 发表于 2015-10-19 20:26:53

莫非在一号中断例程里面会用内存单元来保存修改之前的ss和sp?
比如一号中断例程中有一段代码是这样的:
push ax
push bx
mov [ 随便一个内存单元 ],ss
mov 【随便一个内存单元】,sp
mov ss,ax//要通过单步中断执行的代码//
mov sp,0010//要通过单步中断执行的代码//

NBeeeeee 发表于 2015-10-19 20:30:01

感觉也不对,如果这样的话,最后要把之前保存在内存的SS和SP还原出来,然后再iret。。。。。。那ss和sp两个寄存器的值不就没变么- -。。。进死胡同了。。。。:mad:

NBeeeeee 发表于 2015-10-19 20:52:37

又有了一种想法,这个比较贴合实际。
假设一号中断例程里面有一个子程序是专门判断类似mov ss,寄存器这样的功能
一出现上述情况,则用内存单元去保存栈中的数据,比如保存栈中标志寄存器,CS和IP的值,之后修改SS
然后再用mov cs,【内存单元】这样的语句去回复cs,ip等寄存器的值,这样不用iret指令也能使CPU重新指向执行中断前的地方。。。。。。。。。。。。。这样想对么?

y290176346 发表于 2015-10-19 21:17:47

我觉得你假设的有问题,你具体试验过吗,内中断是系统给你编好的,你怎么知道人家故意要改变栈寄存器的地址,你有时间修改一个内中断,结尾的时候加两句改变ss的命令试试,共同学习下

NBeeeeee 发表于 2015-10-19 21:24:17

y290176346 发表于 2015-10-19 21:17
我觉得你假设的有问题,你具体试验过吗,内中断是系统给你编好的,你怎么知道人家故意要改变栈寄存器的地址 ...

不是人家要修改SS是我要修改SS,单步中断也是一号中断,我就纳闷我要是修改了SS寄存器内容后,之前入栈的那些标志寄存器,CS,IP什么的不就找不到了么?

y290176346 发表于 2015-10-19 21:34:05

我刚才说过了吗,人家不修改,你为什么要修改,那你确定你修改后会找得到吗?我也是新手,我觉着你问的问题逻辑不对,既然想知道答案我们可以自己修改下试试。

y290176346 发表于 2015-10-19 21:37:06

NBeeeeee 发表于 2015-10-19 21:24
不是人家要修改SS是我要修改SS,单步中断也是一号中断,我就纳闷我要是修改了SS寄存器内容后,之前入 ...

我的意思是如果你修改ss后,还能得到原来的csip,那才值得去研究,

NBeeeeee 发表于 2015-10-19 21:47:14

y290176346 发表于 2015-10-19 21:37
我的意思是如果你修改ss后,还能得到原来的csip,那才值得去研究,

你好好看看我问的啥,我上来就说在debug中
我要用A写指令

第一条指令: mov ax,1000
               : mov ss,ax
               :mov sp,0010
然后用单步中断执行,执行到第二条的时候,我用这个指令时修改SS寄存器的指令。。。我这样说你要是还觉得我问的问题逻辑有问题的话,那你就觉得有问题吧- -

NBeeeeee 发表于 2015-10-19 22:19:21

y290176346 发表于 2015-10-19 22:03
明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了 ...

对对对,你说对了,我之前就是这么想的。。。。只不过我脑子里一直记得是先压栈在进入中断,处理指令,再返回,所以我就吧这个想法给否定了。。。然后我刚才又重新看了看视频,发现了是先执行指令,在压栈,在执行中断程序(也就是显示个寄存器内容)                               真是谢谢你跟我一直这么争辩下去了,不是你跟我在这争辩,估计我懒得回去看视频,我也就想破头也想不出来啥问题了。。

NBeeeeee 发表于 2015-10-19 22:22:53

y290176346 发表于 2015-10-19 19:58
明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了 ...

在指令执行后才进行压栈,执行中断例程,所以不怕回不去

大哥,加个Q,以后有问题一起讨论如何?辩证使人进步:lol:
Q1074677383   问题什么的就打你的论坛昵称!

y290176346 发表于 2015-10-19 22:23:19

没事,共同学习。我一个视频都是看三遍以上,一边是理解不了多少东西的,笨鸟先飞
页: [1]
查看完整版本: 关于中断的问题