gpt4 book ai didi

assembly - 8086 中的中断、指令指针和指令队列

转载 作者:行者123 更新时间:2023-12-01 12:41:46 25 4
gpt4 key购买 nike

假设向 8086 发出外部中断请求。处理器将在完成当前正在执行的指令(如果有)后处理中断。在处理中断之前,还将通过将数据压入堆栈段来保存程序的状态(PSW 标志、寄存器等)。

现在,大多数教程/文档都描述指令指针也被压入堆栈段,这没关系,因为它指向代码段中指令的下一个字节(就在发出中断请求之前)。

但是指令队列会发生什么?在处理中断请求时是否也被压入堆栈段?还是它的内容被清零了?在这种情况下,指令指针是否应该递减以便可以使其指向代码段中的先前指令(在中断服务之后)?

IP pushed onto the stack

这里,After interrupt request实际上是指After interrupt request has been served。这张图显示的是在中断请求到来之前,指令被缓存起来,IP指向CS内存段中下一条指令的地址。为了响应中断请求,寄存器的内容(包括 IP 和标志)被压入堆栈段。服务请求后,之前的内容被加载回来 - IP 仍然指向第 7 个字节的位置(指令),队列(缓存)为空。这就是我的疑惑。 IP 是否递减以指向 i1?其次,我们是否需要手动处理 IP(例如,在中断时将其压入堆栈)还是由中断服务例程为我们处理?请提供任何帮助,谢谢!


备注:Instruction Queue - 8086 架构有一个六字节的预取指令流水线。当执行单元正在执行当前指令时,总线接口(interface)单元会预先从内存中读取最多六个字节的操作码。

最佳答案

您对“指令队列”的含义不是很清楚。

一个意思可能是“预取指令”。在实践中,处理器已经从最后一个完成指令开始在指令流中进行推测性预读,根据各种类型的分支预测算法是否遵循分支。由于这些是读取,如果处理器决定放弃当前指令“流”以换取另一个指令(例如,中断例程),它只会忽略其预读。

另一个含义可能是“部分执行的指令(在飞行中/在‘管道’中)”,这在超标量 CPU 中经常发生。在异步中断的情况下,处理器必须完成那些影响系统可见状态的指令(例如,已提交对寄存器或内存的写入),并且可能会或可能不会完成其他指令,具体取决于处理器的突发奇想特定处理器的设计者。在同步陷阱的情况下,处理器必须完成影响状态的指令,但简单地放弃其余指令(OP 的短语是“将队列清零”,其概念正确但措辞错误)。

[应 OP 的要求添加我发表的评论]:你说 8086 有一个 6 字节预取“指令流水线”(不好的术语恕我直言)。可能有一个具有该属性,但这是实现的细节,没有充分的理由相信这是所有 8086 的属性。对于现代 CPU,指令预取的实现方式完全取决于设计者的聪明才智。您几乎可以合理预测的是会有一些预取方案,并且您很难检测到它在您的应用程序中的存在,除了对性能的影响和关于自修改代码的有趣规则。

[回答OP的第二个问题]:其次,我们是否需要手动处理 IP(例如,在中断时将其压入堆栈)还是由中断服务程序为我们处理?

对于任何类型的陷阱或中断,存储架构定义的状态(“寄存器”、PC 等)就足够了。对于许多处理器来说,硬件存储架构状态的关键子集就足够了,让中断例程存储(并最终恢复)其余部分。因此,存储整个状态的责任在硬件和软件之间分配(以节省硬件中的实现工作量)。

对于 x86 系列,通常指令指针 (IP) 和标志寄存器由硬件压入当前堆栈,控制转移到中断,中断例程的指令通常将其余寄存器存储在操作系统定义的数据结构,通常称为“上下文 block ”。中断例程完成它的工作,或者通过重新加载寄存器将控制权返回给应用程序,然后使用特殊的 IRET 指令重新加载 IP 和标志,或者将控制权转移到选择运行其他事件的 OS 调度程序,最终使用保存的上下文 block 内容重新启动应用程序。

真正快速中断例程可能只保存足够的寄存器来完成其关键工作,然后在返回到被中断者之前恢复这些寄存器。

关于assembly - 8086 中的中断、指令指针和指令队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23838410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com