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

时间:2013-08-27 01:07:48

标签: assembly x86

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

简短回答:,理论上,I / O设备可能导致CPU阻止"阻止"在I / O读取(in指令)上。

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


长答案:

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

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

8086/8088具有1个等待状态的读取周期 8086/8088 Read Cycle with 1 Wait State 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 4DRDY#(数据就绪)引脚"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通信。所以一些自定义或胭脂设备可能会“停止”#34;在公共汽车上。

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

答案 2 :(得分:1)

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

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

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

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

为了更好地参考,我们必须阅读更多关于PCI总线规范和现代处理器硬件规范的内容。