ARM指令集小記

Arm七種操作模式:

用戶(usr)、系統(sys)、快中斷(fiq)、中斷(irq)、管理(svc)、中止(abt)、未定義(und

MOV         R1R0                      ;將寄存器R0的值傳送到寄存器R1

MOV         PCR14                     ;將寄存器R14的值傳送到PC,常用於子程序返回

MOV         R1R0LSL3           ;將寄存器R0的值左移3位後傳送到R1

 

MVN    R0,#0            ;將立即數0取反傳送到寄存器R0中,完成後R0=-1

CMP R1R0   ;將寄存器R1的值與寄存器R0的值相減,並根據結果設置CPSR的標誌位

CMP R1,#100      ;將寄存器R1的值與立即數100相減,並根據結果設置CPSR的標誌位

 

CMN R1R0   ;將寄存器R1的值與寄存器R0的值相加,並根據結果設置CPSR的標誌位

CMN R1,#100     ;將寄存器R1的值與立即數100相加,並根據結果設置CPSR的標誌位

 

TST指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標誌位的值。操作數1是要測試的數據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。

TST   R1,#%1       ;用於測試在寄存器R1中是否設置了最低位(%表示二進制數)

TST   R1,#0xffe    ;將寄存器R1值與立即數0xffe按位與,並根據結果設置CPSR的標誌位

 

TEQ指令用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,並根據運算結果更新CPSR中條件標誌位的值。該指令通常用於比較操作數1和操作數2是否相等。

TEQ  R1R2    ;將寄存器R1值與寄存器R2的值按位異或,並根據結果設置CPSR的標誌位

 

ADD         R0R1R2                    R0 = R1 + R2

ADD         R0R1#16               R0 = R1 + 16

ADD         R0R2R3LSL#1          R0 = R2 + (R3 << 1)

 

以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7R4,第二個數由高到低存放在寄存器R11R8,運算結果由高到低存放在寄存器R3R0

ADDS R0R4R8                 加低端的字

ADCS R1R5R9                  加第二個字,帶進位

ADCS R2R6R10                 加第三個字,帶進位

ADC  R3R7R11               加第四個字,帶進位

 

SUB          R0R1R2              R0 = R1 - R2

SUB          R0R1#16          R0 = R1 - 16

SUB          R0R2R3LSL#1          R0 = R2 - (R3 << 1)

SUBS        R8,R6,#240                  R8=R6-240,影響CPSR

SUBS    PC,LR,#0X4                      PC=LR-4,CPSR=SPSR

 

SBC指令用於把操作數1減去操作數2,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。該指令使用進位標誌來表示借位,這樣就可以做大於32位的減法。

SBC          R0R1R2 R0 = R1 - R2 - C,並根據結果設置CPSR的進位標誌位

 

RSB          R0R1R2              R0 = R2 – R1

RSB          R0R1#16          R0 = 16 – R1

RSB          R0R2R3LSL#1     R0 = (R3 << 1) - R2

 

RSC指令用於把操作數2減去操作數1,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。

RSC          R0R1R2                 R0 = R2 – R1 - C

 

該指令常用於屏蔽操作數1的某些位 邏輯與運算

AND   R0R0,#3                        該指令保持R001位,其餘位清零。

 

該指令常用於設置操作數1的某些位 邏輯或運算

ORR   R0R0,#3              該指令設置R001位,其餘位保持不變。

 

EOR指令用於在兩個操作數上進行邏輯異或運算。

EOR  R0R0,#3             該指令反轉R001位,其餘位保持不變。

 

BIC指令用於清除操作數1的某些位,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。操作數232位的掩碼,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不變。

BIC           R0R0,#%1011        該指令清除 R0 中的位 013,其餘的位保持不變。

 

MUL           R0R1R2                 R0 = R1 × R2

MULS  R0R1R2                         R0 = R1 × R2,同時設置CPSR中的相關條件標誌位

 

MLA R0R1R2R3                  R0=R1×R2+R3

MLAS R0R1R2R3                  R0=R1×R2+R3,同時設置CPSR中的相關條件標誌位

 

SMULL  R0R1R2R3    R0=R2 × R3)的低32位,R1 = R2 × R3)的高32

SMLAL R0R1R2R3 R0 =R2 × R3)的低32位+R0R1 =R2×R3)的高32位+R1

 

UMULL R0R1R2R3       R0 = R2 × R3)的低32R1 = R2 × R3)的高32

UMLAL R0R1R2R3       R0 =R2 × R3)低32位+R0R1 =R2 × R3)的高32位+R1

 

LDR          R0[R1]                    ;將存儲器地址爲R1的字數據讀入寄存器R0

LDR          R0[R1R2]                ;將存儲器地址爲R1+R2的字數據讀入寄存器R0

LDR          R0[R1,#8]               ;將存儲器地址爲R1+8的字數據讀入寄存器R0

LDR     R0[R1R2]           ;將存儲器地址爲R1+R2的字數據讀入寄存器R0,並將新

     ;地址R1R2寫入R1

LDR     R0[R1]R2                    ;將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址

     R1R2寫入R1

LDR          R0[R1R2LSL2]!  ;將存儲器地址爲R1R2×4的字數據讀入

                                         ;寄存器R0,並將新地址R1R2×4寫入R1

LDR          R0[R1]R2LSL2   ;將存儲器地址爲R1的字數據讀入寄存器R0

                                         ;並將新地址R1R2×4寫入R1

 

LDRB R0[R1]                            ;將存儲器地址爲R1的字節數據讀入寄存器R0,  ;並將R0的高24位清零。

LDRB  R0[R1,#8]         ;將存儲器地址爲R18的字節數據讀入寄存器R0

                                        ;並將R0的高24位清零。

 

LDRH R0[R1]                          ;將存儲器地址爲R1的半字數據讀入寄存器R0

                                         ;並將R0的高16位清零。

LDRH R0[R1,#8]                ;將存儲器地址爲R18的半字數據讀入寄存器R0

                                         ;並將R0的高16位清零。

LDRH R0[R1R2]                  ;將存儲器地址爲R1R2的半字數據讀入寄存器R0

                                         ;並將R0的高16位清零。

 

STR  R0[R1],#8                   ;將R0中的字數據寫入以R1爲地址的存儲器中,並將新                                        ;地址R18寫入R1

STR  R0[R1,#8]                   ;將R0中的字數據寫入以R18爲地址的存儲器中。

 

STRB     R0[R1]                   ;將R0中的低8位字節數據寫入以R1爲地址的存儲器中。

STRB         R0[R1,#8]        ;將R0中的低8位字節數據寫入以R18爲地址的存儲器中。

 

STRH  R0[R1]                          ;將寄存器R0中的半字數據寫入以R1爲地址的存儲器中。

STRH  R0[R1,#8]            ;將寄存器R0中的半字數據寫入以R18爲地址的存儲器中。

 

{}爲可選後綴,若選用該後綴,則當數據傳送完畢之後,將最後的地址寫入基址寄存器,否則基址寄存器的內容不改變;

基址寄存器不允許爲R15,寄存器列表可以爲R0R15的任意組合;

{}爲可選後綴,當指令爲LDM且寄存器列表中包含R15,選用該後綴時表示:除了正常的數據傳送之外,還將SPSR複製到CPSR。同時,該後綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當前模式下的寄存器。

STMFD  R13!{R0R4-R12LR}                 ;將寄存器列表中的寄存器

                                              ;(R0R4R12LR)存入堆棧。

LDMFD  R13!{R0R4-R12PC}                 ;將堆棧內容恢復到寄存器

                                              ;(R0R4R12PC)。

LDMFD  R13!{R0R4-R12PC}           ;將堆棧內容寄存                                  R0R4R12PC同時SPSR複製到CPSR

 

SWP R0R1[R2]      R0<-[R2],R1->[R2]

SWP R0R0[R1]      R0ßà[R1]    

SWPB R0R1[R2]      ;將R2所指向的存儲器中的字節數據傳送到R0R0的高24位清零,

                                        ;同時將R1中的低8位數據傳送到R2所指向的存儲單元。

SWPB R0R0[R1]        ;該指令完成將R1所指向的存儲器中的字節數據與R0中的                                                8數據交換。 

 

MRS R0CPSR                  ;傳送CPSR的內容到R0

MRS R0SPSR                   ;傳送SPSR的內容到R0

發佈了40 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章