7

我想知道从中断(RTI)返回和从子程序(RTS)返回有什么区别。两者是相同的还是两者之间有什么区别?

4

7 回答 7

4

通常从中断返回会恢复标志,以便被中断的代码可以继续正常执行。从子例程返回不需要在该代码流中有意使用该指令,并且知道标志是否被破坏,具体取决于体系结构。在使用堆栈作为返回地址的架构中,这一点非常明显。从中断返回将弹出标志,然后是返回地址,从子程序返回将仅弹出返回地址。

于 2011-03-11T14:40:44.587 回答
3

当 x86 上发生硬件中断时,标志和返回代码段+偏移量被压入堆栈。然后中断被禁用。这是为中断例程服务中断设置阶段:在重新启用中断并在/或从中断返回之前处理更多内容之前切换堆栈或它想做的任何事情。iret 指令弹出先前保存的标志(包括最初启用的中断标志)和返回位置,以便被中断的例程可以继续处理。

于 2011-03-11T21:20:00.037 回答
1

处理器正在处理中断的事实在 CPU 的状态寄存器中的一个或多个标志中进行标记。

这是需要的,例如屏蔽其他潜在的中断。

为了告诉处理器中断处理结束并且可以重置标志,使用RTI指令而不是RTS。

当然,细节取决于特定的 CPU。

于 2011-03-11T10:25:57.150 回答
1

好吧,中断存储在不同的代码段中,因此 RTI 使用远调用调用,而子程序通常与主程序位于同一代码段中,因此它们使用近调用调用。不同之处在于,远调用将段和偏移量作为返回地址推送,而近调用仅推送偏移量。

于 2011-03-11T13:46:22.397 回答
1

RET 只会将两个字节弹出到 PC(Addr 低和 Addr 高) RETI 将重置中断启用触发器,并且两个字节将从堆栈中弹出

于 2011-04-19T19:07:14.657 回答
0
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 
于 2018-03-19T09:47:42.877 回答
0

RTE 或 RTI 从堆栈顶部获取最少的上下文,而 RTS 获取返回地址(从堆栈顶部)

于 2021-01-08T08:56:31.783 回答