前言
最近在學ARM,對它的PC產生了疑惑,一開始是把PC類比成x86中的IP的,後面發現還是有點區別的
x86架構
在《深入理解計算機系統》一書中指出(P6)
從系統通電開始,直到系統斷電,處理器一直在不斷地執行程序計數器指向的指令,再更新程序計數器(PC)。
也就是說,在x86中,PC實際上是永遠指向下一條待執行的指令
另外,在《彙編語言》—王爽,一書中指出,IP是指令指針寄存器,它的工作流程如下
可見,IP也是在其指向的指令被執行之後,才更新爲下一條待執行的指令。因此其實質上等同於PC
小結
x86中,PC與IP實質上一致
ARM架構
在《彙編語言程序設計:基於ARM體系結構》一書中(P53),指出
寄存器R15用作程序計數器(PC),用於控制程序中指令的執行順序。正常運行時,PC指向CPU運行的下一條指令。每次取指後PC的值會自動修改以指向下一條指令,從而保證了指令按一定的順序執行。
劃重點:每次取指後PC的值會自動修改以指向下一條指令
另外,這裏只說明PC是用於控制程序中指令的執行順序,並不是說PC執行下一條執行的指令
由此可見,x86架構和ARM架構的PC確實功能不完全一樣。
考慮到ARM的流水線架構,舉例ARM7的三級流水線
在時鐘週期1取指完成後,PC=PC+4
在時鐘週期2取指完成後,PC=PC+8,此時第一條指令正開始執行,PC值已經+8了
因此,實際上,在ARM中,每次當前指令執行時,PC=PC+8
總結
- x86:PC等於下一條指令地址
- ARM:PC等於下兩條指令地址