据我所知,intel 8086 pipelining
是在执行当前指令时获取下一条指令的技术。
这篇文章说流水线的优势之一是
消除了欧盟的等待时间,加快了处理。
我认为,像lea 0x7(%eax), %ecx
这样的指令可以分为几个指令,
就像add $0x7, %eax; lea %eax, %ecx
一样
My think)
所以,根据定义,
我认为上面的例子与intel 8086 pipelining
的定义相匹配,因为它在一个时隙执行多个指令和
,所以像这样的操作加快了处理。
问题)
我很好奇下面的指令可以作为流水线的例子。
main:
mov $0x2, %eax
mov $0x3, %esi
lea (%eax), %ecx # result: 2. Pipeling?
lea 0x7(%eax), %ecx # result: 9. Pipeling?
lea 0x7(%eax,%esi,), %ecx # result: 12. Pipeling?
lea 0x7(,%esi,4), %ecx # result: 19. Pipeling?
lea 0x7(%eax,%esi,4), %ecx # result: 21. Pipeling?
最早的计算机不是流水线式的。它们获取一条指令,执行指令所需的所有周期,然后传递给下一条指令。一条指令平均需要5-6个周期。这种行为适用于80年代中期之前的所有计算机,包括8086(在78年引入)。
70年代末,人们发现管道是提高效率的有效途径。第一个商业芯片是IBM 801,但管道的成功是在80年代中期与Sun Sparc、Berkeley Risc和MIPS合作。
其想法是将所有指令拆分到类似的阶段,并将这些阶段与独立的硬件资源相关联,这样您就可以启动一条新指令,而无需等待前一条指令完成,从而可以在每个周期启动一个新指令。为了处理指令交互(危险),每1.5个周期有1条指令,但与上一代相比,增益是巨大的(X3性能)。
问题是流水线需要基于简单数据移动的特定指令集(称为RISC指令集)。新的计算机是基于这个方案,但旧的处理器指令集没有被调整(包括x86)。
为了从流水线的好处中获利,同时保持向上兼容性,英特尔决定采用基于两部分的微体系结构:第一部分获取x86指令并将其转换为流水线指令(称为μOps),第二部分是这些μOps。它最初是在奔腾Pro(1995年推出)中引入的,并存在于任何后续版本中。
你给的代码
lea 0x7(%eax),%ecx
转换为
添加$0x7,%eax
lea%eax,%ecx
是μ操作翻译。转换特别有用——将具有内存中操作数的ALU操作转换为执行单个任务(内存传输或ALU操作)的更简单的操作。
目前,所有的计算机都是流水线式的(除了一些简单的控制器或一些嵌入FPGA的处理器)。
无论您给出的指令序列是什么,都将在管道中执行,当然包括您问题中的指令。唯一的限制是,根据指令交互,可能存在可能意味着管道减速(失速)的危险。
我认为上面的例子符合intel8086流水线的定义
流水线是微体系结构的一个特征,而不是指令集的特征。因此,微体系结构8086不是流水线,而是其指令集(称为x86或IA32)的后续体系结构实现。
因为它在一个时隙上执行多条指令
您实际上是对的,可以在一个时隙启动多条指令,但这是流水线之上的另一种技术,允许在指令级别并行执行,称为超标量。