为什么"执行"位于指令集架构中的"内存"之前?

wen*_*hao 2 processor isa

我3年前学过处理器架构.

直到今天,我还无法弄清楚execute之前memory在顺序指令中找到的原因.

在执行指令时[ mov (%eax) %ebx],是否需要不访问内存?

谢谢!

osg*_*sgx 7

让我们记住经典的RISC管道,通常会对其进行研究:http://en.wikipedia.org/wiki/Classic_RISC_pipeline.这是它的阶段:

  • IF =指令获取
  • ID =指令解码
  • EX =执行
  • MEM =内存访问
  • WB =寄存器写回

在RISC中,您只能使用loads和stores来处理内存.而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

幻灯片17说:

  • 英特尔结合memEX阶段,以避免负载和摊位,但并创建地址计算摊位
  • mips中的所有阶段都需要一个周期,因为英特尔在某些阶段可能需要多个阶段.这会产生不对称的性能

在我的例子中,add将在MEM+EX多个CPU滴答的组合" "阶段执行,产生许多停顿.

现代x86 CPU具有非常长的流水线(典型的是16级),它们在内部是类似RISC的cpu.解码器阶段(3阶段或更多阶段)将大多数复杂的x86指令分解为一系列内部RISC类微操作(有时在微指令的帮助下生成每条指令最多450微操作;更典型的是2-3微操作).对于复杂的ALU/MEM操作,将有微操作用于地址计算,然后微操作用于存储器加载,然后微操作用于ALU操作.微操作将取决于它们,并计划到不同的执行端口.