ARM 汇编指令集
寄存器
寄存器的寄存器用于數據處理及控制。
如內存中數據處理,需先從內存中加載數據到寄存器中,處理完畢后,再把寄存器的數據存放到內存中。
寄存器組擁有16個寄存器,R0R12是通用寄存器,R13R15是特殊寄存器。
| R0~R7 | 通用寄存器-Low register | 16 bits 指令 |
| R8~12 | 通用寄存器-Hig Register | 16 bits 指令 + 32 bits 指令 |
| R13 | Stack Pointer-SP | MSP:(Main stack pointer) 復位默認的SP指針,PSP:(Process stack pointer):進入線程后的指針 |
| R14 | Link Register-LC | 函數調用時,會首先將LC的值存入堆棧中,用于保存返回地址,當調用函數完畢后,將LC的值賦給PC。 |
| R15 | Program conutner | 當前執行指令的地址 |
Thumb2 指令集:可以16bits指令與32位指令的混合使用。
ARM匯編指令語法格式:
label mnemonic operand1, operand2, ....;commentslabel 標簽用以表示一個參考地址。Label放在指令前,Label用以表達指令的地址。Label也可以用以表達數據的地址。mnemonic助記符,助記符是指令的名字,。operand操作數有,操作可以是立即數,也可以是寄存器,操作數的個數視具體匯編指令。;comment 注釋eg: MOVS R0, #0x12 ; Set R0 = 0x12 (hexadecimal) MOVS R1, #’A’ ; Set R1 = ASCII character A后綴
ARM處理器匯編器中,一些指令支持帶后綴,常用的后綴如下:
| S | 需要更新APSR標志 |
| EQ | Equal |
| NE | Not Equal |
| LT | Lesser Than |
| GT | Great Than |
| .N | 使用16位指令集 |
| .W | 使用32位指令集 |
匯編指令集:
1 Moving data within the processor 數據拷貝
MOV R4, R0 ; 從R0拷貝數據到R4。 MOV R4,[R0]; 從R0數據指向的地址中讀取數據到R4; MOVS R4, R0; 從R0拷貝數據到R4,更新APSR。 MOVS R4, [R0}; 從R0數據指向的地址中拷貝數據到R4,更新APSR。eg:MOV R4, #0x34; R4的值設置為0x34 MOVS R4, #0x34; R4的值設置為0x34,更新APSR(move word指令) MOVW R4, #0x1234; 把16位立即數放到寄存器的低16位,高16位清零 。(若執行指令前R4的值為全為F,執行完畢后,R4的值為0x00001234) MOVT R4, #0x1234; 把16位立即數放到寄存器的高16位,低16位不變。(若執行指令前R4的值為0x00001234,執行完畢后,R4的值為0x12341234)MVN R4, R0; 對R0按位取反,然后放入R4中。MSR CONTROL, R2; 把狀態寄存器的值放到通用寄存器中。 MRS R2, CONTROL; 把通用寄存器的值放到狀態寄存器中。Notes:
移動8bits內的數據使用MOV指令;
移動8bits~16bits的數據使用MOVW/MOVT指令
移動32bits的數據;使用LDR指令;如LDR R0. 0x12345678;Set R0 to 0x12345678
2 Memory access 內存訪問
根據數據的傳輸方向,傳輸數據的大小,有如下的指令。
3 Arithmetic operations 算數操作
算數加 addition ADD R0, R0, R2 ; R0 = R0 + R2 ADDS R0, R0, R2 ; R0 = R0 + R2,更新APSRADD RO, R1,#0x5; RO = R0 +5; ADDS RO, R1,#0x4‘ RO = R0 +5;更新APSRADC(ADD with carry) ADC RO,R1, R2; R0 = R1 + R2 + carry ADC R0, #0x3; R0 = R0 + 3 + carry算數減 subtraction SUB R0, R1, R2; R0 = R1 - R2 SUB R0, #3; R0 = R0 -3 SUB R0, R1, #5; R0 = R1 -5SBC R0, R1, R2; R0 = R1 - R2 - borrow逆向算數減 Reserve subtraction RSB R0, R1, R2; R0 = R2 - R1 RSB R0, R1, #0x55; R0 = 0x55 - R1算數乘 multiply MUL RO, R1, R2 ; R0 = R1 * R2算數除法 divide UDIV R0, R1, R2; R0 = R1/R2 (unsigned) SDIV R0, R1, R2; R0 = R1/R2 (Signed)4 Logic opeations 邏輯操作
邏輯按位與 & and AND R0, R1; R0 = R0 & R1 AND R0, R1, R2; R0 = R1 & R2 AND R0, R1, #3; R0 = R1 & 3按位或 | or ORR R0, R1; R0 = R0 | R1 ORR R0, R1, R2; R0 = R1 | R2 ORR R0, R1, #3 R0 = R1 | 3按位清除 bit clear BIC R0, R1; R0 = R0 & ~R1 BIC R0, R1, R2; R0 = R1 & ~R2 BIC R0, R1, #3; R0 = R1 &~3按位異或 bitwise exclusive or EOR R0,R1; R0 = R0 ^ R1;5 Shift and rotate instruction 移動旋轉操作
算術右移 Arithmetic shift right ASR R0, R1; R0 = R0 >> R1 ASR R0, R1, R2 R0 = R1 >> R2 ASR R0, R1, #0x3 R0 = R1 >> 0x3邏輯右移動 Logic shift right LSR R0, R1; R0 = R0 >> R1 LSR R0, R1, R2; R0 = R1 >> R2 LSR R0, R1, #0x3 R0 = R1 >> 3邏輯左移動 Logic Shift Left LSL R0, R1; R0 = R0 << R1 LSL R0, R1, R2; R0 = R1 << R2 LSL R0, R1, #0x3 R0 = R1 << 0x036 Bit-Filed operation instruction 位操作指令
6.1 BFC(Bit filed cler)LDR R0, = 0x1234FFFFBFC R0,#4,#8; #4代表其實的bit,#8代表c戶里的bit長度;指令完畢后 R0 = 0x1234F00F6.2 BFI(Bit filed insert)命令格式: BFI R0, R1, #lsb, #width該命令會從R1中拷貝width指定的bit到R0的LSB指定的位置。 LDR R0, = 0x12345678LDR R1, = 0x3355AACCBFI R0, R1, #8, #16;命令執行完畢R0 = 0x335678CC;7 Compare and Test instruction 比較與測試指令
7.1 CMP - compareCMP R0, R1; 計算R0-R1,更新APSRCMP R0,#0x5; 計算R0-3,更新APSR7.2 CMN- Compare negtiveCMP R0, R1; 計算R0+R1;更新APSRCMP R0,#0x3; 計算R0+3;更新APSR7.3 TST-bitwise ANDTST R0, R1; TST R0,#0x3; 7.4 TE!-bitwise XORTEQ R0, R1; TEQ R0,#0x3;比較與測試指令會更新APSR的標志位,用于選擇分支或者條件執行。
8 Program flow control 程序流程控制
用于條件分支;函數調用;條件執行
8.1 函數調用BL Label; Branch and link instruction-跳轉到Label指定的地址并且保存返回值在LR中函數調用時,如果函數有三個參數,會把參數依次放進R0,R1,R2中,如果函數有返回值會把返回值放進R0中。 eg:8.2 條件分支B<Conditon> Label; 跳轉到Label如果滿足條件。8.3 用于循環的 指令CBZ Compare and Branch if ZeroCBNZ Compare and branch if not Zero8.4 IT If-Then 指令待更新函數調用流程:
C語言定義如下代碼
BL Label; Branch and link instruction-跳轉到Label指定的地址并且保存返回值在LR中 函數調用時.
調用帶參的函數時,如果函數有三個參數,會把參數依次放進R0,R1,R2中,如果函數有返回值會把返回值放進R0中。
如果有倆個參數,會把參數依次放進R0,R1中。
總結