天天看點

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

1.ARM簡介

了解PC的人都知道,大部分PC機使用的都是interl的處理器,部分使用的是AMD的,但是在嵌入式領域,ARM是當之無愧的老大。不過ARM比較有趣的是ARM公司隻做設計,由其他廠商生産對應的晶片,是以我們能夠看到各個公司生産的各種各樣的基于ARM的闆卡。在學習嵌入式領域,使用比較多的是三星公司的S3C2440,S3C6410和210等。

在嵌入式領域,我們經常看到各種各樣的名詞,如armv6,6410和cortex A8等,它們分别指什麼呢?這些名詞大緻分為三類:

  1. 晶片:2440,6410,210等
  2. arm核:arm7,arm9,cortex A8等
  3. arm指令結構:armv4,armv6,armv7等。

三者之間的關系怎麼樣呢?

首先來看晶片和arm核之間的關系。這個可以從晶片的手冊中查到該片子使用的是那種arm核。打開2440的手冊S3C2440.pdf,在第34頁的圖上可以看到一個框,裡面内容為“ARM9TDMI Processor core (Internal Embedded ICE)”,這就說明了2440晶片用的是arm9,同理在6410的手冊S3C6410.pdf的61頁圖中,可以看到“ARM1176JZF-S”字樣,在210的手冊“S5PV210_UM_REV1.1.pdf”的15頁圖中,可以在CPU Core的框中看到Cortex A8。

到此晶片和ARM核之間的關系就明确了。2440<->Arm9,6410<->ARM11,210<->A8

再看ARM核與指令架構之間的關系

這個可以從arm核的手冊中查到該核使用的是哪種架構。開arm核的手冊ARM920T_TRM1_S.pdf,可以從中查到arm9使用了哪種指令架構,在第27頁的表中,可以看到ARM7TDMI和ARM9TDMI ARMv4T。打開ARM11的手冊Arm1176jzfs.pdf,該文檔中并沒有直接說明使用的指令架構的語句,但是搜尋armv6,可以找到大量與之相關的說明,這間接說明了arm11使用的事armv6指令架構,同理可以在210的手冊确定其使用的指令架構為armv7。

自此,arm 的幾種常見學習闆的對應關系為:

  • 2440<->Arm9<->armv4
  • 6410<->ARM11<->armv6
  • 210<->A8<->armv7

arm晶片家族種類多,數量大,常見的幾種,以及互相之間的關系如下圖所示,該圖是從一個教育訓練結構的課件中看懂的,感覺直覺的。

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

而ARM晶片可以分為3個系列:M系列,A系列和R系列,另外,還可以加上一個經典版本系列

arm的 M系列主要面向工控領域,沒有OS,跑裸機程式,但是處理性能并不弱。

R系列主要面向實時應用。

A系列主要面向多媒體,很多手機都使用該晶片。

arm的經典系列,如arm7,arm9,arm11等。

從處理器的性能上看,arm7與M3基本持平,跑裸機程式,而arm9與arm11同比A5稍微弱一些,與R系列接近。

2.ARM的工作模式

劃分模式的好處是讓不同的程式可以運作在不同的級别,例如讓OS或者uboot等運作在級别進階别,而使用者程式或者不穩定的程式運作在級别低的模式下。進而保證系統的穩定性,便于管理。

如果要從整體上了解ARM的資訊,ARM的官方手冊《ARM Architecture Reference Manual.pdf》無疑是最完整、最權威的。在文檔的“Programmers' Model”一章的A2.2節“Processos modes”說明了ARM的幾種工作模式。

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

各種模式的特征從表裡可以看得很清楚,這裡整理幾個關鍵點:

  1. 從這個表中可以看到 ,arm支援7種工作模式。各個模式的簡寫最好記住,因為有時候簡稱比全程用的更頻繁,特别是usr、svc等。
  2. Linux系統裡的運作在哪個模式?使用者程式運作在usr模式,而os核心運作在svc模式。
  3. 如果要進行模式切換,有兩種方式,一種是通過軟體來控制,一種是通過外部中斷或者異常處理來實作。
  4. 需要注意的是,對于安裝了Linux作業系統的晶片,大部分的使用者程式是運作在user模式的,而os運作在svc模式下的。當處理器在使用者模式下的時候,執行的程式是無法通路某些受保護的系統資源的,也不能改變系統的工作模式。當然,發生異常的情況除外。
  5. 除了使用者模式,其他模式都稱為特權模式,它們都可以通路系統資源,并且可以自由改變運作模式。其中,它們中的五個又稱為異常模式:FIQ、IRQ、svc、Abort和Undefined五種。

3.ARM的寄存器

根據《ARM Architecture Reference Manual.pdf》的A2.3節的介紹。這些寄存器是怎麼劃分,又有什麼用呢?

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

參考上圖和文檔中的相關說明,我們可以得到下面的知識點: 

  1. ARM一共有37個寄存器。31個普通寄存器,包括一個程式計數器(PC)。6個狀态寄存器。這些寄存器都是32位的。 
  2. 普通寄存器,31個:從R0~R14,再加一個PC,共16個。圖中有的寄存器左下角有個三角号,例如R13_svc,這種寄存器一共15個,是以普通寄存器一共31個。在文檔的注釋中說明了這裡加三角号的已經說明了其含義:表示在user或者system模式下使用的某個寄存器被換成了異常模式下對應的特有的寄存器替換了。例如use模式下的R14在不同的異常模式下分别被R14_svc,R14_abt,R14_und,R14_irq和R14_fiq等替換了。是以一共31個。
  3. 程式狀态6個:cpsr和spsr_svc,spsr_abt,spsr_und,spsr_irq,spsr_fiq。
  4. 在文檔的A2.4 節介紹通用寄存器R0到R15可以分為三組:不分組:R0~R7,分組的R8~R14,而R15,程式計數器,也就是PC指針。
  5. R13,R14和R15三個寄存器有特殊的功能,使用非常頻。文檔45頁第一行說明R13一般是作為堆棧指針寄存器,也即SP。R14(又稱為連結寄存器LR),它常記錄傳回位址,在正常情況下儲存函數的傳回位址,而發生異常時,R14作為異常傳回位址.R15,PC指針,程式計數器。
  6. 程式狀态計數器:隻有在異常模式下才同時有CPSR和SPSR。SPSR的作用是在發生異常時将狀态儲存下來,例如CPSR的狀态,異常處理完了之後,再将SPSR的内容寫回到CPSR中。

程式狀态寄存器是一個比較特殊的寄存器,每個資料位都代表特定的含義,在一般的彙編語言或者微機原理書中也會介紹這些内容。

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

這裡隻介紹其中比較常用的幾個,對于N,Z,I,F四個位,隻要記住下面幾句話就可以了:

N:表示比較結果正負的,例如,假設N記錄的是A-B的結果,如果A<B,則N為1,如果A>=B,則N為0.

Z:也是表示結果正負的,但是隻有A=B時 才為1。

I位為1時,IRQ是禁用的。 F位為1,折FIQ是禁用的。

最低的0~4位,組合表示工作模式,具體設定為:

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

是以,綜上所示,寄存器的基礎知識可以總結為下面的表:

ARM是個什麼鬼1.ARM簡介2.ARM的工作模式3.ARM的寄存器4.ARM的尋址方式

4.ARM的尋址方式

所謂尋址方式就是處理器根據指定中給出的細膩來找到指令所需要操作數的方式。 尋址方式的種類很多,不同計算機的書中的描述的都不太一緻,不同的處理器也不太一樣,但是不管怎麼分,以下幾種是都通用的:

1.立即數尋址

立即數尋址,是一種特殊的尋址方式,操作數本身就在指令中給出,隻要取出指令也就取到了操作數。這個操作數被稱為立即數,對應的尋址方式也就叫做立即數尋址。例如以下指令:

ADD R0,R0,#0x3f ;表示R0←R0+0x3f

在以上兩條指令中,第二個源操作數即為立即數,要求以“#”為字首。

2.寄存器尋址

寄存器尋址就是利用寄存器中的數值作為操作數,這種尋址方式是一種執行效率較高的尋址方式。

ADD R0,R1,R2 ;R0←R1+R2

該指令的執行效果是将寄存器R1和R2的内容相加,其結果存放在寄存器R0中。

3.寄存器間接尋址

寄存器間接尋址就是寄存器中的存放的是操作數在記憶體中的位址。例如以下指令:

 LDR R0, [R2] ;R0← [R2]

在第一條指令中,以寄存器R2的值作為操作數的位址,在存儲器中取得一個操作數後與R1相加,結果存入寄存器R0中。第二條指令将以R1的值為位址的存儲器中的資料傳送到R0中。 

4.基址變址尋址

基址變址尋址就是将寄存器裡的内容(基位址)與指令中給出的位址偏移量相加,進而得到操作數在記憶體中的位址。其實這種方式隻是寄存器簡介尋址的擴充而已,如果這裡的立即數是0,不就一樣了嗎。

LDR R0 [R1,#4]; R0<-[R1+4]

5.相對尋址

與基址變址尋址方式相類似,相對尋址PC指針的目前值為基位址,指令中的位址标号作為偏移量,将兩者相加之後得到操作數的有效位址。以下程式段完成子程式的調用和傳回,跳轉指令BL采用了相對尋址方式:

BL NEXT ;跳轉到子程式NEXT處執行

……

NEXT

……

MOV PC,LR ;從子程式傳回