Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编中的IN(以及INS、INSB等)指令块是否可以使用?_Assembly_X86 - Fatal编程技术网

Assembly x86汇编中的IN(以及INS、INSB等)指令块是否可以使用?

Assembly x86汇编中的IN(以及INS、INSB等)指令块是否可以使用?,assembly,x86,Assembly,X86,在尝试从x86(特别是奔腾)上的I/O端口读取数据时,IN系列指令是否会在等待数据时阻塞,或者它们是否总是立即返回?据我所知,在x86系列处理器上,只有一条“阻塞”指令:“HLT” “IN”和“OUT”(及其变体)只不过是对内存的读/写访问。因此(从硬件上看),它们的行为与从/到内存的“MOV”指令完全相同,只是它们访问另一个地址范围 有一种可能是“在”块:你可以想象一些硬件组件将停止计算机时,它被访问。当这样的组件使用“内存映射”地址时,即使是“MOV”指令也会导致CPU阻塞 然而,这种硬件组

在尝试从x86(特别是奔腾)上的I/O端口读取数据时,IN系列指令是否会在等待数据时阻塞,或者它们是否总是立即返回?

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

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

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


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

我的信息非常陈旧,但我所知道的大多数处理器都有一些机制,可以将较慢的硬件设备与较快的CPU进行同步。这里的慢和快是相对的,慢的意思通常是微秒对纳秒

因此,当执行in/out指令时,CPU可以稍等,直到IO设备准备好信息

顺便说一句,我对x86不太清楚,但在某些体系结构上,IO设备确实可以无限期地停止CPU

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


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

简短回答:,理论上,I/O设备可能会导致CPU在I/O读取时“阻塞”(
指令中)

但是,我不知道有任何内存或I/O设备实际暂停了很长一段时间,导致CPU执行“阻塞”


长答覆:

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

现在,这变得相当低级,随着CPU的发展,细节变得更加复杂。我将参考有关x86总线周期的信号级详细信息,从8086/8088开始

8086/8088具有1个等待状态的读取周期

我们在这里看到,有一个
就绪
信号,由内存或I/O设备断言,以指示它已将其数据呈现给总线,并准备好让CPU将其锁定。该PDF声明

x86在控制总线上有一条就绪的输入线

–准备就绪输入在T3期间“已检查”

–如果就绪处于非活动状态(低),则会添加其他T3状态

–这些额外的T3状态称为“等待状态”

因此,至少对于这些较旧的CPU,设备可能会在断言
就绪
之前等待许多周期,从而导致CPU“阻塞”内存或I/O指令

我相信这仍然是有效的,至少通过,它有一个
DRDY#
(数据就绪)管脚,
“由数据驱动程序在每次数据传输时断言,指示数据总线上的有效数据。在多公共时钟数据传输中,可以取消断言DRDY#以插入空闲时钟。”


详细回答:

对于早期的系统,我相信许多系统设备直接连接到地址/数据/其他线路,并直接与CPU通信。因此,一些定制或胭脂设备可能会在公交车上“暂停”


现在,架构已经大不相同了。现代x86处理器本身甚至没有“地址”和“数据”管脚,而是有像和这样的链接,它们与northbridge/southbridge(or)设置通信。然后,这些设备将内存/IO请求转发给相应的设备。使用此设置,我怀疑PCH是否允许传出I/O读取通过QPI链路暂停处理器请求。

好问题。我相信它们是非阻塞的。否则,不存在或出现故障的外部设备可能会挂断处理器,等待指令序列正确完成。输入指令(中的
)将在CPU和外部设备之间启动一系列信号,以指示CPU请求读取、设备显示数据等。这些都发生在特定的规定时限内。它们不会,但是
处理器将I/O指令执行与外部总线活动同步
英特尔64和IA-32体系结构软件开发人员手册1/14.6如果总线被锁定,会发生什么?是否最终超时?@BrianKnoblauch如果总线出于某种原因“锁定”,则通常硬件设计有看门狗定时器以“释放”。只有在“等待”可以无限期继续时,“等待”才会被阻塞。