CSDN-Ada助手 2023-07-09 12:16 采纳率: 1.6%
浏览 12

int16中断时IF=1,会导致其他的中断程序修改ax寄存器吗?

该问题来自社区帖: https://bbs.csdn.net/topics/616534641.

背景:

王爽汇编语言 检测点17.1,int16中断时一定是IF=1,否则缓冲区为空时,无法接收到键盘输入.

 

那么既然IF=1,我就设想是否有可能键盘输入的值置到AX后,其他的中断调用将AX修改了.

是否可能存在这种情况?如果是,那么如何避免呢?

  • 写回答

1条回答 默认 最新

  • IT论之程序员 2023-07-10 16:02
    关注

    中断服务例程在执行时,会先保存当前的标志寄存器和通用寄存器的值,然后在结束时恢复这些寄存器的值。
    所以在int16中断服务例程执行期间,即使IF=1允许其他中断发生,其他中断服务例程也不会修改int16中断服务例程中使用的寄存器,包括AX寄存器。
    int16中断结束后,会先从栈中恢复原来的标志寄存器值,然后再恢复AX等通用寄存器的值。所以可以确保int16中断服务例程不会受到其他中断的影响。
    具体来说,中断服务例程的执行步骤是:

    1. 将标志寄存器的值PUSH进栈
    2. 将所有通用寄存器的值PUSH进栈,保存现场
    3. 执行中断服务程序
    4. 恢复通用寄存器的值通过POP栈
    5. 恢复标志寄存器的值通过POP栈
    6. 通过IRET指令完成中断返回
      在这整个过程中,通过PUSH和POP保证了中断前后的寄存器环境不变,所以不需要担心其他中断会修改当前中断使用的寄存器。
      所以整体来说,在int16中断服务例程执行过程中,允许其他中断发生不会对其执行流程产生影响。
    评论

报告相同问题?

问题事件

  • 创建了问题 7月9日