3年前我学习了处理器架构。
直到今天,我无法弄清楚execute
在顺序说明中位于memory
之前的原因。
执行指令[ mov (%eax) %ebx]
时,是否需要不访问内存?
谢谢!
答案 0 :(得分:7)
让我们记住经典的RISC管道,通常会对其进行研究:http://en.wikipedia.org/wiki/Classic_RISC_pipeline。这是它的阶段:
在RISC中,您只能使用load
和store
来处理内存。并且用于存储器访问指令的EX
阶段将计算存储器中的地址(从寄存器文件获取地址,缩放它或添加偏移量)。然后地址将传递到MEM
阶段。
你的例子,mov (%eax), %ebx
实际上是来自内存的加载而没有任何额外的计算,它甚至可以在RISC管道中表示:
IF
- 从指令存储器中获取指令ID
- 解码指令,将“eax”寄存器作为操作数传递给ALU;记住“ebx”作为WB的输出(在控制单元中); EX
- 在ALU中计算“eax + 0”并将结果传递给下一阶段MEM
(作为内存中的地址)MEM
- 从EX
阶段(从ALU)获取地址,转到内存并获取值(此阶段可能需要几个滴答以达到内存并阻塞管道)。将值传递给WB
WB
- 从MEM
获取值并将其传递回寄存器文件。控制单元应将寄存器文件设置为模式:“写入”+“EBX选择”在真正的CISC指令中情况更复杂,例如add (%eax), %ebx
{从T
内存加载[%eax]
字,然后将T + %ebx
存储到%ebx
)。该指令需要ALU中的地址计算和加法。这在最简单的RISC(MIPS)流水线中无法轻易表现出来。
第一个x86 cpu(8086)没有流水线,它随时只执行单个指令。但是自80386以来,有6个阶段的管道,这比RISC更复杂。有关其管道的介绍,将其与MIPS进行比较:http://www.academic.marist.edu/~jzbv/architecture/Projects/projects2004/INTEL%20X86%20PIPELINING.ppt
Slide 17说:
mem
和EX
阶段结合起来以避免加载和停顿,但确实会为地址计算创建停顿在我的示例中,add
将在合并的“MEM+EX
”阶段中执行多个CPU刻度,从而产生许多停顿。
现代x86 CPU具有非常长的流水线(典型的是16级),并且它们在内部是类似RISC的cpus。解码器阶段(3阶段或更多阶段)将大多数复杂的x86指令分解为一系列内部RISC类微操作(有时在微指令的帮助下生成每条指令最多450微操作;更典型的是2-3微操作)。对于复杂的ALU / MEM操作,将有微操作用于地址计算,然后微操作用于存储器加载,然后微操作用于ALU操作。微操作将取决于它们,并计划用于不同的执行端口。