我想知道从中断(RTI)返回和从子程序(RTS)返回有什么区别。两者是相同的还是两者之间有什么区别?
7 回答
通常从中断返回会恢复标志,以便被中断的代码可以继续正常执行。从子例程返回不需要在该代码流中有意使用该指令,并且知道标志是否被破坏,具体取决于体系结构。在使用堆栈作为返回地址的架构中,这一点非常明显。从中断返回将弹出标志,然后是返回地址,从子程序返回将仅弹出返回地址。
当 x86 上发生硬件中断时,标志和返回代码段+偏移量被压入堆栈。然后中断被禁用。这是为中断例程服务中断设置阶段:在重新启用中断并在/或从中断返回之前处理更多内容之前切换堆栈或它想做的任何事情。iret 指令弹出先前保存的标志(包括最初启用的中断标志)和返回位置,以便被中断的例程可以继续处理。
处理器正在处理中断的事实在 CPU 的状态寄存器中的一个或多个标志中进行标记。
这是需要的,例如屏蔽其他潜在的中断。
为了告诉处理器中断处理结束并且可以重置标志,使用RTI指令而不是RTS。
当然,细节取决于特定的 CPU。
好吧,中断存储在不同的代码段中,因此 RTI 使用远调用调用,而子程序通常与主程序位于同一代码段中,因此它们使用近调用调用。不同之处在于,远调用将段和偏移量作为返回地址推送,而近调用仅推送偏移量。
RET 只会将两个字节弹出到 PC(Addr 低和 Addr 高) RETI 将重置中断启用触发器,并且两个字节将从堆栈中弹出
RET: pop ip ; its "brother" is *near* CALL - to the same segment
RETF: pop ip ; *far* CALL - there's return path of segment and offset on the
pop cs ; stack
IRET: pop ip ; INT - this instruction PUSHes *three* registers on stack:
pop cs ; IP, CS, and FLags
pop fl ; well, in fact as for the stack operation INT is similiar
; to far CALL but with the FL put on the stack
RTE 或 RTI 从堆栈顶部获取最少的上下文,而 RTS 获取返回地址(从堆栈顶部)