日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM 汇编指令集

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM 汇编指令集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寄存器

寄存器的寄存器用于數據處理及控制。

如內存中數據處理,需先從內存中加載數據到寄存器中,處理完畢后,再把寄存器的數據存放到內存中。

寄存器組擁有16個寄存器,R0R12是通用寄存器,R13R15是特殊寄存器。

寄存器作用comment
R0~R7通用寄存器-Low register16 bits 指令
R8~12通用寄存器-Hig Register16 bits 指令 + 32 bits 指令
R13Stack Pointer-SPMSP:(Main stack pointer) 復位默認的SP指針,PSP:(Process stack pointer):進入線程后的指針
R14Link Register-LC函數調用時,會首先將LC的值存入堆棧中,用于保存返回地址,當調用函數完畢后,將LC的值賦給PC。
R15Program 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標志
EQEqual
NENot Equal
LTLesser Than
GTGreat 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 內存訪問

根據數據的傳輸方向,傳輸數據的大小,有如下的指令。

預鎖引尋址數據的傳輸的內存地址是寄存器的值與立即數的值的總和。這個立即數的值可正可負。LDRB R0,[R1,#0x1234]; 從內存地址Ro+0x1234中讀取一個byte,然后放入RO寄存器中。LDRB R0, [R1,#0x1234]! 從內存地址Ro+0x1234中讀取一個byte,然后放入RO寄存器中。同時R1的值更新為R1+0x1234Note:指令中!表明指令完成后,地址需要被更新。LDRD R0, R1,[R2,#0x5]; 從內存地中R2+0x5中讀取2個bytes,然后放入R0,R1寄存器中。STRD R0,R1,[R2,#0x05]; 把R0,R1的值寫入內存R2+0x05中 寄存器尋址LDR R0, [R1,R2, LSL #2]; 從內存地址R1 + (R2<<2)中讀取一個字到R0中。STR R0,[R1,R2]; 把R0的值寫入地址R1+R2中。 LDR R0, R1,#0x05; 從內存地址為R1的值的內存中讀取數據到R0中,并更新R1 = R1+5. 連續讀/寫多個寄存器從一個連續的地址空間內。 LDM指令 Load multiple registers STM指令 Store multiple registerLDR R4,=0x8000; 設值R4的值為0x8000.LDMIA R4, {R0-R3}; 讀取4個words并且把他們依次存取到R0,R1,R2,R3中。寄存器組的設置是靈活的;如{R1,R3,R5-R7,R9,R10-R12}. 堆棧操作:PUSH {R0, R4-R7, LC}; push R0,R4,R5,R6,R7進去堆棧POP {R2, R3};POP R2,R3從堆棧里。通常PUSH與POP指令是成對出現,且寄存器列表是一致的。 如 PUSH {R0, R4-R7, LC}; push R0,R4,R5,R6,R7進去堆棧 POP{R0, R4-R7, PC}; 恢復R4_R7,直接把LC的值賦給PC。LC返回的是函數執行的地址,返回的LC會直接賦值給PC,所以可以直接POP LC的值給PC

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 << 0x03

6 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,#0x37.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中。

總結

以上是生活随笔為你收集整理的ARM 汇编指令集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。