ARM架構支持跨大範圍性能點的實現。ARM處理器的架構簡單性致使了很是小的實現,而小的實現意味着設備能夠具備很是低的功耗。實現大小、性能和很是低的功耗是ARM體系結構的關鍵屬性。程序員
ARM架構是一個精簡指令集計算機(RISC)架構,由於它包含了這些RISC架構特性:小程序
此外,ARM架構還提供:緩存
這些對基本RISC體系結構的加強意味着ARM處理器實現了高性能、小程序大小、低功耗和小硅區之間的良好平衡。安全
本體系結構參考手冊定義了一組實現必須遵循的行爲,以及一組軟件使用實現的規則。它沒有描述如何構建實現。架構
除非體系結構指定不一樣,不然實現的程序員可見行爲必須與程序的簡單順序執行相同。這種程序員可見的行爲不包括程序的執行時間。ide
指令集:性能
ARM指令集是一組32位指令,提供全面的數據處理和控制功能。學習
Thumb 指令集是做爲一個16位指令集開發的,帶有ARM指令集功能的子集。它提供了顯著提升的代碼密度,但性能有所下降。執行拇指指令的處理器能夠更改成執行ARM指令來處理性能關鍵段,特別是處理中斷。優化
ARMv6T2引入了Thumb-2技術。該技術使用許多32位指令擴展了原始Thumb指令集。ARMv6T2中包含的32位Thumb指令的範圍容許拇指代碼實現與ARM代碼相似的性能,代碼密度比早期的Thumb代碼更好。spa
在ARMv6T2中,ARM和Thumb指令集提供了幾乎相同的功能。
體系結構版本、概要文件和變體:
自引入以來,ARM體系結構已經發生了顯著的變化,而且ARM還在繼續開發它。到目前爲止,已經定義了該體系結構的7個主要版本,用版本號I到7表示。其中,前三個版本如今已通過時了。
ARMv7提供了三個概要文件:
ARMv7-A :
ARMv7-R :實時配置文件
ARMv7-M :在ARMv7-M體系結構參考手冊中描述的 微控制器配置文件:
A1.5 The ARM memory model
ARM指令將地址設置爲232個8位字節的單向地址空間。這個地址空間也被認爲是230個32位 字 或231個16位 半字 。
該架構提供如下設施:
A2.2 ARM core data types and arithmetic
加載和存儲操做能夠向內存傳輸字節、半字或字。加載字節或半字零擴展或符號擴展數據,如在適當的加載指令中指定的那樣。
指令集包括加載和存儲操做,這些操做將兩個或多個單詞從內存中傳輸到內存。軟件可使用這些指令加載和存儲雙單詞。
B1.3.1 ARM processor modes
模式更改能夠在軟件控制下進行,也能夠由外部或內部異常引發。
Notes on the ARM processor modes
User mode
操做系統以用戶模式運行應用程序,以限制系統資源的使用。以用戶模式執行的軟件在PLO上執行。用戶模式下的執行有時被描述爲無特權執行。應用程序一般在用戶模式下執行,任何程序在用戶模式下執行:
System mode
以系統模式執行的軟件在PLI上執行。系統模式具備與用戶模式相同的可用寄存器,而且不會由任何異常輸入。
Supervisor mode
管理器模式是執行SVC(管理器調用)指令生成一個管理器調用異常的默認模式,該異常被帶到管理器模式。
處理器在重置時進入管理模式。
Abort mode
停止模式是執行數據停止異常或預取停止異常的默認模式。
Undefined mode
未定義模式是執行與指令相關的異常(包括任何執行未定義指令的嘗試)的默認模式。
FIQ mode
FIO模式是執行FIO中斷的默認模式。
IRQ mode
IRQ模式是IRQ中斷的默認模式。
Hyp mode
Hyp模式是非安全的PL2模式,做爲虛擬化擴展的一部分實現。
Hypervisor調用異常和Hyp Trap異常是做爲虛擬化擴展的一部分實現的異常,它們老是在Hyp模式下執行。
Monitor mode
B1.3.2 ARM core registers
SP, the stack pointer
處理器使用SP做爲指向活動堆棧的指針。在拇指指令集中,大多數指令不能訪問SP。
惟一可以訪問SP的指令是那些設計成使用SP做爲堆棧指針的指令。
ARM指令集提供了對SP更通用的訪問,而且它能夠用做通用寄存器。然而。ARM不同意將SP用於除堆棧指針以外的任何用途。
LR, the link register
連接寄存器是一種特殊的寄存器,它能夠保存返回的連接信息。本手冊中描述的一些狀況要求使用LR。當軟件不須要LR進行連接時,它能夠將LR用於其餘目的。它能夠將LR稱爲R14。
PC, the program counter
執行ARM指令時,PC讀取當前指令加8的地址
執行Thumb指令時,PC讀取當前指令加4的地址
向PC寫入一個地址會致使該地址的分支。
大多數Thumb指令沒法訪問PC。
B1.3.3 Program Status Registers (PSRs)
開始學習彙編指令: A8 Instruction Descriptions
以 mov指令爲例:
32位數據爲編譯後的機器碼。
1 #include <stdio.h> 2 3 int main() 4 { 5 __asm__ __volatile__( 6 "nop\n" 7 "mov r0,#98\n" 8 "mov r0,#0xff0000\n" 9 "mov r0,#0xf000000f\n" 10 "nop\n" 11 12 13 ); 14 15 return 0; 16 }
反彙編後:
1 e320f000 nop {0} 2 e3a00062 mov r0, #98 ; 0x62 3 e3a008ff mov r0, #16711680 ; 0xff0000 4 e3a002ff mov r0, #-268435441 ; 0xf000000f 5 e320f000 nop {0}
分析:
1110 0011 1010 0000 0000 0000 0110 0010 //e3a00062
1110 0011 1010 0000 0000 1000 1111 1111 //e3a008ff 0xff0000 循環左移16位才能獲得小於256 再除以2 放在16位開始的位置
1110 0011 1010 0000 0000 0010 1111 1111 //e3a002ff 0xf000000f 循環左移4位,除以2 放在16位開始的位置
沒有條件:1110 None (AL) d
add、adc、sub、sbc、and、
mrs、msr
ldr、ldrh、ldrb
str、strh、strb