我想知道从中断返回(RTI)和从子程序返回(RTS)之间的区别。这两者是否相同或两者之间有什么区别?
答案 0 :(得分:2)
通常从中断返回会恢复标志,以便中断的代码可以继续正常执行。从子例程返回不需要执行该指令有意地在该代码流中使用,并且已知根据体系结构标记是否被销毁。在使用堆栈作为返回地址的体系结构中,这是非常明显的。从中断返回将弹出标志然后返回返回地址,其中子程序的返回将仅弹出返回地址。
答案 1 :(得分:2)
当x86上发生硬件中断时,标志和返回代码段+偏移被压入堆栈。然后禁用中断。这是设置中断例程服务中断的阶段:在重新启用中断之前切换堆栈或任何它想要做的事情,并在中断之前/或从中断返回更多处理。 iret指令弹出先前保存的标志(包括最初启用的中断标志)和返回位置,以便被中断的例程可以继续处理。
答案 2 :(得分:1)
处理器正在处理中断的事实被标记在CPU的状态寄存器中的一个或多个标志中。
这是必要的,例如掩盖其他潜在的中断。
为了告诉处理器中断处理已经结束且标志可以复位,使用RTI指令而不仅仅是RTS。
当然,细节取决于特定的CPU。
答案 3 :(得分:1)
好吧,中断存储在不同的代码段中,因此使用远程调用调用RTI,而子程序通常与主程序保持在同一代码段中,因此它们被调用接近电话。区别在于远程调用将段和偏移量作为返回地址推送,而近调用仅推送偏移量。
答案 4 :(得分:1)
RET只会将两个字节弹出到PC(Addr low和Addr High) RETI将复位中断使能触发器,并且将从堆栈中取出两个字节
答案 5 :(得分: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
答案 6 :(得分:0)
RTE 或 RTI 从栈顶获取最少的上下文,而 RTS 从栈顶获取返回地址