ARM處理器中PC值=當前指令地址 + 8的根本原因
對於軟體工程師來說,印象流我們可能會覺得執行一條指令一個時鐘週期嘛,一條指令算是一個最小的原子操作,不可能再細分了吧。
如果看看諸如《see mips run》,《arm體系架構》等書籍就會了解到,這個問題可沒這麼簡單了,因為處理器設計中使用了流水線技術。
一條指令還是相當複雜的,處理器在一個時鐘週期內肯定是完不成的,可能需要好多個時鐘週期來完成執行。如果這樣讓處理器執行完一條指令,再去執行另一條,處理器的效率是很低的,假如一條指令是5個時鐘週期完成,對於500MHZ的處理器序列執行指令,1秒內取指100000000次。
因此處理器引入了流水線技術,將一條指令劃分為多個功能,由不同的功能部件來執行,並且這些功能部件可以並行工作。下面是一個arm7的三級流水線執行圖。
流水線劃分為取指 譯碼 執行,但並不是僅需3個時鐘週期即執行完指令。因為執行單元模組的操作較多,可能需要多個週期,取指 譯碼一般是一個時鐘週期,這樣可以看出雖然一條指令完成需要多個時鐘週期,但是總體來說看在每個時鐘週期都有一條指令開始取指。如果我們的處理器是500MHZ,則1秒內取指了500000000次。
不同的處理器設計時流水線級數不一樣,現在主流的有三級 五級 七級,增加流水線級數,簡化流水線的各級邏輯,可以提高處理器的效能。
回答咱們開頭的問題也就明白了,一條指令需要的時鐘週期還真不固定,這得看處理器的流水線級數,也得看該指令的複雜度,在執行階段需要幾個時鐘週期。
對於流水線各級具體工作這裡就不細說了,網上文章很多,畢竟咱們是做軟體的,硬體點到為止,流水線各級工作是有處理器內部邏輯單元來完成的,對於軟體來說都是不可見的,軟體可操作的最小原子操作就是指令。
不過呢,處理器的流水線技術在有一個事情對咱們軟體造成了影響,那就是PC值。
據我瞭解的處理器流水線設計,前三級基本都是取指 譯碼 執行。處理器的PC暫存器中儲存的是處理器的取指地址,根據上述流水線機制,而我們的處理器執行的指令地址是落後於要去預取的指令的地址,落後2個時鐘週期。
也就是說我們在取了第一條指令後,等該指令到了執行階段時,我們的處理器其實已經預取了往後的第二條指令了。
對於32位處理器,一條指令佔據4位元組。這也就是PC值 = 當前指令地址 + 8的根本原因啦。
原標題:處理器一條指令需要幾個時鐘週期?
地址:http://blog.csdn.net/skyflying2012/article/details/51018640
相關推薦
ARM處理器中PC值=當前指令地址 + 8的根本原因
思考個小問題,處理器執行一條指令需要幾個時鐘週期。 對於軟體工程師來說,印象流我們可能會覺得執行一條指令一個時鐘週期嘛,一條指令算是一個最小的原子操作,不可能再細分了吧。 如果看看諸如《see mips run》,《arm體系架構》等書籍就會了解到,這個問題可沒這麼簡單了,
關於ARM9和ARM7中都是PC=當前執行指令地址+8的解釋
ARM7是三級流水線,AMR7的三級流水線如下: 執行 指令地址=0 取指 PC = 4 解碼 執行 指令地址=4 取指 PC = 8 解碼 執行 指令地址=8 取指 PC = 12 解碼 執行 指令地址=1
PC值=當前程式執行位置+8
ARM處理器使用流水線來增加處理器指令流的速度,這樣可使幾個操作同時進行,並使處理與儲存器系統之間的操作更加流暢,連續,能提供0.9MIPS/MHZ的指令執行速度。 PC代表程式計數器,流水線使用三個階段,因此指令分為三個階段執行: 1.取指(從儲存器裝載一條指令); 2.譯碼(識別將要被執
java中傳值與傳地址
相信學習過c的朋友們,對於傳值與傳地址比較熟悉,而在java中這樣的術語用的比較少,那麼到底存不存在傳值與傳地址呢? 答案肯定是:存在的!! 做下列總結: 說明:Student student=new Student();中student就可以看作是c裡面的指標
arm處理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依據什麼來分類的
ARM處理器發展這麼多年,有很多架構,很多不同的核心 架構有armv1 v2 v3 v4 v5 v6 v7 核心太多了,比如armv1對應的是arm1,armv5對應的arm9,armv6對應的arm11,armv7對應的cortex(比如A8 A9都屬於cortex架構)
Java中的值傳遞和地址傳遞
0.前言 被java中的“值傳遞”和“引用傳遞”困擾過一陣子,在實際程式碼中也犯過不少錯,記錄一下,方便檢視。 1.問題 首先看看程式碼: public class Test { public static void main(Stri
Java中的值傳遞和地址傳遞(傳值、傳引用)
首先,不要糾結於 Pass By Value 和 Pass By Reference 的字面上的意義,否則很容易陷入所謂的“一切傳引用其實本質上是傳值”這種並不能解決問題無意義論戰中。 更何況,要想知道Java到底是傳值還是傳引用,起碼你要先知道傳值和傳引用的準確含義吧?可是如果你已經知道了這兩個名字的準確
ARM中斷返回PC值分析
在ARM程式的開發過程中,對中斷的處理是很普遍的、也是相當重要的。Realview MDK使用的RVCT編譯器提供了__irq關鍵字,用此關鍵字修飾的函式被作為中斷來函式編譯,即在編譯的過程中,編譯器會自動新增中斷處理過程中現場保護和恢復的程式碼,減小程式的開發難度,加快軟體的開發過程。 在理解__ir
ARM匯編中一些重要偽指令
命令 指示 export 鏈接 area 偽指令 數據 表示 轉換 IMPORT ,定義表示這是一個外部變量的標號,不是在本程序定義的 EXPORT ,表示本程序裏面用到的變量提供給其他模塊調用的。 以上兩個在匯編和C語言混合編程的時候用到 ENDP 表示PROC
大臉貓講逆向之ARM匯編中PC寄存器詳解
nbsp 限制 得到 目標 進行 查找 i春秋 偏移量 .html i春秋作家:v4ever 近日,在研究一些開源native層hook方案的實現方式,並據此對ARM匯編層中容易出問題的一些地方做了整理,以便後來人能有從中有所收獲並應用於現實問題中。當然,文中許多介紹參
ARM彙編中LDR偽指令和LDR指令
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C語言:函式中引數的傳值與傳地址
任務程式碼: #include <stdio.h> void swap(int *a ,int *b)//按之前對指標認識,*a代表指標變數a,a儲存的是地址,*a是地址的值。 { //但是可以看到下面傳輸過程中swap(
javascript中值傳遞,地址傳遞,引用傳遞的問題。
首先發現問題是好事情,只有發現問題,才會有提高,不然整體都在寫相同的程式碼,寫個幾年,不還是原來的水平。 這個地址傳遞和值傳遞 不論在什麼語言都有這個問題,一旦出問題,就是很微妙的問題。想破天都不知道為啥的時候,多半就是 這個問題在作怪啦。 (js,java,c)c語言的
Java中集合list的add方法新增的不是值COPY而是地址
測試程式碼如下: package test; import java.util.ArrayList; import java.util.List; class Point { int x; int y; public Point(int x,int y) { th
gdb檢視記憶體地址和棧中的值
gdb檢視指定地址的記憶體地址的值:examine 簡寫 x-----使用gdb> help x 來檢視使用方式 x/ (n,f,u為可選引數)n: 需要顯示的記憶體單元個數,也就是從當前地址向後顯示幾個記憶體單元的內容,一個記憶體單元的大小由後面的u定義f:
嵌入式 ARM中CP的操作指令MCR/MRC詳解
1. MCR, 將ARM中normal register的值傳向CP register. format: mcr cpx, op1, src_reg, dst_reg1, dst_reg2, op2 cpx: Integer in the range 0~15 defining coprocessor. o
armcm3權威指南筆記----arm程式設計中地址未對齊方面的影響
P152當使用C開發程式時,推薦開啟CM3的雙字對齊管理機制(在NVIC配置與控制暫存器中,把STKALIGN置位),程式碼形如: #define NVIC_CCR ((volatile unsigned long *)(0xE000ED14)) *NVIC_CCR =
ARM的流水線與PC值的關係
1、馮·諾依曼結構 馮·諾依曼結構又稱作普林斯頓體系結構(Princetionarchitecture)。1945年,馮·諾依曼首先提出了“儲存程式”的概念和二進位制原理,後來,人們把利用這種概念和原理設計的電子計算機系統統稱為“馮·諾依曼型結構”計算機。馮·諾依曼結構的處理器使用同一個儲存器,經由同一個
arm異常中lr儲存pc的情況
移植程式碼中存在的很多問題比如中斷的關閉和開啟,任務級別的情景切換,中斷到任務的情景切換都是我們在平時移植中講到,我也不在此強調了。在官網中提供的移植過程中存在異常處理機制,這個本不是在移植過程中考慮的,但是文件中確實提供了一個比較好的處理方式。我在此對這一
下拉框只顯示最初下拉框中的值和json返回array的交集
sel .text json down emp tno append length drop 首先我們可以遍歷dropdown var array = new Array(); $("#select option").each(function(j){ array[j]=