02.07.2013 Views

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

e59ff014。<br />

此处取指完之后,自动更新 PC 的值,即 PC=PC+4(单个指令占 4 字节,所以加 4)=4+4=8<br />

指令周期 Cycle2<br />

(1)译指:翻译指令 e59ff014;<br />

(2)同时再去取指:<br />

PC 总是指向将要读取的指令的地址(即我们常说的,指向下一条指令的地址),而当前 PC=8,<br />

所以去物理地址为 8 所对应的指令“ldr pc, [pc, #20] ” 其对应二进制代码为<br />

e59ff014。<br />

此处取指完之后,自动更新 PC 的值,即 PC=PC+4=8+4=12=0xc<br />

指令周期 Cycle3<br />

(1)执行(指令):执行“e59ff014”,即“ldr pc, [pc, #20]”所对表达的含义,即<br />

PC = PC + 20<br />

= 12 + 20<br />

= 32<br />

= 0x20<br />

此处,只是计算出待会要赋值给 PC 的值是 0x20,这个 0x20 还只是放在执行单元中内部<br />

的缓冲中。<br />

(2)译指:翻译 e59ff014。<br />

(3)取指:<br />

此步骤由于是和上面(1)中的执行同步做的,所以,未受到影响,继续取指,而取指的那<br />

一时刻,PC 为上一 Cycle 更新后的值,即 PC=0xc,所以是去取物理地址为 0xc 所对应的指<br />

令” ldr pc, [pc, #20]”,对应二进制为 e59ff014。<br />

其实,分析到这里,大家就可以看出:<br />

在 Cycle3 的时候,PC 的值,刚好已经在 Cycle1 和 Cycle2,分别加了 4,所以 Cycle3 的时<br />

候,PC=PC+8,而同样道理,对于任何一条指令的,都是在 Cycle3,指令的 Execute 执行阶<br />

段,如果用到 PC 的值,那么 PC 那一时刻,就是 PC=PC+8。<br />

所以,此处虽然是五级流水线,但是却不是 PC=PC+16,而是 PC=PC+8。<br />

进一步地,我们发现,其实 PC=PC+N 的 N,是和指令的执行阶段所处于流水线的深度有关,<br />

即此处指令的执行 Execute 阶段,是五级流水线中的第三个,而这个第三阶段的 Execute 和<br />

指令的第一个阶段的 Fetch 取指,相差的值是 3 -1 =2,即两个 CPU 的 Cycle,而每个 Cycle<br />

都会导致 PC=+PC+4,所以,指令到了 Execute 阶段,才会发现,此时 PC 已经变成 PC=PC+8<br />

了。<br />

回过头来反观 ARM7 的三级流水线,也是同样的道理,指令的 Execute 执行阶段,是处于指<br />

令的第三个阶段,同理,在指令计算数据的时候,如果用到 PC,就会发现此时 PC=PC+8。<br />

同理,假如 ARM9 的五级流水线,把指令的 Execute 执行阶段,设计在了第四个阶段,那么<br />

就是 PC=PC+(第 4 阶段-1)*4 个字节 = PC= PC+12 了。<br />

【总结】<br />

ARM7 的三级流水线,PC=PC+8,<br />

ARM9 的五级流水线,也是 PC=PC+8,

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!