1. 程式人生 > >ARM處理器中PC值=當前指令地址 + 8的根本原因

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:

嵌入式 ARMCP的操作指令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]=