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 = R6+R10+!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 ; 該指令保持R0的0、1位,其餘位清零。

 

ORR

OR

邏輯或操作指令

ORR R0,R0,#3 ; 該指令設置R0的0、1位,其餘位保持不變。

 

EOR

Exclusive OR

邏輯異或操作指令

EOR R0,R0,#3 ; 該指令反轉R0的0、1位,其餘位保持不變。

 

BIC

Bit clear

位清除指令

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

 

CLZ

Count left zero

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

 

 

MUL

Multiply

32位乘法指令

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

 

MLA

Multiply and accumulate

32位乘加指令

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

 

SMULL

Signed multiply long

64位有符號數乘法指令

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

 

SMLAL

Signed mul l and accumulate l

64位有符號數乘加指令

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

 

UMULL

Unsigned multiply long

64位無符號數乘法指令

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

 

UMLAL

Unsigned mul&accumulate lon

64位無符號數乘法指令

UMLAL   R0,R1,R2,R3  ;R0 =(R2 × R3)的低位+R0;R1 =(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,並將新地址R1+R2寫入R1。

 

LDRB

Load byte

字節數據加載指令

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

 

LDRH

Load half word

半字數據加載指令

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

 

LDM

Load multiple

批量數據加載指令

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

 

STR

Store

字數據存儲指令

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

 

STRB

Store byte

字節數據加載存儲指令

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

 

STRH

Store half word

半字數據存儲指令

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

 

STM

Store multiple

批量數據存儲指令

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

 

數據

交換

SWP

Swap word

字數據交換指令

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

 

SWPB

Swap byte

字節數據交換指令

SWPB R0,R1,[R2] ;R2所指的字節數據傳送到R0,R0高24位清零,同時R1低8位送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

 

運算結果爲0,Z=1;否則Z=0

 

C

 

上溢出、進位C=1;下溢出、借位C=0

 

V

 

加減法V=1表示符號位溢出

 

I

 

I=1時,禁止IRQ中斷

 

F

 

F=1時,禁止FIQ中斷

 

T

 

T=0,ARM指令;T=1,Thumb指令

 

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(=)/ DCW(DCWU)

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

後綴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

IF、ELSE、ENDIF僞指令能根據條件的成立與否決定是否執行某個指令序列。

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

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

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

 

 

WHILE、WEND

WHILE    邏輯表達式

     指令序列

WEND

WHILE、WEND僞指令能根據條件的成立與否決定是否循環執行某個指令序列。當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之間。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章