【发布时间】:2014-05-23 21:13:53
【问题描述】:
假设向 8086 发出外部中断请求。处理器将在完成当前正在执行的指令(如果有)后处理中断。在处理中断之前,程序的状态(PSW 标志、寄存器等)也将通过将数据压入堆栈段来保存。
现在,大多数教程/文档都描述了指令指针也被压入堆栈段,这没关系,因为它指向代码段中的下一个指令字节(就在发出中断请求之前)。
但是指令队列会发生什么?处理中断请求时是否也将其推入堆栈段?还是它的内容被清零了?在这种情况下,指令指针是否应该递减,以便可以使其指向代码段中的先前指令(在中断服务之后)?
这里,中断请求后实际上是指中断请求被处理后。该图显示的是,在中断请求到来之前,指令被缓存,IP指向CS内存段中下一个字节指令的地址。为了处理中断请求,寄存器的内容(包括 IP 和标志)被压入堆栈段。服务请求后,之前的内容被加载回来 - IP 仍然指向第 7 个字节的位置(指令),队列(缓存)为空。这就是我的疑问。 IP 是否递减以指向 i1?其次,我们是否需要手动处理 IP(例如,在中断时将其压入堆栈)还是由中断服务例程为我们处理?请,任何帮助表示赞赏,谢谢!
注意:Instruction Queue - 8086 架构有一个六字节的预取指令流水线。由于执行单元正在执行当前指令,总线接口单元会提前从内存中读取多达六个字节的操作码。
【问题讨论】:
-
(推测,不是事实)管道机制是一个实现细节,而不是 ISA 公开的东西。
-
正如@OliCharlesworth 所说。构建“指令队列”(我假设您的意思是下一个处理指令的顺序)发生在硬件级别(使用执行引擎等);因此,当由于中断而更改顺序时,对其进行的任何调整也都是由硬件处理的。作为用户,您通常不知道接下来会发生什么,因此很难/不可能参与其中。
-
中断发生时指令队列失效(所有前瞻执行的指令都回滚)。
-
本 PDF 的第 6 章可能会对您有所帮助:intel.com/content/www/us/en/architecture-and-technology/…
-
@AlexisWilke 谢谢! :) 我正在经历它
标签: assembly interrupt x86-16 interrupt-handling microprocessors