程序計數器(Program Counter)是一個實際存在的寄存器嗎?
01-22
csapp 第四章吧好像是
是。
我一直用的TI的C6000系列DSP,確定地說,是有這個寄存器的(至少我用過的C64/C64+/C66核都是這樣的),在CCS開發環境下就能看到,連上模擬器跑一下更直觀,它是一個word一個word地向上蹦的,當然了,遇到跳轉指令會直接改變這個寄存器的值,從而把程序流「導向」到一個指定的存儲空間地址上,if/while/switch等等跳轉語句以及函數調用、中斷常式就是這麼回事,反正就是跳來跳去唄。
其他的很多主流處理器——IA32、ARM、MIPS等等——應該至少原理上都類似。
如果有實驗板和模擬器,你甚至可以更直觀地體驗到。講一個栗子。比如有一次我們拿到了一個庫,但是需要修改一下才能用在我們開發的東西上,然而這個庫是第三方做好、不開源的。怎麼辦呢?我們有個牛人先是用模擬器反彙編,查到了需要改的那一段彙編代碼(實際上是機器碼啦~~,這個過程中的種種分析、推理實在是精妙,這裡不多說了)。然後呢,我就直接修改了這個靜態庫(二進位文件)其中的幾個位元組,就是那個牛人找到的位置,也就是直接改機器碼了。其實就是改的那段代碼之前某處的一條跳轉指令,令DSP也就是PC計數器、或者說指令流強行跳到一個我們指定的絕對地址上——這個地址我們把它映射到DDR上面某個隔離的區域,板子上電初始化時在裡面預先載入了我們自己的代碼(也就是我們對這個可憐的庫想做的邪惡事),當然,我們自己代碼的最後還要有一條指令跳回原來的位置。最後跑起來當然爽啦:在反彙編窗口裡面眼看著PC計數器往上加呀加呀,然後biu的一下變成了我們黑程序的地址值,然後就在裡面歡快地跑了一通,最後biu地跳回到庫裡面,繼續該幹嘛幹嘛,不露一點痕迹。mips是有pc寄存器的
ARMV7:
PC即r15,實打實的寄存器,可通過mov ldr等指令修改。ARM64-v8:
PC不與任何GPR對應,不能修改,除非跳轉指令。另外,由於流水線長度不同,實際上PC會指向流水線後的指令地址,而不是下一條指令。只寫過一個Verilog下的32位五級流水CPU,既沒有模擬也沒有模擬過,就能跑起來罷了。指令就有好多種類,而且根據復用與否會變的極其複雜,我記得當時的數據匯流排有120位+,不過是最後實現了跳轉,子程序調用,數據阻塞之後。PC正常是+1就是正常調用下一個指令,但是有時候會有絕對跳轉指令。因為貌似會有一個多路選擇器對到底是順序執行還是絕對跳轉還是相對跳轉進行選擇。最後的遺憾是當年沒寫出阻塞預測,因為能力不足而且確實也沒想通,感覺可能跟語義分析有關,這塊學的不好啊。不過看到最後的波形圖出來確實很爽,不過當時寫的是很幼稚的其實是不能過模擬的,完全是把Verilog當成C來寫。SJTU的CPU設計課程就不錯,不過貌似他們的重點是寫編譯器,看有同學拿來的是一個3K行的JAVA寫的編譯器,直接給跪了。但是他們有給直接的構造圖,直接實現單個元件語法描述然後拼起來就可以,但是好像是可以直接模擬模擬的。我們是就講了兩天Verilog語法就直接開工然後兩周停課幹活+半月收尾就驗收了。
所有的RISC都會有,CISC也許會沒有。VM也都會有,惠而不費嘛。總會有一個寄存器來表示當前的指令地址的,要不然你讓Debugger怎麼玩兒啊:)
別的我不知道,至少mips裡面有,因為指令都是定長的
推薦閱讀:
※選擇ubuntu還是支持deepin?
※為什麼 Linux 升級系統不用重啟,而Android和iOS卻必須重啟?
※筆記本里只裝Linux是什麼體驗?
※systemd 是不是管的太多了?
分頁阅读: 1 2