ARM指令集 --RISC精简指令集
匯編語言是與硬件接觸的美妙語言,同時匯編語言又可以和C語言高度契合,在深入理解嵌入式時,匯編語言是一條不可忽略的一條道路。就像是記憶關(guān)鍵字一樣記憶ARM的指令集,是一項必備的知識。
ARM處理器支持ARM指令集,也支持16位的Thumb指令集,從ARMv6開始,新的ARM處理器支持16/32位的Thumb-2指令集(ARMv7-M僅支持Thumb-2)。ARM指令集使用標準的,固定長度的32位指令格式,ARM處理器是RISC結(jié)構(gòu)。
1.指令總結(jié)
ARM微處理器的指令集可以分為分支指令,數(shù)據(jù)處理指令,程序狀態(tài)存儲器指令,加載/存儲指令,協(xié)處理器指令和異常產(chǎn)生指令共有六大類。
跳轉(zhuǎn)指令
| B | 跳轉(zhuǎn)指令 |
| BL | 帶返回的跳轉(zhuǎn) |
| BLX | 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令 |
| BX | 帶狀態(tài)切換的跳轉(zhuǎn)指令 |
| CBZ | 比較(Compare),如果結(jié)果為零(Zero)就轉(zhuǎn)移(只能跳到后面的指令) |
| CBNZ | ?比較,如果結(jié)果非零(Non Zero)就轉(zhuǎn)移(只能跳到后面的指令) |
?
?數(shù)據(jù)處理指令
| MOV | 數(shù)據(jù)傳送指令 | 數(shù)據(jù)傳送類 |
| SWP | 交換指令 | 交換類 |
| CMP | 比較指令 | 比較類 |
| CMN | 比較反值指令 |
| TEQ | 相等測試指令 | 測試指令 |
| TST | 位測試指令 |
| AND | 邏輯與指令 | 邏輯運算類 |
| BIC | 位清零指令 | |
| EOR | 異或指令 | |
| ORR | 邏輯或指令 |
| ADC | 帶進位加法指令 | 算術(shù)運算類 |
| ADD | 加法指令 | |
| MLA | 乘加運算指令 | |
| MUL | 32位乘法指令 | |
| MLA | 32位乘加指令 | |
| RSB | 逆向減法指令 | |
| RSC | 帶借位的逆向減法指令 | |
| SBC | 帶借位減法指令 | |
| SUB | 減法指令 |
程序狀態(tài)寄存器處理指令
| MRS | 傳送CPSR或SPSR數(shù)據(jù)到通用寄存器指令 |
| MSR | 傳送通用寄存器數(shù)據(jù)到CPSR或SPSR指令 |
加載/存儲指令
| LDC | 存儲器到協(xié)處理器的數(shù)據(jù)傳送指令 |
| LDM | 加載多個寄存器指令 |
| LDR | 存儲器到寄存器的數(shù)據(jù)傳送指令 |
| STM | 批量內(nèi)存字寫入指令 |
| STR | 寄存器到存儲器的數(shù)據(jù)傳送指令 |
協(xié)處理器指令類
| CDP | 協(xié)處理器數(shù)據(jù)操作指令 |
| MCR | 從寄存器到協(xié)處理器的數(shù)據(jù)傳送指令 |
| MRC | 從協(xié)處理器到寄存器的數(shù)據(jù)傳送指令 |
| STC | 協(xié)處理器寄存器寫入存儲器指令 |
異常產(chǎn)生指令類
| BKPT | 斷點中斷指令 |
| SWI | 軟件中斷指令 |
?2.指令條件域及條件碼
當處理器工作在ARM狀態(tài)時,指令根據(jù)CPSR中的條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當指令的執(zhí)行條件滿足,指令被執(zhí)行,反之指令被忽略。每一條ARM指令包含4位的條件碼,位于指令的最高4位【31::28】。條件碼理論上有16種,實際上有15種可以使用。每種條件碼用兩個字符表示,可以添加在指令助記符后面與指令同時使用。
跳轉(zhuǎn)指令B可以加上后綴EQ變?yōu)锽EQ表示“相等則跳轉(zhuǎn)”,既當CPSR中的Z標志置位時發(fā)生跳轉(zhuǎn)。
| 條件碼 | 助記符后綴 | 標志 | 含義 |
| 0000 | EQ | Z置位 | 相等 |
| 0001 | NE | Z清零 | 不相等 |
| 0010 | CS | C置位 | 無符號數(shù)大于或等于 |
| 0011 | CC | C清零 | 無符號數(shù)小于 |
| 0100 | MI | N置位 | 負數(shù) |
| 0101 | PL | N清零 | 正數(shù)或零 |
| 0110 | VS | V置位 | 溢出 |
| 0111 | VC | V清零 | 未溢出 |
| 1000 | HI | C置位Z清零 | 無符號數(shù)大于 |
| 1001 | LS | C清零Z置位 | 無符號數(shù)小于或等于 |
| 1010 | GE | N等于V | 帶符號數(shù)大于或等于 |
| 1011 | LT | N不等于V | 帶符號數(shù)小于 |
| 1100 | GT | Z清零且(N等于V) | 帶符號數(shù)大于 |
| 1101 | LE | Z置位或(N不等于V) | 帶符號數(shù)小于或等于 |
| 1110 | AL | 忽略 | 無條件執(zhí)行 |
3.移位操作符
| LSL | 邏輯左移 | MOV R0,R1,LSL#2 |
| ASL | 算術(shù)左移 | MOV R0,R2,ASL#2 |
| LSR | 邏輯右移 | MOV R0,R1,LSR#2 |
| ASR | 算術(shù)右移 | MOV R0,R2,ASR#2 |
| ROR | 循環(huán)右移(內(nèi)容循環(huán)右移) | MOV R0,R1,ROR#2 |
| RRX | 擴展的循環(huán)右移(擴展到C標志) | MOV R0,R1,RRX#2 |
4.批量數(shù)據(jù)傳送類型
| IA | IB | DA | DB |
| 傳送后地址加 | 傳送前地址加 | 傳送后地址減 | 傳送前地址減 |
| LDMIA R0,{R1,R2,R3-R7} | |||
5.異常中斷指令
| SWI | 軟件中斷指令 | SWI{cond} imm24 |
| BKPT | 斷點中斷指令(保存斷點信息) | BKRT imm16 |
6.ARM處理器支持的偽指令
| ADR | 相對偏移地址加載到通用寄存器中 | ADR{cond} Rd,expr |
| LDR | 用于一個32位常數(shù)的加載或地址的加載 | LDR{cond} Rd,=[expr|bael-expr] |
| NOP | 空操作,延時 | NOP |
| ? | ? | ? |
7.ARM編譯器支持的偽指令
| 符號定義偽指令 | GBLA 全局變量名 | 定義一個全局數(shù)值變量,并初始化為0 |
| GBLL 全局變量名 | 定義一個全局邏輯變量,并初始化為F | |
| GBLS 全局變量名 | 定義一個全局字符變量,并初始化為空 | |
| LCLA 局部變量名 | 定義一個局部數(shù)值變量,并初始化為0 | |
| LCLL 局部變量名 | 定義一個局部邏輯變量,并初始化為F | |
| LCLS 局部變量名 | 定義一個局部字符變量,并初始化為空 | |
| 變量名 SETA 表達式 | 給一個數(shù)值變量賦值 | |
| 變量名 SETL 表達式 | 給一個邏輯變量賦值 | |
| 變量名 SETS 表達式 | 給一個字符變量賦值 | |
| 名稱 RLIST {寄存器列表} | 對一個通用寄存器列表定義名稱 | |
| 數(shù)據(jù)定義偽指令 | 標號 DCB 表達式 | 分配一片連續(xù)的字節(jié)存儲單元并對數(shù)據(jù)初始化 |
| 標號 DCW 表達式 | 分配一片連續(xù)的半字節(jié)存儲單元并對數(shù)據(jù)初始化 | |
| 標號 DCD 表達式 | 分配一片連續(xù)的字存儲單元并對數(shù)據(jù)初始化 | |
| 標號 DCQ 表達式 | 分配一片連續(xù)的雙字節(jié)存儲單元并對數(shù)據(jù)初始化 | |
| 匯編控制偽指令 | IF 邏輯表達式 ? 指令序列1 ELSE ? 指令序列2 ENDIF | ? |
| WHILE 邏輯表達式 ? 指令序列1 WEND | ? | |
| 其他偽指令 | AREA 段名,屬性1,屬性2,···· CODE 屬性 DATA ?屬性 READONLY 屬性 READWRITE 屬性 ALLGN 屬性 COMMON? | 定義一個代碼段或數(shù)據(jù)段 定義一個代碼段,默認只讀READONLY 定義一個數(shù)據(jù)段,可讀寫READWRITE 只讀 讀寫 對齊方式,按照2^ALLGN直接對齊 通用段屬性 |
| CODE16 CODE32 | 指令一下指令為16位Thumb指令代碼 指示以下指令為32位ARM指令代碼 | |
| ENTRY | 匯編語言程序入口 | |
| END | 匯編語言程序結(jié)束 | |
| 名稱 EQU 表達式 [,類型] | 等于偽指令 | |
| EXPORT 標號 | 全部標號聲明偽指令 | |
| IMPORT 標號 | 引入一個標號偽指令 | |
| EXTERN 標號 | 外部標號引用聲明偽指令 |
(保留補充RT-Thread的context_rvds.s文件片段解析)
ARM寄存器組織表<傳送門>
總結(jié)
以上是生活随笔為你收集整理的ARM指令集 --RISC精简指令集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM指令集与Thumb指令集
- 下一篇: Linux 开发者最应该知道的命令汇总