arm指令解釋


 

指令格式:  指令{條件}{S} {目的Register}{OP1}{OP2}

"{ }"中的內容可選。即,可以不帶條件只有目的寄存器,或

只有目的寄存器和操作數1,也可以同時包含所有選項。“S” 決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值

 

助記符

英文全稱

示例、功能

B

Branch

B  Label   ;程序無條件跳轉到標號Label處執行

BL

Branch with Link

BL Label ;當程序無條件跳轉到標號Label處執行時,同時將當前的PC值保存到R14

BLX

Branch with Link and exchange

BLX  Label;從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態由ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存到寄存器R14中

BX

Branch and exchange

BX  Label;跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令

 

 

 

 

 

 

 

 

 

 

MOV

Move

MOV R1,R0,LSL#3 ;將寄存器R0的值左移3位后傳送到R1

MVN

Move NOT

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

CMP

Compare

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

CMN

Compare negative

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

TST

Test

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

TEQ

Test equivalence

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

ADD

Add

ADD R0,R2,R3,LSL#1      R0 = R2 + (R3 << 1)

ADC

Add with carry

ADCS   R2,R6,R10; R2 = R6R10!C,且更新CPSR的進位標志位

SUB

Subtract

SUB  R0,R1,#256      R0 = R1 – 256

SBC

Subtract with carry

SUBS R0,R1,R2; R0 = R1 - R2 - C,並根據結果設置CPSR的進位標志位

RSB

Reverse subtract

RSB R0,R1,R2;R0 = R2 – R1

RSC

Reverse subtract with carry

RSC R0,R1,R2      R0 = R2 – R1 - C

AND

And

AND R0,R0,#3;該指令保持R001位,其余位清零。

ORR

OR

ORR R0,R0,#3;該指令設置R001位,其余位保持不變。

EOR

Exclusive OR

EOR R0,R0,#3 ;該指令反轉R001位,其余位保持不變。

BIC

Bit clear

BIC R0,R0,#0b1011;該指令清除 R0 中的位 01、和 3,其余的位保持不變。

CLZ

Count left zero

計算操作數最高端0的個數

 

MUL

Multiply

MUL R0,R1,R2     ;R0 = R1 × R2

MLA

Multiply and accumulate

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

SMULL

Signed multiply long

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

SMLAL

Signed mul l and accumulate l

SMLAL  R0,R1,R2,R3       R0 =R2 × R3)的低32位+R0; R1 =R2 × R3)的高32位+ R1

UMULL

Unsigned multiply long

UMULL  R0,R1,R2,R3     ;R0 = R2 × R3)的低32位;R1 =R2 × R3)的高32

UMLAL

Unsigned mul&accumulate lon

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

PSR

訪問

MRS

Move PSR to register

MRS R0,CPSR;傳送CPSR的內容到R0

MSR

Move register to PSR

MSR CPSR_c ,R0;傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域

加載/

存儲

指令

LDR

Load word

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

LDRB

Load byte

LDRB R0,[R1,#8] ;將存儲器地址為R18的字節數據讀入R0,並將R0的高24位清零

LDRH

Load half word

LDRH  R0,[R1];將存儲器地址為R1的半字數據讀入寄存器R0,並將R0的高16位清零

LDM

Load multiple

LDMFD  R13!,{R0,R4-R12,PC};將堆棧內容恢復到寄存器(R0R4R12LR

STR

Store

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

STRB

Store byte

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

STRH

Store half word

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

STM

Store multiple

STMFD R13!,{R0,R4-R12,LR}      ;將寄存器列表中的寄存器(R0R4R12LR)存入堆棧

數據

交換

SWP

Swap word

SWP R0,R1,[R2];R2所指的字數據傳送到R0,同時R1的數據傳送到R2所指的單元

SWPB

Swap byte

SWPB R0,R1,[R2] ;R2所指的字節數據傳送到R0R024位清零,同時R18位送R2所指單元。

LSL

Logic shift left

MOV  R0, R1, LSL#2(ASL#2) ;將R1中的內容左移兩位后傳送到R0,低位用0填充

ASL

Arithmetic shift left

LSR

Logic shift right

MOV R0, R1, LSR#2 ;將R1中的內容右移兩位后傳送到R0中,左端用零來填充

ASR

Arithmetic shift right

MOV R0, R1, ASR#2 ;將R1中的內容右移兩位后傳送到R0中,左端用第31位的值來填充

ROR

Rotate right

MOV R0, R1, ROR#2       ;將R1中的內容循環右移兩位后傳送到R0

RRX

Rotate right extended

左端用進位標志位C來填充

協處

理器

CDP

Data operations

 

LDC

Load

 

STC

Store

 

MCR

Move to coproc fr ARM reg

 

MRC

M to ARM reg fr coprocessor

 

 

PSR field

F (Flags field mask byte)

S (Stats field mask byte)

X (Extension field mask byte)

C (control field mask byte)

CPSR

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

意義

N

Z

C

V

Q

DNZ (RAZ) 系統擴展用

I

F

T

M4

M3

M2

M1

M0

 

CPSR

各位

詳細

意義

N

 

當前指令運算結果為負時,N = 1; 結果為非負時,N = 0

Z

 

運算結果為0Z1;否則Z0

C

 

上溢出、進位C1;下溢出、借位C0

V

 

加減法V1表示符號位溢出

I

 

I1時,禁止IRQ中斷

F

 

F1時,禁止FIQ中斷

T

 

T0ARM指令;T1Thumb指令

M[4:0]

0b10000

User

0b10001

FIQ

0b10010

IRQ

0b10011

Supervisor

0b10111

Abort

0b11011

Undefined

0b11111

System

 

                                                                   

指令

格式

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Cond

 

 

 

Opcode

S

Rn

Rd

Shift_operand

opcode

 

指令操作符編碼

S

 

決定指令的操作是否影響CPSR的值

Rd

 

目標寄存器編碼

Rn

 

包含第一個操作數的寄存器編碼

Shift_oprand

 

表示第二個操作數

Cond

 

指令執行的條件編碼,詳細如下所示

 

 

 

 

 

 

EQ

Z=1

Equal

NE

Z=0

Not equal, or unordered

CS/HS

C=1

Carry set / Unsigned higher or same

Great than or equal, or unordered

CC/LO

C=0

Carry clear / Unsigned lower

Less than

MI

N=1

Negative

Less than

PL

N=0

Positive or zero

Greater than or equal , or unordered

VS

V=1

Overflow

Unordered

VC

V=0

No overflow

Not unordered

HI

C=1且Z=0

Unsigned higher

Greater than, or unordered

LS

C=0或Z=1

Unsigned lower or same

Less than or equal

GE

N=1且V=1 或N=0且V=0

Signed greater than or equal

Greater than or equal

LT

N=1且V=0 或N=0且V=1

Signed less than

Less than , or unordered

GT

Z=0或N=V

Signed greater than

Great than

LE

Z=1或N!=V

Signed less than or equal

Less than or equal , or unordered

AL

 

Always (normally omitted)

 

並行

指令

前綴

S

 

Signed arithmetic modulo 28 or 216 ,sets CPSR GE bit

Q

 

Signed saturating arithmetic

SH

 

Signed arithmetic, halving results

U

 

Unsigned arithmetic modulo 28 or 216 ,sets CPSR GE bit

UQ

 

Unsigned saturating arithmetic

UH

 

Unsigned arithmetic ,halving results

批量

傳輸

地址

模式

Block load / store

Stack pop / push

IA

Increment after

FD

Full descending

IB

Increment before

ED

Empty descending

DA

Decrement after

FA

Full ascending

DB

Decrement before

EA

Empty ascending

 

 

ARM

指令

尋址

方式

立即尋址

ADD     R0,R0,#0x3f

R0←R0+0x3f

寄存器尋址

ADD     R0,R1,R2

R0←R1+R2

間接尋址

ADD R0,R1,[R2]

R0←R1+[R2]

變址尋址

LDR R0,[R1,#4]

R0←[R1+4]

LDR R0,[R1,#4]!

R0←[R1+4]、R1←R1+4

LDR R0,[R1] ,#4

R0←[R1]、R1←R1+4

LDR R0,[R1,R2]

R0←[R1+R2]

多寄存器尋址

LDMIA R0,{R1,R2,R3,R4}

R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]

 

偽指令及偽操作

 

符號

定義

 

 

GBLA / LCLA

定義一個全局 / 局部的數字變量,並初始化為0

GBLL / LCLL

定義一個全局 / 局部的邏輯變量,並初始化為F(假)

GBLS / LCLS

定義一個全局 / 局部的字符串變量,並初始化為空

SETA / SETL / SETS

給一個數學 / 邏輯 / 字符串變量賦值

RLIST

對一個通用寄存器列表定義名稱,訪問次序為根據寄存器的編號由低到高,與排列次序無關

數據

定義

 

DCB(=)/ DCWDCWU

分配一片連續的字節 / 半字存儲單元並用指定的數據初始化

后綴U表示不要求對齊

DCFS(DCFSU)/DCFD(DCFDU)

分配一片連續的(單 / 雙精度的浮點數)字存儲單元並用指定的數據初始化

DCQ(DCQU)/DCD(DCDU)

用於分配一片以雙字 / 字為單位的連續的存儲單元並用指定的數據初始化

DCDO

分配字內存但願,初始化為標號基於靜態基址寄存器R9的偏移量

DCI

和DCD類似,不同處在於DCI內存中的數據被標識為指令

SPACE(%)

DataSpace  SPACE  100 ;分配連續100字節的存儲單元並初始化為0

MAP(^)

MAP 0x100,R0 ;定義結構化內存表首地址的值為0x100+R0

FIELD(#

A FIELD 16  ;定義A的長度為16字節

 

 

 

控制

指令

IF、ELSE、ENDIF

IF     邏輯表達式

        指令序列1

ELSE

        指令序列2

ENDIF

IFELSEENDIF偽指令能根據條件的成立與否決定是否執行某個指令序列。

IF后面的邏輯表達式為真,則執行指令序列1,否則執行指令序列2。其中,

ELSE及指令序列2可以沒有,此時,當IF后面的邏輯表達式為真,則執行

指令序列1,否則繼續執行后面的指令。

 

WHILE、WEND

WHILE    邏輯表達式

        指令序列

WEND

WHILEWEND偽指令能根據條件的成立與否決定是否循環執行某個指令序列。當WHILE后面的邏輯表達式為真,則執行指令序列,該指令序列執行完畢后,再判斷邏輯表達式的值,若為真則繼續執行,一直到邏輯表達式的值為假。

MACRO、MEND

MEXIT

MACRO

$標號宏名 $參數1$參數2,……指令序列

MEND

$標號在宏指令被展開時,標號會被替換為用戶定義的符號,

宏指令可以使用一個或多個參數,當宏指令被展開時,這些參數被相應的值替換。

MEXIT用於從宏定義中跳轉出去

 

AREA

AREA     段名       屬性1,屬性2,……

用於定義一個代碼段或數據段。其中,段名若以數字開頭,則該段名需用“|”括起來,如|1_test|

 

ALIGN

AREA Init,CODE,ALIEN=3

指定后面的指令為8字節對齊

 

CODE

CODE16、CODE32

指定指令序列為16位的Thumb指令或32位的ARM指令

 

ENTRY

 

在一個完整的匯編程序中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),但在一個源文件里最多只能有一個ENTRY(可以沒有)。

 

EQU(*)

名稱 EQU 表達式 {,類型}

為程序中的常量、標號等定義一個等效的字符名稱

 

EXPORT

EXPORT           標號

用於在聲明一個全局的標號,該標號可在其他的文件中引用。EXPORT可用GLOBAL代替。

 

IMPORT

IMPORT           標號

用於通知編譯器要使用的標號在其他的源文件中定義,無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中

 

EXTERN

EXTERN      標號

用於通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,如果當前源文件實際未引用該標號,該標號就不會被加入到當前源文件的符號表中

 

GET

GET           文件名

將一個源文件包含到當前的源文件中,並將被包含的源文件在當前位置進行匯編處理

 

INCBIN

INCBIN        文件名

INCBIN偽指令用於將一個目標文件或數據文件包含到當前的源文件中,被包含的文件不作任何變動的存放在當前文件中,編譯器從其后開始繼續處理

 

RN

名稱           RN       表達式

RN偽指令用於給一個寄存器定義一個別名

 

ROUT

{名稱}   ROUT

ROUT偽指令用於給一個局部變量定義作用范圍。在程序中未使用該偽指令時,局部變量的作用范圍為所在的AREA,而使用ROUT后,局部變量的作為范圍為當前ROUT和下一個ROUT之間。

                                                                               

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM