请高手也帮忙看一下:
原来的代码是 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 来实现的.