可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?相关的知识,希望对你有一定的参考价值。

当尝试从x86(专门使用Pentium)上的I / O端口读取时,IN系列指令是否可以在等待数据时阻塞,或者它们是否会立即返回?

答案

简短回答:是的,从理论上讲,I / O设备可能会导致CPU“阻塞”I / O读取(in指令)。

但是,我不知道任何内存或I / O设备在任何重要时间段内实际停滞,导致CPU执行“阻塞”。


答案很长:

inout指令执行I / O读/写操作,这几乎与典型的内存总线周期相同。唯一的区别是声明了不同的信号以指示I / O与内存访问。

现在这变得非常低级,并且后续CPU的细节变得更加复杂。我正在引用this presentation进入有关x86总线周期的信号级细节,从8086/8088开始。

8086/8088读取周期,等待状态为https://web.archive.org/web/20130319052544/http://www.ece.msstate.edu/~reese/EE3724/lectures/bustran/bustran.pdf

我们在这里看到有一个READY信号,它由存储器或I / O设备断言,表示它已将数据提供给总线,并准备让CPU将其锁存。该PDF说明

x86在控制总线上有一个READY输入线

- 在T3期间,READY输入“已检查”

- 如果READY处于非活动状态(LOW),则添加其他T3状态

- 这些额外的T3国家被称为“等待国”

因此,至少使用这些较旧的CPU,设备可以在断言READY之前等待多个周期,从而导致CPU“阻塞”内存或I / O指令。

我相信这仍然有效,至少通过Pentium 4,它有一个DRDY#(数据就绪)引脚,"is asserted by the data driver on each data transfer, indicating valid data on the data bus. In a multi-common clock data transfer, DRDY# may be de-asserted to insert idle clocks."


更长的答案:

对于早期系统,我相信许多系统设备直接连接到地址/数据/其他线路并直接与CPU通信。因此,一些自定义或胭脂设备可能在总线周期中“停顿”。

现在,架构有很大不同。现代x86处理器本身甚至没有“地址”和“数据”引脚,而是有像DMIQPI这样的链接,它们与北桥/南桥(或Platform Controller Hub)设置进行通信。然后,这些设备将内存/ IO请求转发给适当的设备。通过这种设置,我怀疑PCH是否允许传出的I / O读取通过QPI链路停止处理器请求。

另一答案

在x86系列处理器上 - 据我所知 - 只有一个“阻塞”指令:“HLT”。

“IN”和“OUT”(及其变体)只是对内存的读/写访问。因此(查看硬件)它们的行为与来自/到内存的“MOV”指令完全相同 - 除了它们访问另一个地址范围。

有一种可能性使“IN”阻止:您可以想象一些硬件组件会在访问时停止计算机。当这样的组件使用“存储器映射”地址时,即使是“MOV”指令也会导致CPU阻塞!

然而,这样的硬件组件更具理论性 - 据我所知 - 目前的计算机中并不存在。

另一答案

我的信息很老,但我知道的大多数处理器都有一些慢速硬件设备与快速CPU同步的机制。这里缓慢而快速是相对的,慢速通常是微秒与纳秒。

因此,当执行输入/输出指令时,CPU可以等待一段时间,直到IO设备准备好了信息。

顺便说一下,我不确定x86,但在某些架构上,IO设备真的可以在无限时间内停止CPU。

这是等待“阻止”吗?我不知道,但这些指令可能很慢,速度可能取决于硬件。此外,IO指令不可缓存,这也非常慢。

为了更好地参考,还必须阅读有关PCI总线规范和现代处理器硬件规范的更多信息。

以上是关于可以在x86汇编中使用IN(以及INS,INSB等)指令块吗?的主要内容,如果未能解决你的问题,请参考以下文章

x86汇编编程中如何表示FFFFFFBB等十六进制值?

x86汇编语言基础

x86汇编语言

使用 AND、OR、SHR 和 SHL 指令以及数组将循环从 x86 汇编转换为 C 语言

以x86汇编语言获取EAX寄存器的第一位

什么时候应该在 x86 汇编中使用 MOVS 而不是 MOV?