程序計數器
編輯程序計數器 (PC),在 Intel x86 和 Itanium 微處理器中通常稱為指令指針 (IP),有時也稱為指令地址寄存器 (IAR)、指令計數器或只是指令序列器的一部分,是一個處理器寄存器,它 指示計算機在其程序序列中的位置。
通常,PC 在獲取指令后遞增,并保存(指向)下一條將要執行的指令的內存地址。
處理器通常按順序從內存中獲取指令,但控制傳輸指令通過在 PC 中放置一個新值來改變順序。 這些包括分支(有時稱為跳轉)、子程序調用和返回。 以某些斷言為真為條件的傳輸讓計算機在不同條件下遵循不同的順序。
分支規定下一條指令是從內存中的其他地方獲取的。 子程序調用不僅是分支,而且還把PC 的前面的內容保存在某處。 返回檢索 PC 中保存的內容并將其放回 PC 中,恢復順序執行子程序調用后的指令。
硬件實現
編輯在一個簡單的中央處理器 (CPU) 中,PC 是一個數字計數器(它是術語程序計數器的來源),它可能是幾個硬件寄存器之一。 指令周期以取指開始,其中 CPU 將 PC 的值放在地址總線上以將其發送到內存。 存儲器通過在數據總線上發送該存儲器位置的內容來響應。 (這是存儲程序計算機模型,其中單個內存空間包含可執行指令和普通數據。)在獲取之后,CPU 繼續執行,根據它獲得的內存內容采取一些行動。 在這個周期的某個時刻,PC 將被修改,以便下一條執行的指令是不同的(通常,遞增以便下一條指令是從緊跟在當前指令的最后一個內存位置之后的內存地址開始的指令) .
與其他處理器寄存器一樣,PC 可能是一組二進制鎖存器,每個鎖存器代表 PC 值的一位。 位數(PC 的寬度)與處理器架構有關。 例如,“32 位”CPU 可能使用 32 位來尋址 232 個內存單元。 在某些處理器上,程序計數器的寬度取決于可尋址內存; 例如,一些 AVR 控制器有一個 PC,它在 12 位后回繞。
如果 PC 是一個二進制計數器,當一個脈沖被應用到它的 COUNT UP 輸入時它可能會遞增,或者 CPU 可能會計算一些其他值并通過一個脈沖到它的 LOAD 輸入將它加載到 PC 中。
為了標識當前指令,PC 可以與標識段或頁的其他寄存器組合。 通過假設大多數感興趣的存儲單元都在當前附近,這種方法允許 PC 具有更少的位。
機器架構的后果
編輯使用通常遞增的 PC 假設計算機所做的是執行通常線性的指令序列。 這樣的 PC 是馮·諾依曼架構的核心。 因此,即使算法不必是順序的,程序員也可以編寫順序控制流。 由此產生的“馮諾依曼瓶頸”導致了對并行計算的研究,包括非馮諾依曼或不使用 PC 的數據流模型; 例如,高級程序員可能會指定所需的功能,而不是指定順序步驟,而低級程序員可能會使用組合邏輯來指定它。
這項研究還導致了使基于 PC 的傳統 CPU 運行得更快的方法,包括:
高級編程的結果
編輯現代高級編程語言仍然遵循順序執行模型,事實上,識別編程錯誤的一種常見方法是使用“過程執行”,其中程序員的手指像 PC 一樣識別執行點。 高級語言本質上是虛擬機的機器語言,太復雜而不能作為硬件構建,而是通過軟件模擬或解釋。
然而,新的編程模型超越了順序執行編程:
- 在編寫多線程程序時,程序員可以將每個線程編寫為指令序列,而無需指定任何指令相對于其他線程中指令的時序。
- 在事件驅動編程中,程序
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/195851/