📜  从子程序返回和从中断返回

📅  最后修改于: 2022-05-13 01:57:01.522000             🧑  作者: Mango

从子程序返回和从中断返回

在本文中,我们将讨论从子程序返回和从中断返回,并将详细解释,最后以从子程序返回和从中断返回的区别作为总结。让我们一一讨论。

从子程序返回:

  • 从子例程返回是将代码的执行返回到调用子例程之前的位置。
  • 通常一个子程序由'CALL '指令调用。在每条 CALL 指令处,将下一条指令的 IP 和 CS 压入堆栈,然后将控制权转移到过程。在程序结束时必须执行“RET”指令。
  • RET 用于从先前由 CALL 调用的子程序返回。当它被执行时,如果IP和CS被检索到CS,IP寄存器从堆栈和主程序的执行进一步继续执行之前存储的内容。
  • 因此,调用子程序会将当前地址 PC+2 压入堆栈。从子例程返回将在堆栈的最高两个字节计算的地址处返回执行。
  • 最高有效字节首先从堆栈中弹出,然后是最低有效字节。 RET 的地址从堆栈中加载。 RET 执行后,堆栈和它的指针会相应修改。

从中断返回:

  • 从中断返回是将代码执行返回到中断发生之前的位置,同时将标志保存到标志寄存器中。
  • 通常当中断发生时,t 通过调用其各自的服务程序来处理。当要调用中断服务程序时,在将控制权转移给它之前,IP、CS 和标志被存储到堆栈中,以指示在中断服务程序 ( ISR ) 完成后继续执行的位置执行。因此,在 ISR 结束时,执行“IRET ”,从堆栈中检索 IP、CS 和标志的值以继续执行主程序。
  • IRET 或RETI用于从 ISR 返回。它首先从堆栈中加载标志并恢复其先前的值,即它启用标志中断。从堆栈加载标志后,它将 CS、IP 值从堆栈加载到寄存器中,并继续执行主程序。分别使用“PUSHF”“POPF”指令将标志压入堆栈和从堆栈中弹出。 IRET 地址从堆栈中加载并启用全局中断标志。在IRET被执行后,栈和它的指针都会被相应地修改。

从子程序返回和从中断返回的区别:

  1. IRET 指令用于退出中断程序,RET 指令用于从子程序返回。
  2. IRET 与 RET 类似,只是 RET 只会将两个字节弹出到 PC,而 IRET 将重置中断启用 ( IEN ) 触发器,并且将从堆栈中弹出两个字节。
  3. 为了告诉处理器中断处理已经结束并且可以复位标志,使用 IRET 指令而不是仅仅使用 RET。
  4. 如果 IRET 在 ISR 之外执行,则其功能与 RET 相同。