当前位置: 代码迷 >> 汇编语言 >> 俺也问一下关于修改中断的有关问题
  详细解决方案

俺也问一下关于修改中断的有关问题

热度:4366   发布时间:2013-02-26 00:00:00.0
俺也问一下关于修改中断的问题。
请高手也帮忙看一下:

原来的代码是   int   N   ,表示直接调用该中断。

后来把该中断改掉了,假设原来的中断地址是   IP_O,CS_O,现在改为   IP_N,CS_N

并且把IP_O,CS_O保存到了   CS_N:PPP   的位置。

那么CS_N:IP_N的代码就要如下了:
pushf;首先把标志入栈
...;自定义的操作
CALL   FAR   CS_N:[PPP]

×××××××××××××
以上修改完毕之后,在使用INT   N时,就会先执行自定义的操作。之后再真正执行INT   N的代码。
我想问,在调用INT   N时就会把标志寄存器入栈,那么他的那个pushf还有什么作用呢?
岂不是会造成在INT   N结束时,出栈出粗了???



------解决方案--------------------------------------------------------
那么他的那个pushf还有什么作用呢?

关于这个问题在王爽的汇编语言这本书的第15章有解释:

pushf ;标志寄存器入栈

;下面的代码设置IF = 0, TF = (IF置0,使得在进入中断处理程序后,禁止其他的可屏蔽中断.)

pushf

pop ax

and ah, 11111100b;IF 和TF 为标志寄存器的第9位和第8位

push ax

popf

初学不对之处请原谅
------解决方案--------------------------------------------------------
它这是根据int n的工作原理来编写的,你要模拟int n,首先得标志寄存器入栈啊,也就是pushf,至于popf的工作由谁来做,我也觉得有点疑惑,不过按照设计应该还是由cpu完成的吧。

------解决方案--------------------------------------------------------
在int21后,栈地址减了6,里面应该是cs,ip,fl,而call只压入了cs,ip,但中断返回是iret

如果不压入栈fl,栈就不平衡了,个人理解!!!
------解决方案--------------------------------------------------------
pushf 后再 call 原来的中断, 这个就是模拟的 "int 中断 " 的执行转移过程. int 发生, 会将 Flag 寄存器压栈, 返回的 CS 和 IP 压栈, 以和中断子程结尾的 iret 指令在堆栈操作上的匹对. 如果这里没有 pushf 指令, 那么在中断子程最后的 iret 时, 将栈中的寄存器出栈的话, 就会导致后续的返回地址错乱, 整个执行流程就全乱套了. 所以, pushf 对应的 popf 是有中断子程最后的 iret 来实现的.
  相关解决方案