assembly 是否可以在不返回调用代码的情况下退出ISR?

guicsvcw  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(138)

我试图在汇编中创建一个中断服务例程,它返回的不是中断被调用的位置,而是一个标签。
我应该直接跳到标签而不使用iret(以及任何其他与中断相关的指令),还是有一个特定的方法来做到这一点?
举例来说:

  1. [org 0x7c00]
  2. ; setting up ISR for int 69h (isr69h is the ISR)
  3. ; (i did it already, and worked fine with IRET, but i dont want to return to the caller)
  4. ; ...
  5. int 69h ; test
  6. ; don't continue code from here
  7. ; some more code...
  8. continue_from_here:
  9. jmp $
  10. isr69h:
  11. ; do something
  12. jmp continue_from_here ; is it enough, or should i place here more code? (for example: restoring FLAGS etc.)
  13. times 510-($-$$) db 0 ; padding
  14. dw 0xAA55 ; boot signature

(我用的是Netwide汇编程序)

lbsnaicq

lbsnaicq1#

当然,没有规则说你必须进行IRET。一旦进入中断处理程序,它就控制了CPU,可以做任何它喜欢的事情。
只是几个提示:

  • 您可能希望清理堆栈,删除返回地址和标志,以及可能被中断的代码使用的任何堆栈数据,这些数据将不会被恢复。您可能希望简单地将堆栈指针重置为堆栈空间的顶部地址,从而有效地清除整个堆栈。
  • 如果这是一个硬件中断,那么CPU在进入处理程序时禁用中断。通常情况下,IRET会在恢复FLAGS时重新启用中断,因此如果您不打算使用IRET,则必须在适当的时候手动STI以重新启用中断。

相关问题