关于中断的问题
当检测到中断信息的时候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 22:09 编辑
明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了ss,那么新中断会压入新的ss地址,iret也会从新的ss返回。就是说,你改变ss之前他已经返回了,你的命令根本就干涉不了1号内中断的内部命令 莫非在一号中断例程里面会用内存单元来保存修改之前的ss和sp?
比如一号中断例程中有一段代码是这样的:
push ax
push bx
mov [ 随便一个内存单元 ],ss
mov 【随便一个内存单元】,sp
mov ss,ax//要通过单步中断执行的代码//
mov sp,0010//要通过单步中断执行的代码//
感觉也不对,如果这样的话,最后要把之前保存在内存的SS和SP还原出来,然后再iret。。。。。。那ss和sp两个寄存器的值不就没变么- -。。。进死胡同了。。。。:mad: 又有了一种想法,这个比较贴合实际。
假设一号中断例程里面有一个子程序是专门判断类似mov ss,寄存器这样的功能
一出现上述情况,则用内存单元去保存栈中的数据,比如保存栈中标志寄存器,CS和IP的值,之后修改SS
然后再用mov cs,【内存单元】这样的语句去回复cs,ip等寄存器的值,这样不用iret指令也能使CPU重新指向执行中断前的地方。。。。。。。。。。。。。这样想对么? 我觉得你假设的有问题,你具体试验过吗,内中断是系统给你编好的,你怎么知道人家故意要改变栈寄存器的地址,你有时间修改一个内中断,结尾的时候加两句改变ss的命令试试,共同学习下 y290176346 发表于 2015-10-19 21:17
我觉得你假设的有问题,你具体试验过吗,内中断是系统给你编好的,你怎么知道人家故意要改变栈寄存器的地址 ...
不是人家要修改SS是我要修改SS,单步中断也是一号中断,我就纳闷我要是修改了SS寄存器内容后,之前入栈的那些标志寄存器,CS,IP什么的不就找不到了么? 我刚才说过了吗,人家不修改,你为什么要修改,那你确定你修改后会找得到吗?我也是新手,我觉着你问的问题逻辑不对,既然想知道答案我们可以自己修改下试试。 NBeeeeee 发表于 2015-10-19 21:24
不是人家要修改SS是我要修改SS,单步中断也是一号中断,我就纳闷我要是修改了SS寄存器内容后,之前入 ...
我的意思是如果你修改ss后,还能得到原来的csip,那才值得去研究, y290176346 发表于 2015-10-19 21:37
我的意思是如果你修改ss后,还能得到原来的csip,那才值得去研究,
你好好看看我问的啥,我上来就说在debug中
我要用A写指令
第一条指令: mov ax,1000
: mov ss,ax
:mov sp,0010
然后用单步中断执行,执行到第二条的时候,我用这个指令时修改SS寄存器的指令。。。我这样说你要是还觉得我问的问题逻辑有问题的话,那你就觉得有问题吧- -
y290176346 发表于 2015-10-19 22:03
明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了 ...
对对对,你说对了,我之前就是这么想的。。。。只不过我脑子里一直记得是先压栈在进入中断,处理指令,再返回,所以我就吧这个想法给否定了。。。然后我刚才又重新看了看视频,发现了是先执行指令,在压栈,在执行中断程序(也就是显示个寄存器内容) 真是谢谢你跟我一直这么争辩下去了,不是你跟我在这争辩,估计我懒得回去看视频,我也就想破头也想不出来啥问题了。。
y290176346 发表于 2015-10-19 19:58
明白你的意思了,你看我这样想对不对,中断也是一段程序,中断程序执行完了是直接返回的,也就是说你改变了 ...
在指令执行后才进行压栈,执行中断例程,所以不怕回不去
大哥,加个Q,以后有问题一起讨论如何?辩证使人进步:lol:
Q1074677383 问题什么的就打你的论坛昵称! 没事,共同学习。我一个视频都是看三遍以上,一边是理解不了多少东西的,笨鸟先飞
页:
[1]