教材:嵌入式系統及應用,羅蕾、李允、陳麗蓉等,電子工業出版社
目錄:
- ARM 嵌入式微處理器指令集
- ARM 處理器實作的指令集
- ARM 指令集的特點
- Thumb 指令集的限制
- ARM v4T 架構指令體系
- 條件執行和标志位
- 資料處理指令
- 乘法和除法
- 分支指令
- 子程式調用
- 單寄存器的資料傳輸
- 批量加載存儲
- 交換指令
- 軟中斷指令
- 程式狀态寄存器通路指令
- 協處理器指令
- 協處理器資料操作指令
- 協處理器寄存器與 ARM 處理器寄存器資料傳輸指令
- 協處理器寄存器和記憶體的資料傳輸指令
- ARM 處理器實作的指令集
ARM 嵌入式微處理器指令集
ARM 處理器實作的指令集
- 32 位的 ARM 指令集和 16 位的 Thumb 指令集
- ARM 處理器允許在 ARM 狀态和 Thumb 狀态之間進行切換和互操作,保證使用者在運算性能和代碼密度之間的選擇的靈活性
- 采用 16 位的 Thumb 指令集優勢在于更高的代碼密度和降低功耗
- Thumb 指令集的代碼一般是由編譯器生成的而不是手動編寫出來的
ARM 指令集的特點
- 所有 ARM 指令都是 32 位定長的,記憶體中位址以 4 位元組邊界對齊,故 ARM 指令的有效位址最後兩位總是 00
- 加載 - 存儲架構。除了專門的加載 - 存儲類型的指令可以通路記憶體外,其餘指令使用處理器内部寄存器的資料和立即數作為操作數
- 提供一次加載和存儲多個寄存器的指令:LDM 和 STM。這樣,發生過程調用和中斷處理時,隻用一條指令即可把多個寄存器的内容儲存到記憶體堆棧中
- CPU 核心硬體中提供了桶形移位器,移位操作可以内嵌在其他指令中,即一條指令可在一個指令周期完成一個移位操作和一個 ALU 操作
- 所有 ARM 指令都可以條件執行,其指令高四位是條件訓示位,根據 CPSR 寄存器中的N、Z、C、V 決定該指令是否執行
Thumb 指令集的限制
- 不使用條件執行,标志總是根據指令結果設定
- 源寄存器和目标寄存器相同
- 不使用 R8~R12 寄存器,隻用低端寄存器
- 指令中出現的常量有大小的限制
- 不在指令中使用内嵌的桶形移位器
ARM v4T 架構指令體系
條件執行和标志位
- 通過在指令後加上合适的條件标志位,ARM 指令可以條件執行
- 減少了分支指令數目,增強了指令的代碼密度和性能
- 比較指令(CMP)預設影響标志位
- 資料處理指令預設不會影響條件标志位,但是可在指令後加“S”(或其它條件位的)字尾,以實作标志位的置位
- 條件執行的例子
- 指令條件碼
資料處理指令
- 算術運算: ADD ADC SUB SBC RSB RSC
- 邏輯運算: AND ORR EOR BIC
- 比較運算: CMP CMN TST TEQ
- 資料傳送: MOV MVN
- 通用文法:
<Operation>{<cond>}{S} Rd, Rn, Operand2
- 第二個操作數可以為一個寄存器或者一個立即數,對應最低的 12 個有效位
- 比較指令和資料傳送指令不指定 Rn
- 第二個操作數可以通過桶型移位器傳輸到 ALU
-
第二個操作數采用寄存器方式
可附加移位操作,移位的值可為 5 位的無符号整數(0~31),或者是其他寄存器的最低位元組
-
第二個操作數是立即數
需滿足是 0~255 的 8 位立即數或者是通過一個 8 位的立即數循環右移偶數位得到的數(4 位的移位數乘以 2 組成了步長,範圍在0-30 的移位值 )
-
- 加載 32 位常數
,推薦用這種方式将常數加載到寄存器LDR rd, =const
乘法和除法
- 産生 32 位結果的乘法
MUL r0, r1, r2 ; r0 = r1 * r2 MLA r0, r1, r2, r3 ; r0 = (r1 * r2) + r3
- 産生 64 位結果的乘法(分無符号乘和有符号乘)
[U|S]MULL r4, r5, r2, r3 ; r5:r4 = r2 * r3 [U|S]MLAL r4, r5, r2, r3 ; r5:r4 = (r2 * r3) + r5:r4
- 大多數的 ARM 核不提供整數除法指令,除法操作由 C 的庫函數例程或者移位操作實作
分支指令
- 實作程式的跳轉,格式:
(子函數調用時加上 {L})B{L}{<cond>} label
-
在指令編碼中是一個 24 位的位址,在執行時它被左移兩位 ( ARM 指令是字對齊的),産生一個 26 位的偏移位址,跳轉範圍在目前指令位址 -32MB ~ 32MB 中label
- 執行該指令會引起流水線的清空
子程式調用
- 需要儲存傳回位址并且跳轉到子程式的首位址
- 這些步驟可以由一條指令
完成BL
- 傳回位址被儲存在連結寄存器 (LR寄存器/r14)中
- 分支跳轉到 +/- 32MB 範圍内的任何位址
- 子程式在執行的最後重新加載 LR 寄存器的内容至 PC 寄存器
單寄存器的資料傳輸
- 用于存儲器和核心寄存器之間的資料傳輸
-
指令 功能 LDR STR 加載/存儲字 LDRB STRB 加載/存儲位元組 LDRH STRH 加載/存儲半字 LDRSB 加載有符号的位元組 LDRSH 加載有符号的半字 - 文法
LDR{<cond>}{<size>} Rd, <address>
STR{<cond>}{<size>} Rd, <address>
- 指令中的位址通過一個基址寄存器和一個偏移量來确定
- 對于字和無符号的位元組通路, 偏移量可以為
- 無符号的 12 位立即數(0 ~ 4095 位元組),
LDR r0, [r1, #8]
- 一個寄存器,可附加的對其進行移位,
LDR r0, [r1, r2, LSL#2]
- 對于半字和有符号的位元組通路, 偏移量可以為
- 一個 8 位的立即數 (0 - 255 bytes)
- 一個寄存器 (不可以被移位)
-
前序尋址和後序尋址
後序尋址的方式下基址寄存器的質自動更新,前序尋址不會更新,除非加上
'!'
- 通過 LDR 指令實作跳轉
- 直接将任意的 32 位位址加載到 PC 中,實作 4GB 位址空間内的跳轉
-
LDR pc, =label ; 将标号的位址加載到PC中
批量加載/存儲
- 文法:
<LDMxx|STMxx>{<cond>}<addressing_mode> Rb{!}, <register list>
-
指令 位址模式 堆棧工作方式 LDMIA/STMIA 訪存後位址增加(Increment After, IA) 空遞增 LDMIB / STMIB 訪存前位址增加(Increment Before, IB) 滿遞增 LDMDA / STMDA 訪存後位址遞減(Decrement After, DA) 空遞減 LDMDB / STMDB 訪存前位址遞減(Decrement Before, DB) 滿遞減 - 差別
- 批量加載/存儲指令常常用來實作堆棧的操作
- STMFD:push 操作,FD 意為滿遞減(Full Decrement),實際對應 STMDB 指令
- LDMFD:pop 操作,實際對應 LDMIA 指令
- 寄存器在壓棧時的順序始終是最低編号寄存器的内容壓入最低位址的堆棧空間,被指定的寄存器順序是無效的
交換指令
- 記憶體和寄存器之間傳送一個位元組或字的原子操作(不可被打斷),先讀取記憶體後寫記憶體
- 操作期間阻止其他任何指令對該存儲單元的讀/寫,可用于實作信号量和互斥操作
-
SWP{<cond>}{B} Rd, Rm, [Rn]
- Rd 是目的寄存器,從存儲器中讀到的值存放于此寄存器中
- Rm 寄存器是操作數,會将此寄存器中的值存放于存儲單元中
- [Rn] 是寄存器間接尋址,Rn 儲存的是某個存儲單元的位址
- 不能由 ARM 編譯器編譯進階語言程式得到,隻能手工編寫彙編指令實作
軟中斷指令
- 引起了一個異常自陷, 跳轉到軟中斷異常向量
- 軟中斷處理例程檢查軟中斷号以決定如何處理該号中斷
- 通過軟中斷這種機制,作業系統可以實作一個特權操作集合,它們可被使用者模式下的應用代碼調用
- 文法:
SWI{<cond>} <SWI number>
程式狀态寄存器通路指令
- MRS / MSR 指令用于在 CPSR / SPSR 寄存器與通用寄存器之間傳輸資料
- 通過寫CPSR寄存器,可以開關中斷、改變處理器模式
- 使用一個讀/修改/寫的操作序列
-
MRS r0,CPSR ; 将 CPSR 的内容讀至 r0 BIC r0,r0,#0x80 ; 将第7位清零以允許IRQ中斷 MSR CPSR_c,r0 ; 将修改後的值僅寫入‘c’位元組
- 在使用者模式下, 所有的位都可以被讀出來,但是僅有條件标志位(F)可以被改變
協處理器指令
- ARM 體系支援16個協處理器
- 每個協處理器的指令集都占據了 ARM 指令集的固定部分
- 如果系統中沒有某個協處理器, 那麼就會觸發未定義指令異常
協處理器資料操作指令
- CDP : 初始化協處理器的資料處理操作
協處理器寄存器與 ARM 處理器寄存器資料傳輸指令
- MRC : 協處理器寄存器到ARM 處理器寄存器的資料傳輸指令
- MCR : ARM 處理器寄存器到協處理器寄存器的資料傳輸指令
協處理器寄存器和記憶體的資料傳輸指令
- LDC : 協處理器資料加載指令
- STC : 協處理器資料存儲指令