ARM指令系統及匯編程序設計_第1頁
ARM指令系統及匯編程序設計_第2頁
ARM指令系統及匯編程序設計_第3頁
ARM指令系統及匯編程序設計_第4頁
ARM指令系統及匯編程序設計_第5頁
已閱讀5頁,還剩225頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARM指令系統及匯編程序設計

ARM指令系統及匯編程序設計

1ARM指令系統

2THUMB指令系統

3ATPCS介紹

4ARM和THUMB混合調用

ARM匯編程序設計

JARM指令系統

■跳轉指令

-數據處理指令

■程序狀態寄存器訪問指令

-Load/Store加載/存儲數據指令

■協處理器指令

■異常產生指令

ARM指令系統

—、跳轉指令

指令用于實現程序流程的跳轉,在ARM程序中有兩種方

法可以實現程序流程的跳轉:

t■使用專門的跳轉指令。

-直接向程序計數器PC(R15)寫入跳轉地址值一長跳轉

■ARM指令集中的跳轉指令可以完成從當前指令向前或向后的

32MB的地址空間的跳轉,包括以下4條指令:

■B跳轉指令

■BL帶返回的跳轉指令(R15->R14)

■BLX帶返回和狀態切換的跳轉指令

(ARM->Thumb,PCLR)

■BX帶狀態切換的跳轉指令(ARM??>Thumb)

ARM指令系統

&B指令

■B指令的格式為:

B{條件}目標地址

■B指令是最簡單的跳轉指令。一旦遇到一個B指令,ARM處理

器將立即跳轉到給定的目標地址,從那里繼續執行。注意存儲在

跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一

個絕對地址,它的值由匯編器來計算。它是24位有符號數,左

移兩位后有符號擴展為32位,表示的有效偏移為26位(前后

+/-32MB的地址空間)。如:

BLabel/*程序無條件跳轉到標號Label處執行*/

ARM指令系統

&BL指令

丁指令的格式為:

BL{條件}目標地址

-BL是另一個跳轉指令,但跳轉之前,會在寄存器R14中

保存PC的當前內容,因此,可以通過將R14的內容重新

加載到PC中,來返回到跳轉指令之后的那個指令處執行。

該指令是實現子程序調用的一個基本但常用的手段。以下

指令:

BLLabel

/*當程序無條件跳轉到標號Label處執行時,同時將

當前的PC值保存到R14中*/

ARM指令系統

]||BLX指令

-BLX指令的格式為:

BLX目標地址

-BLX指令從ARM指令集跳轉到指令中所指定的目

標地址,并將處理器的工作狀態由ARM狀態切換

至UThumb狀態,該指令同時將PC的當前內容保

存到寄存器R14中。因此,當子程序使用Thumb

指令集,而調用者使用ARM指令集時,可以通過

BLX指令實現子程序的調用和處理器工作狀態的

切換。同時,子程序的返回可以通過將寄存器

R14值復制到PC中來完成。

ARM指令系統

&BX指令

■BX指令的格式為:

BX{條件}目標地址

■BX指令跳轉到指令中所指定的目標地址,

目標地址處的指令既可以是ARM指令,也

可以是Thumb指令。

ARM指令系統

】■二、數據處理指令

■數據處理指令可分為數據傳送指令、算術邏輯運

算指令和比較指令等。

-數據傳送指令用于在寄存器和存儲器之間進行數

據的雙向傳輸。

-算術邏輯運算指令完成常用的算術與邏輯的運算,

該類指令不但將運算結果保存在目的寄存器中,

同時更新CPSR中的相應條件標志位。

-比較指令不保存運算結果,只更新CPSR中相應

的條件標志位。

ARM指令系統

1數據處理指令一靈活的第二操作數

■如:ADD<cond}{S}^RdzRnfOperand2

信5定S,則根據操作結果更新

□Operand2可能的形式:條俾石標志

?#immed_8r立即數

>Rm<,shift}寄存器

ADDrO,rl,#100RO=r1+100

ADDrO,r工,r2TRO=r1+r2

門+陰算術右移一位)

ADDrO,rlzr2zASR#1R°=

ARM指令系統

數據處理指令一Shift移位模式

ASRn算術右移n位(l<=n<=32)

LSLn邏輯左移n位(l<=n<=32)

LSRn邏輯右移n位(l<=n<=32)

RORn循環右移n位(l<=n<=32)

RRX帶擴展的循環右移1位

type(type=ASR/LSL/LSR/ROR)

ARM指令系統

ASR和ASL

■算術右移n位即Rm中的內容除以2的n次方。將

原來的位[31]拷貝到寄存器左邊的n位中,即空

出的最高位補符號位。

■算術左移n位即Rm中的內容乘以2的n次方。將

原來的位[31]拷貝到CPSR的C位中,寄存器右

邊的n位清零。

ARM指令系統

LSR和LSL

-邏輯右移n位,即將Rm的內容除以2的n次方。

寄存器左邊的n位清零。

-邏輯左移n位,即將Rm的內容乘以2的n次方。

寄存器右邊的n位清零。

ARM指令系統

^|ROR_____

循環右移n位,把寄存器右邊的n位移動到結果

的左邊n位。

ARM指令系統

RRX

帶擴展的循環右移將Rm的內容循環右移一位。

進位標志拷貝到Rm的位31。

ARM指令系統

移位指令(操作)

■ARM微處理器內嵌的桶型移位器(BarrelShifter),支

持數據的各種移位操作,移位操作在ARM指令集中不作

為單獨的指令使用,它只能作為指令格式中的一個字段,

在匯編語言中表示為指令中的選項。例如,數據處理指令

的第二個操作數為寄存器時,就可以加入移位操作選項對

它進行各種移位操作。移位操作包括如下6種類型,ASL

和LSL是等價的,可以自由互換:

LSL邏輯左移ASL算術左移

LSR邏輯右移ASR算術右移

ROR循環右移RRX帶擴展的循環右移

ARM指令系統

當LSL(或ASL)操作

■LSL(或ASL)操作的格式為:

通用寄存器,LSL(或ASL)操作數

■LSL(或ASL)可完成對通用寄存器中的內容進行邏輯

(或算術)的左移操作,按操作數所指定的數量向左移位,

低位用零來填充。其中,操作數可以是通用寄存器,也可

以是立即數(0?3工)。

MOVRO,RI,LSL#2

ARM指令系統

[SR操作

■LSR操作的格式為:

通用寄存器,LSR操作數

■LSR可完成對通用寄存器中的內容進行右移的操作,按操

作數所指定的數量向右移位,左端用零來填充。其中,操

作數可以是通用寄存器,也可以是立即數(0?31)。

MOVRO,RI,LSR#2

ARM指令系統

&ASR操作

-ASR操作的格式為:

通用寄存器,ASR操作數

-ASR可完成對通用寄存器中的內容進行右移的操作,按操

作數所指定的數量向右移位,左端用第31位的值來填充。

其中,操作數可以是通用寄存器,也可以是立即數(0~

31)o

MOVRO,RlzASR#2

ARM指令系統

3ROR操作

-ROR操作的格式為:

通用寄存器,ROR操作數

-ROR可完成對通用寄存器中的內容進行循環右移

的操作,按操作數所指定的數量向右循環移位,

左端用右端移出的位來填充。其中,操作數可以

是通用寄存器,也可以是立即數(0?31)。顯

然,當進行32位的循環右移操作時,通用寄存器

中的值不改變。

MOVRO,RI,ROR#2

ARM指令系統

操作

■RRX操作的格式為:

通用寄存器,RRX操作數

■RRX可完成對通用寄存器中的內容進行帶擴展的循環右移

的操作,按操作數所指定的數量向右循環移位,左端用進

位標志位C來填充。其中,操作數可以是通用寄存器,也

可以是立即數(0?31)。

MOVRO,RI,RRX#2

ARM指令系統

MOV指令

-MOV指令的格式為:

MOV(條件}{S}目的寄存器,源操作數

-MOV指令可完成從另一個寄存器、被移位的寄存器,或

將一個立即數加載到目的寄存器。其中s選項決定指令的

操作是否影響CPSR中條件標志位的值,當沒有S時指令

不更新CPSR中條件標志位的值。指令示例:

MOVRLR0

MOVR,RO,LSL#3

ARM指令系統

MVN指令

-MVN指令的格式為:

MVN{條件>{S}目的寄存器,源操作數

-MVN指令可完成從另一個寄存器、被移位的寄存器、或

將一個立即數加載到目的寄存器。與MOV指令不同之處

是在傳送之前按位被取反了,即把一個被取反的值傳送到

目的寄存器中。其中S決定指令的操作是否影響CPSR中

條件標志位的值,當沒有S時指令不更新CPSR中條件標

志位的值。

MVNR0,#0

ARM指令系統

,CMP指令

FCMP指令的格式為:

CMP{條件}操作數工,操作數2

■CMP指令用于把一個寄存器的內容和另一個寄存器的內

容或立即數進行比較,同時更新CPSR中條件標志位的值。

該指令進行一次減法運算,但不存儲結果,只更改條件標

志位。標志位表示的是操作數工與操作數2的關系(大、小、

相等),例如,當操作數工大于操作操作數2,則此后的有

GT后綴(大于)的指令將可以執行。

CMPRI,R0;將寄存器R1的值與寄存器R0的值相減,并

根據結果設置CPSR的標志位

CMPR1,#100;將寄存器R1的值與立即數100相減,并

根據結果設置CPSR的標志位

ARM指令系統

&CMN指令

-CMN指令的格式為:

CMN{條件}操作數1,操作數2

■CMN指令用于把一個寄存器的內容和另一個寄存器內容

或立即數取反后進行比較,同時更新CPSR中條件標志位

的值。該指令實際完成操作數1和操作數2相加,并根據

結果更改條件標志位。

CMNRI,R0;將寄存器R1的值與寄存器R0的值相加,并

根據結果設置CPSR的標志位

CMNR1,#工00;將寄存器R1的值與立即數100相加,并

根據結果設置CPSR的標志位

ARM指令系統

jgTST指令

■TST指令的格式為:

TST{條件}操作數工,操作數2

■TST指令用于把一個寄存器的內容和另一個寄存器的內容

或立即數進行按位的與運算,并根據運算結果更新CPSR

中條件標志位的值。操作數工是要測試的數據,而操作數

2是一個位掩碼,該指令一般用來檢測是否設置了特定的

位。經過測試后,如果匹配則設置Zero標志,否則清除

它。

TSTR1,#1

TSTRI,#Oxffe

ARM指令系統

&TEQ指令

-TEQ指令的格式為:

TEQ{條件}操作數工,操作數2

■TEQ指令用于把一個寄存器的內容和另一個寄存器的內容

或立即數進行按位的異或運算,并根據運算結果更新

CPSR中條件標志位的值。該指令通常用于比較操作數工

和操作數2是否相等。

TEQRI,R2

ARM指令系統

ADD指令

■ADD指令的格式為:

ADD{條件}{S}目的寄存器,操作數1,操作數2

■ADD指令用于把兩個操作數相加,并將結果存放到目的

寄存器中。操作數工應是一個寄存器,操作數2可以是一

個寄存器、被移位的寄存器、或一個立即數。

ADDRO,RI.R2

ADDRO,RI,#256

ADDRO,R2,R3,LSL#1

ARM指令系統

IADC指令

-加卜指令的格式為:-

ADC{條件}{S}目的寄存器,操作數1,操作數2

■ADC指令用于把兩個操作數相加,再加上CPSR中C條件標志位

的值,并將結果放到目的寄存器中。操作數工應是一個寄存器,

操作數2可以是一個寄存器、被移位的寄存器、或一個立即數。

,以下指令序列完成兩個128位數的加法,第一個數存放在寄存器

R7?R4,第二個數存放在寄存器R1工?R8,運算結果存放在寄

存器R3?R0:

ADDSRO,R4,R8;力口低端的字

ADCSRI,R5,R9;加第二個字,帶進位

ADCSR2,R6,R10;加第三個字,帶進位

ADCR3,R7,R11;力口第四個字,帶進位

ARM指令系統

&SUB指令

-SUB指令的格式為:

SUB{條件}{S}目的寄存器,操作數1,操作數2

-SUB指令用于把操作數工減去操作數2,并將結果存放到目的

寄存器中。操作數工應是一個寄存器,操作數2可以是一個寄

存器、被移位的寄存器、或一個立即數。該指令可用于有符

號數或無符號數的減法運算。

SUBRO,RI,R2;RO=RI-R2

SUBRO,RI,#256;RO=RI-256

SUBRO,R2,R3,LSL#1;RO=R2-(R3?1)

ARM指令系統

&SBC指令

-SBC指令的格式為:

SBG[條件}{S}目的寄存器,操作數1,操作數2

■SBC指令用于把操作數1減去操作數2,再減去CPSR中的

C條件標志位的反碼,并將結果存放到目的寄存器中。操

作數工應是一個寄存器,操作數2可以是一個寄存器、被

移位的寄存器、或一個立即數。

SBCSRO,RI,R2

ARM指令系統

RSB指令

-RSB指令的格式為:

RSB{條件}{S}目的寄存器,操作數1,操作數2

-RSB指令稱為逆向減法指令,用于把操作數2減去操作數

1,并將結果存放到目的寄存器中。操作數工應是一個寄

存器,操作數2可以是一個寄存器、被移位的寄存器、或

一個立即數。

RSBRO,RI,R2

RSBRO,R1,#256

RSBRO,R2,R3,LSL#1

ARM指令系統

RSC指令

■RSC指令的格式為:

RSC{條件}{S}目的寄存器,操作數工,操作數2

■RSC指令用于把操作數2減去操作數工,再減去CPSR中的

C條件標志位的反碼,并將結果存放到目的寄存器中。操

作數工應是一個寄存器,操作數2可以是一個寄存器、被

移位的寄存器、或一個立即數。該指令使用進位標志來表

示借位,這樣就可以做大于32位的減法,注意不要忘記

設置S后綴來更改進位標志O

RSCRO,RI,R2

ARM指令系統

AND指令

■AND指令的格式為:

AND{條件}{S}目的寄存器,操作數工,操作數2

■AND指令用于在兩個操作數上進行邏輯與運算,并把結

果放置到目的寄存器中。操作數工應是一個寄存器,操作

數2可以是一個寄存器、被移位的寄存器、或一個立即數。

該指令常用于屏蔽操作數工的某些位。

ANDRO,RO,#3

ARM指令系統

;ORR指令

■ORR指令的格式為:

ORR{條件}{S}目的寄存器,操作數工,操作數2

■ORR指令用于在兩個操作數上進行邏輯或運算,并把結

果放置到目的寄存器中。操作數工應是一個寄存器,操作

數2可以是一個寄存器,被移位的寄存器,或一個立即數。

該指令常用于設置操作數工的某些位。

ORRRO,R0,#3

ARM指令系統

EOR指令

■EOR指令的格式為:

EOR{條件>{S}目的寄存器,操作數工,操作數2

■EOR指令用于在兩個操作數上進行邏輯異或運算,并把結

果放置到目的寄存器中。操作數工應是一個寄存器,操作

數2可以是一個寄存器,被移位的寄存器,或一個立即數。

該指令常用于反轉操作數工的某些位。

EORRO,R0,#3

ARM指令系統

BIC指令

■BIC指令的格式為:

BIC{條件}{S}目的寄存器,操作數工,操作數2

■BIC指令用于清除操作數1的某些位,并把結果放置到目

的寄存器中。操作數工應是一個寄存器,操作數2可以是

一個寄存器,被移位的寄存器,或一個立即數。操作數2

為32位的掩碼,如果在掩碼中設置了某一位,則清除這

一位。未設置的掩碼位保持不變。

BICRO,RO,#OxOb

ARM指令系統

'乘法指令與乘加指令

GRM微處理器支持的乘法指令與乘加指令共有6條,可分

為運算結果為32位和運算結果為64位兩類,與前面的數

據處理指令不同,指令中的所有操作數、目的寄存器必須

為通用寄存器,不能對操作數使用立即數或被移位的寄存

器,同時,目的寄存器和操作數工必須是不同的寄存器。

■乘法指令與乘加指令共有以下6條:

■MUL32位乘法指令

■MLA32位乘加指令

■SMULL64位有符號數乘法指令

■SMLAL64位有符號數乘加指令

■UMULL64位無符號數乘法指令

■UMLAL64位無符號數乘加指令

ARM指令系統

MUL指令

■MUL指令的格式為:

MUL(條件}{S}目的寄存器,操作數1,操作數2

■MUL指令完成將操作數工與操作數2的乘法運算,并把結

果放置到目的寄存器中,同時可以根據運算結果設置

CPSR中相應的條件標志位。其中,操作數工和操作數2均

為32位的有符號數或無符號數。

MULRO,RI,R2

MULSRO,RI,R2

ARM指令系統

MLA指令

■MLA指令的格式為:

MLA{條件}{S}目的寄存器,操作數1,操作數2,操作數3

■MLA指令完成將操作數[與操作數2的乘法運算,再將乘積加

上操作數3,并把結果放置到目的寄存器中,同時可以根據運

算結果設置CPSR中相應的條件標志位。其中,操作數工和操

作數2均為32位的有符號數或無符號數。

MLARO,RLR2,R3

MLASRO,RI,R2,R3

ARM指令系統

SMULL指令

■SMULL指令的格式為:

SMULL{條件>{S}目的寄存器Low,目的寄存器High,

操作數工,操作數2

■SMULL指令完成將操作數工與操作數2的乘法運算,并把結

果的低32位放置到目的寄存器Low中,結果的高32位放置

到目的寄存器High中,同時可以根據運算結果設置CPSR中

相應的條件標志位。其中,操作數1和操作數2均為32位的

有符號數。

SMULLRO,RI,R2,R3

ARM指令系統

ISMLAL指令

%SMLAL指令的格式為:

-1LAL{條件}{S}I的寄存器Low,目的寄存器High,

操作數工,操作數2

■SMLAL指令完成將操作數1與操作數2的乘法運算,并把

結果的低32位同目的寄存器Low中的值相加后又放置到

目的寄存器Low中,結果的高32位同目的寄存器High中

的值相加后又放置到目的寄存器High中,同時可以根據

運算結果設置CPSR中相應的條件標志位。其中,操作數

1和操作數2均為32位的有符號數。

,對于目的寄存器Low,在指令執行前存放64位加數的低

32位,指令執行后存放結果的低32位。

,對于目的寄存器High,在指令執行前存放64位加數的高

32位,指令執行后存放結果的高32位。

SMLALRO,RI,R2,R3

ARM指令系統

UMULL指令

■UMULL指令的格式為:

UMULL{條件}<S}目的寄存器Low,目的寄存器High,

操作數1,操作數2

■UMULL指令完成將操作數工與操作數2的乘法運算,并把

結果的低32位放置到目的寄存器Low中,結果的高32位

放置到目的寄存器High中,同時可以根據運算結果設置

CPSR中相應的條件標志位。其中,操作數工和操作數2均

為32位的無符號數。

UMULLRO,RI,R2,R3

ARM指令系統

UMLAL指令

7.MLAL指令的格式為:

品LAL{條件}{S}目的寄存器Low,目的寄存器High,

操作數工,操作數2

-UMLAL指令完成將操作數工與操作數2的乘法運算,并把

結果的低32位同目的寄存器Low中的值相加后又放置到

目的寄存器Low中,結果的高32位同目的寄存器High中

的值相加后又放置到目的寄存器High中,同時可以根據

運算結果設置CPSR中相應的條件標志位。其中,操作數

1和操作數2均為32位的無符號數。

,對于目的寄存器Low,在指令執行前存放64位加數的低

32位,指令執行后存放結果的低32位。

,對于目的寄存器High,在指令執行前存放64位加數的高

32位,指令執行后存放結果的高32位。

UMLALRO,RI,R2,R3

ARM指令系統

三、程序狀態寄存器訪問指令

-ARM微處理器支持程序狀態寄存器訪問指令,

用于在程序狀態寄存器和通用寄存器之間傳送數

據,程序狀態寄存器訪問指令包括以下兩條:

>MRS程序狀態寄存器到通用寄存器的數據傳

送指令

>MSR通用寄存器到程序狀態寄存器的數據傳

送指令

三、程序狀態寄存器訪問指令

*程序狀態寄存器的每一位的安排

IRQdisable

ARM指令系統

程序狀態寄存器(PSR)處理指令MRS/MSR

RS狀態寄存器的內容讀取到通用寄存器

■MSR立即數或通用寄存器內容寫到狀態寄存器的指定區

MSR{cond}<PSR>_<fields>f#immed_8r

“MSR{cond}<PSR>_<fields>zrm

?fields:c控制域(PSR[7:0])

>x擴展域(PSR[15:8])

,s狀態域(PSR[23:[6])

》f標志域(PSR[3L24])

ARM指令系統

&MRS指令

KIRS指令的格式為:

MRS{條件}通用寄存器,程序狀態寄存器(CPSR或SPSR)

■MRS指令用于將程序狀態寄存器的內容傳送到通用寄存器

中。該指令一般用在以下幾種情況:

,當需要改變程序狀態寄存器的內容時,可用MRS將程序狀

態寄存器的內容讀入通用寄存器,修改后再寫回程序狀態寄

存器。

〃當在異常處理或進程切換時,需要保存程序狀態寄存器的值,

可先用該指令讀出程序狀態寄存器的值,然后保存。

MRSRO,CPSR

MRSRO,SPSR

ARM指令系統

MSR指令

一MSR指令的格式為:

MSR{條件}程序狀態寄存器(CPSR或SPSR)_V域,,操作數

■MSR指令用于將操作數的內容傳送到程序狀態寄衣器的特定域中。

其中,操作數可以為通用寄存器或立即數。v域>用于設置程序狀態

寄存器中需要操作的位,32位的程序狀態寄存器可分為4個域:

,位[3L24]為條件標志位域,用俵示;

>位[23:16]為狀態位域,用s表示;

>位口5:8]為擴展位域,用x表示;

>位[7:0]為控制位域,用c表示;

-該指令通常用于恢復或改變程序狀態寄存器的內容,在使用時,一般

要在MSR指令中指明將要操作的域。

MSRCPSR,R0

MSRCPSRc,R0

ARM指令系統

四、Load/Store加載/存儲數據指令

M微處理器支持加載/存儲指令用于在寄存器和存儲器之

間傳送數據,加載指令用于將存儲器中的數據傳送到寄存

器,存儲指令則完成相反的操作。常用的加載存儲指令如

下:

■LDR字數據加載指令LDRB字節數據加載指令

-LDRH半字數據加載指令STR字數據存儲指令

■STRB字節數據存儲指令STRH半字數據存儲指令

■LDM批量數據加載指令STM批量數據存儲指令

ARM指令系統

川載/存儲指令(LDR/STR/LDM/STM)

■LDR/STR采用寄存器間接尋址和基址變址尋址的方式

?零偏移;

>LDRrO,[rl]

>STRrO,[rl]

■程序相對偏移;

>LDRrO,=0x12345678

■后索引偏移;

>LDRrO,[rl3],#0x04

;r0^[rl3],rl3=rl3+0x04

ARM指令系統

L力口載/存儲藍(LDR/STR/LDM/STM)

■dr偽指令可以在立即數前加上=,以表示把一個地址寫到

某寄存器中。

LDRRlz=0x12345678

■如果這些數值不太復雜,就會用mov指令代替,比如:

Idrri,=0x00

■在編譯時就會變成:

movr工,#0x00

■如果這些數值很復雜,那么編譯時,這個數值會被保存在

某個地方,然后使用讀內存的指令進行讀取,比如:

LDRRlz=0x12345678

■在編譯時變成:

Idrrlz[pczxxxxx];這個xxx與pc相力口,剛好就

是some」ocate的地址--編譯器會幫你做好這一切

somelocate:.word0x12345678

ARM指令系統

力口載/存儲指令(LDR/STR/LDM/STM)

3?沒有“二”號,它表示“讀內存”。

■比如:

LDRRO,LED_TAB

LDRRlz=LED_TAB

LEDTAB:.word0x12345678

■RO的值是0x12345678,RI的值是LED_TAB標

號值,就是0x12345678在內存中存放朝地址

ARM指令系統

1加載/存儲指令(LDR/STR/LDM/STM)

■前索引偏移;

OP{cond}Rd,[Rn,offset]{!}

aOffset就是數據處理指令中的第二操作數;

>!為一個可選的后綴,即是否修改Rn

aRn為R15時不能選擇該后綴;

LDRrO,[rl,#0x04]

LDRr0,[ri,#0x04]!

LDRrO,[rl,r2fASR#0x04]!

ARM指令系統

LDM/STM可以傳送R0-RT5的任意組合

OP{cond}modeRn{!},reglist{人}

mode:

IA每次傳送后地址加工FD滿遞減堆棧

IB每次傳送前地址加1ED空遞減堆棧

DA每次傳送后地址減1FA滿遞增堆棧

DB每次傳送前地址減1EA空遞增堆棧

ARM指令系統

LDM/STM后綴描述

-1回寫使能標志,有!,則當數據傳送完畢之后,將最后

的地址寫入基址寄存器,否則基址寄存器內容不變。

■人是否拷貝SPSR到CPSR,當指令為LDM、寄存器列表

中包含R15,有人,則表示除了正常數據傳送之外,還將

SPSR拷貝到CPSR,同時表示傳入傳出的是用戶模式下

的寄存器,不是當前模式下的寄存器。

LDMIArO,{rl,⑵r3,r4}

LDMIArO!,{ri,2r3,r4}

STMFDrl3!z{rOzr4?r7,LR};子程序入口

LDMFDrl3!z{rOzr4-r7,PC};子程序返回

ARM指令系統

ILDR指令

■?DR指今的格式頭b_____________________________

LDR{條件}目的寄存器,V存儲器地址,

■LDR指令用于從存儲器中將一個32位的字數據傳送到目

的寄存器中。該指令通常用于從存儲器中讀取32位的字

數據到通用寄存器,然后對數據進行處理。當程序計數器

PC作為目的寄存器時,指令從存儲器中讀取的字數據被

當作目的地址,從而可以實現程序流程的跳轉。該指令在

程序設計中比較常用,且尋址方式靈活多樣。

LDRRO,[R1]

LDRRO,[RI,R2]

LDRRO,[R1,#8]

LDRRO,[RI,R2]!

ARM指令系統

LDRB指令

「LDRB指令的格式為:

LDR{條件}B目的寄存器,V存儲器地址》

■LDRB指令用于從存儲器中將一個8位的字節數據傳送到

目的寄存器中,同時將寄存器的高24位清零。該指令通

常用于從存儲器中讀取8位的字節數據到通用寄存器,然

后對數據進行處理。當程序計數器PC作為目的寄存器時,

指令從存儲器中讀取的字數據被當作目的地址,從而可以

實現程序流程的跳轉。

LDRBRO,[R1]

LDRBRO,[R1,#8]

ARM指令系統

;LDRH指令

?LDRH指令的格式為:

LDR{條件}H目的寄存器,V存儲器地址〉

■LDRH指令用于從存儲器中將一個16位的半字數據傳送到

目的寄存器中,同時將寄存器的高16位清零。該指令通

常用于從存儲器中讀取16位的半字數據到通用寄存器,

然后對數據進行處理。當程序計數器PC作為目的寄存器

時,指令從存儲器中讀取的字數據被當作目的地址,從而

可以實現程序流程的跳轉。

LDRHRO,[RI]

LDRHRO,[RI,#8]

LDRHRO,[RI,R2]

ARM指令系統

STR指令

■STR指令的格式為:

STR{條件}源寄存器,V存儲器地址》

-STR指令用于從源寄存器中將一個32位的字數據傳送到

存儲器中。該指令在程序設計中比較常用,且尋址方式靈

活多樣,使用方式可參考指令LDR。

STRRO,[R1],#8

STRRO,[R1,#8]

ARM指令系統

STRB指令

■STRB指令的格式為:

STR{條件>B源寄存器,V存儲器地址,

-STRB指令用于從源寄存器中將一個8位的字節數據傳送

到存儲器中。該字節數據為源寄存器中的低8位。

STRBRO,[RI]

STRBRO,[RI,#8]

ARM指令系統

STRH指令

■STRH指令的格式為:

STR{條件}H源寄存器,V存儲器地址,

■STRH指令用于從源寄存器中將一個16位的半字數據傳送

到存儲器中。該半字數據為源寄存器中的低工6位。

STRHRO,[RI]

STRHRO,[RI,#8]

ARM指令系統

土批量數據加載/存儲指令

-ARM微處理器所支持批量數據加載/存儲指令可以一次

在一片連續的存儲器單元和多個寄存器之間傳送數據,

批量加載指令用于將一片連續的存儲器中的數據傳送到

多個寄存器,批量數據存儲指令則完成相反的操作。常

用的加載存儲指令如下:

LDM批量數據加載指令

STM批量數據存儲指令

ARM指令系統

LDM(或STM)指令

-LDM(或STM)指令的格式為:

LDM(或STM){條件}{類型}基址寄存器{!},寄存器列

表{八}

■LDM(或STM)指令用于從由基址寄存器所指示的一片連

續存儲器到寄存器列表所指示的多個寄存器之間傳送數據,

該指令的常見用途是將多個寄存器的內容入棧或出棧。

LDMR0!z{rO-r4}

ARM指令系統

{類型}為以下幾種情況

IA每次傳送后地址加工;

IB每次傳送前地址加工;

DA每次傳送后地址減工;

DB每次傳送前地址減1;

FD滿遞減堆棧;

ED空遞減堆棧;

FA滿遞增堆棧

EA空遞增堆棧

ARM指令系統

后綴

!}為可選后綴,若選用該后綴,則當數據傳送完畢之

后,將最后的地址寫入基址寄存器,否則基址寄存器的內

容不改變。

■基址寄存器不允許為R15,寄存器列表可以為R0?R15

的任意組合。

■{八}為可選后綴,當指令為LDM且寄存器列表中包含

R15,選用該后綴時表示:除了正常的數據傳送之外,還

將SPSR復制到CPSR。同時,該后綴還表示傳入或傳出

的是用戶模式下的寄存器,而不是當前模式下的寄存器。

STMFDIU3!,{RO,R4-R12,LR}

LDMFDR13!,{RO,R4-R12,PC}

ARM指令系統

士數據交換指令

■ARM微處理器所支持數據交換指令能在存

儲器和寄存器之間交換數據。數據交換指

令有如下兩條:

SWP字數據交換指令

SWPB字節數據交換指令

ARM指令系統

&SWP指令

-SWP指令的格式為:

SWP{條件}目的寄存器,源寄存器1,[源寄存器2]

-SWP指令用于將源寄存器2所指向的存儲器中的字數據傳

送到目的寄存器中,同時將源寄存器工中的字數據傳送到

源寄存器2所指向的存儲器中。顯然,當源寄存器工和目

的寄存器為同一個寄存器時,指令交換該寄存器和存儲器

的內容。

SWPRO,RI,[R2]

SWPRO,RO,[R1]

ARM指令系統

&SWPB指令

-SWPB指令的格式為:

SWP{條件}B目的寄存器,源寄存器工,[源寄存器2]

-SWPB指令用于將源寄存器2所指向的存儲器中的字節數

據傳送到目的寄存器中,目的寄存器的高24清零,同時

將源寄存器1中的字節數據傳送到源寄存器2所指向的存

儲器中。顯然,當源寄存器工和目的寄存器為同一個寄存

器時,指令交換該寄存器和存儲器的內容。

SWPBRO,RI,[R2]

SWPBRO,RO,[RI]

ARM指令系統

]協處理器指令

-ARM920T處理器通過一個外部協處理器接口來支持

連接片上協處理器。

-ARM920T協處理器接口允許你附加一個專門設計的

協處理器到ARM920T。包括:附加一個加速器。如

用于浮點運算,DSP,3?D圖形,加密解密。

-ARM920T處理器包括兩個內部協處理器

1.CP14:用于調試控制

2.CP15:用于內存系統控制和測試控制

?參考:ArmArchitectureReference.pdf485^

ARM指令系統

協處理器指令

的微處理器可支持多達16個協處理器,用于各種協處理操作,

在程序執行的過程中,每個協處理器只執行針對自身的協處理指

令,忽略ARM處理器和其他協處理器的指令。

■ARM的協處理器指令主要用于ARM處理器初始化ARM協處理器

的數據處理操作,以及在ARM處理器的寄存器和協處理器的寄

存器之間傳送數據,和在ARM協處理器的寄存器和存儲器之間

傳送數據。ARM協處理器指令包括以下5條:

CDP協處理器數操作指令

LDC協處理器數據加載指令

STC協處理器數據存儲指令

MCR寄存器到協處理器寄存器的數據傳送指令

MRC協處理器寄存器到寄存器的數據傳送指令

ARM指令系統

*DP指令

-CDP指令的格式為:

CDP{條件}協處理器編碼,協處理器操作碼工,目的寄

存器,源寄存器工,源寄存器2,協處理器操作碼2。

■CDP指令用于ARM處理器通知ARM協處理器執行特定的

操作,若協處理器不能成功完成特定的操作,則產生未定

義指令異常。其中協處理器操作碼工和協處理器操作碼2

為協處理器將要執行的操作,目的寄存器和源寄存器均為

協處理器的寄存器,指令不涉及ARM處理器的寄存器和

存儲器。

CDPP3,2,C12,CIO,C3,4

;該指令完成協處理器P3的初始化

ARM指令系統

LLDC指令

FLDC指令的格式為:

LDC{條件}{L}協處理器編碼,目的寄存器,[源寄存器]

■LDC指令用于將源寄存器所指向的存儲器中的字數據傳送

到目的寄存器中,若協處理器不能成功完成傳送操作,則

產生未定義指令異常。其中,{L}選項表示指令為長讀取

操作,如用于雙精度數據的傳輸。

LDCP3,C4,[R0]

;將ARM處理器的寄存器R0所指向的存儲器中的字數據

傳送到協處理器P3的寄存器C4中

ARM指令系統

STC指令

「STC指令的格式為:

STC{條件}{L}協處理器編碼,源寄存器,[目的寄存器]

■STC指令用于將源寄存器中的字數據傳送到目的寄存器所

指向的存儲器中,若協處理器不能成功完成傳送操作,則

產生未定義指令異常。其中,{L}選項表示指令為長讀取

操作,如用于雙精度數據的傳輸。

STCP3,C4,[R0]

;將協處理器P3的寄存器C4中的字數據傳送到ARM處

理器的寄存器R0所指向的存儲器中

ARM指令系統

MCR指令

MCR指令的格式為:

MCR{條件}協處理器編碼,協處理器操作碼工,源寄存

器,目的寄存器工,目的寄存器2,協處理器操作碼2。

■MCR指令用于將ARM處理器寄存器中的數據傳送到協處

理器寄存器中,若協處理器不能成功完成操作,則產生未

定義指令異常。其中協處理器操作碼工和協處理器操作碼

2為協處理器將要執行的操作,源寄存器為ARM處理器的

寄存器,目的寄存器工和目的寄存器2均為協處理器的寄

存器。

MCRP3,3,RO,C4,C5,6

;該指令將ARM處理器寄存器RO中的數據傳送到協處理

器P3的寄存器C4和C5中

ARM指令系統

MRC指令

rMRC指令的格式為:

MRC{條件}協處理器編碼,協處理器操作碼工,目

的寄存器,源寄存器工,源寄存器2,協處理器操作碼2。

■MRC指令用于將協處理器寄存器中的數據傳送到ARM處

理器寄存器中,若協處理器不能成功完成操作,則產生未

定義指令異常。其中協處理器操作碼工和協處理器操作碼

2為協處理器將要執行的操作,目的寄存器為ARM處理器

的寄存器,源寄存器工和源寄存器2均為協處理器的寄存

器。

MRCP3,3,RO,C4,C5,6

;該指令將協處理器P3的寄存器中的數據傳送到ARM處

理器寄存器中

ARM指令系統

土異常產生指令

■ARM微處理器所支持的異常指令有如下兩

條:

>SWI軟件中斷指令

>BKPT斷點中斷指令

ARM指令系統

LSWI指令

Pswi指令的格式為:

SWI{條件}24位的立即數

■SWI指令用于產生軟件中斷,以便用戶程序能調用操作系

統的系統例程。操作系統在SWI的異常處理程序中提供相

應的系統服務,指令中24位的立即數指定用戶程序調用

系統例程的類型,相關參數通過通用寄存器傳遞,當指令

中24位的立即數被忽略時,用戶程序調用系統例程的類

型由通用寄存器R0的內容決定,同時,參數通過其他通

用寄存器傳遞。

SWI0x02

ARM指令系統

.BKPT指令

■BKPT指令的格式為:

BKPT16位的立即數

■BKPT指令產生軟件斷點中斷,可用于程序

的調試。

THUMB指令系統

《Thumb指令集

■Thumb指令集是針對代碼密度的問題而提出的。可以看

作是ARM指令集的子集。

■所有Thumb指令均有對應的ARM指令,而Thumb編程

模型也對應于Thumb模型。

-Thumb是一個不完整的體系結構,不能指望處理器只執

行Thumb代碼而不支持ARM指令集。一般Thumb代碼

只需支持通用功能,必要時可以借助ARM指令集(例:

所有異常自動進入ARM模式)

■應用程序可以靈活的將ARM指令和Thumb程序混合,以

便提高性能和代碼密度。同時達到降低功耗、節約成本和

提高性能的目的。

THUMB指令系統

&Thumb指令集的執行

-在任何時刻,對指令流的解釋取決于CPSR的第5

位,即位T,若T置位,則認為指令流為16位的

Thumb指令;否則為標準的ARM指令。

-并不是所有的ARM處理器都支持Thumb指令。

只有在命名中有字母T的才支持,例如以上提到

的ARM7TDMI。

THUMB指令系統

Thumb模式的進入和退出

■復位后,ARM啟動并執行ARM指令。轉向執行Thumb指

令的通常方法是執行一條交換轉移指令BX。若BX指令指

定的操作數寄存器的最低位為工,則將T置位,并將程序

計數器切換為寄存器其他位給出的地址。

■異常返回也可以將微處理器從ARM狀態轉換為Thumb狀

態。通常這種指令用于返回到進入異常前所執行的指令流,

而不是特地用于轉換到Thumb模式。

■執行ThumbBX指令可以返回到ARM指令流。

THUMB指令系統

[Thumb轉移指令

同RM指令有一個大的(24位)偏移域(offsetfield),這不可

能在16位Thumb指令格式中表示。為此,Thumb指令集有

多種方法實現其余功能。格式:

>B<cond><lable>

》B<lable>

>BL<lable>

>BLX<lable>

>B{L}XRm

-轉移指令的典型用法如下:

1)短距離條件轉移指令可用于控制循環的退出。

2)中等距離的無條件轉移指令用于實現類似got。功能o

3)長距離子程序調用.

THUMB指令系統

Thumb轉移指令—Bvlabel>指令

B{cond}<label>/*8位偏移,目標為Thumb代碼*/

B<label>/*工工位偏移,目標為Thumb代碼*/

■這兩種格式是條件域和偏移長度的折衷。指令首先將偏移值

左移工位,實現16位對齊,然后擴展到32位,因此他們的偏移

量分別為土256字節和土2K字節。

THUMB指令系統

Thumb轉移指令一BLvlabel>指令

BL<label>/*工工位偏移,目標為Thumb代碼*/

■轉移鏈接子程序通常需要一個大的范圍,很難用工6位指令

格式實現。為此,Thumb采用兩條這樣格式的指令組合成

22位半字偏移(符號擴展為32位),使指令轉移范圍為

±4MBo

■為了使這兩條轉移指令相互獨立,以致使他們之間也能響

應中斷等,將鏈接寄存器LR作為暫存器使用,LR在這兩條

指令執行完成后會被覆蓋,因此,LR中不能裝有有效內容。

這個指令對的操作如下:

(第一條)LR:=PC+(偏移量左移工2后符號擴展至32位)

(第二條)PC:=LR+(偏移量左移工位)

LR=oldPC+3

THUMB指令系統

JThumb轉移指令一BLXvlabel>指令

BLX<label>/*目標為ARM代碼*/

■該指令只在v5T結構中有效。它使用與上面BL指令同樣的第一步,

(第一條)LR:=PC+(偏移量左移12后符號擴展至32位)

(第二條)PC:=LR+(偏移量左移工位)

LR=oldPC+3

Thumb位清0。

-應注意轉移的目標是ARM指令,偏移地址只需要工。位,而且PC

值的位口]可能為工,因此,必須進行清0操作。

THUMB指令系統

Thumb轉移指令—BLXRm指令

■B<L}XRm

-目標為ARM代碼或Thumb代碼

-與上一條代碼不同的就是「14的值為后續地址加工,

以表示被Thumb代碼調用。

THUMB指令系統

Thumb軟中斷指令

■Thumb軟中斷指令的行為與ARM等價指令完全

相同。進入異常的指令使微處理器進入ARM執行

狀態。

-該代碼使用8位立即數,這將會把Thumb代碼的

SW1指令限制到前28=256種,而ARM的SW工指

令可以達到224=1600萬種。

THUMB指令系統

Thumb數據處理指令

■Thumb數據處理指令包括一組高度優化且相當復雜的指令,范

田涵蓋編譯器通常需要的大多數操作。

■在Thumb指令集中有等價指令的ARM數據處理指令如下所列:

口使用低8個通用寄存器(r0?r7)的指令:

ARM指令Thumb指令

>MOVSRd.#<#imm8>MOVRd,#<#imm8>

>MVNSRd,RmMVNRd,Rm

>CMPRn.#<#imm8>CMPRn,#<#imm8>

THUMB指令系統

Thumb數據處理指令與等價的ARM指令

ARM指令Thumb指令

>CMPRn,RmCMPRn,Rm

>CMNRn,RmCMNRn,Rm

>TSTRn,KmTSTRn,Rm

》ADDSRd,Rn,#<#Imm3>ADDRd,Rn,#<#imm3>

》ADDSRd,Rd,#<#lmm8>ADDRd,#<#imm8>

>ADDSRd,Rn,RmADDRd,Rn,Rm

>ADCSRd,Rd,RmADCRd,Rm

>SUBSRd,Rn,#<#imm3>SUBRd,Rn,#<#imm3>

>SUBSRd,Rd,#<#imm8>SUBRd,#<#imm8>

THUMB指令系統

Thumb數據處理指令與等價的ARM指令

ARM指令Thumb指令

>SUBSRd,Rn,RmSUBRd,Rn,Rm

>SBCSRd,Rd.RmSBCRd,Rm

>RSBSRd,Rn,#0NEGRd,Rn

>MOVSRd,Rm,LSL#<#sh>LSLRd,Rm,#<#sh>

>MOVSRd,Rd,LSLRsLSLRd,R9

>MOVSRd,Rm,LSR#<#sh>LSRRd,Rm,#<#sh>

>MOVSRd,Rd,LSRRsLSRRd,Rs

>MOVSRd,RmzASR#<#sh>ASRRd,Rm,#<#sh>

>MOVSRd,Rd,RORRsASRRd,Rs

THUMB指令系統

Thumb數據處理指令與等價的ARM指令

ARM指令Thumb指令

MOVSRd,Rd,RORRsRORRd,Rs

ANDSRd,Rd,RmANDRd,Rm

EORSRd,Rd,RmEORRd,Rm

ORRSRd,Rd.RmORRRd,Rm

BICSRd,Rd,RmBICRd,Rm

MULSRd,Rm,RdMULRd,Rm

THUMB指令系統

'Thumb數據處理指令與等價的ARM指令

□使用高8個寄存器(r8?r15)的指令,在有些情況下結合

低8個寄存器使用:

ARM指令Thumb指令

>ADDRd,Rd,RmADDRd,Rm(l/2Hiregs)

>CMPRn,RmCMPRn,Rm(l/2Hiregs)

>MOVRd,RmADDRd,Rm(l/2Hiregs)

>ADDRd,pc,#<#imm8>ADDRd,pc,#<#imm8>

,ADDRd,sp,#<#imm8>ADDRd,sp,#<#imm8>

>ADDsp,sp,#<#imm8>ADDsp,sp,#<#imm8>

>SUBsp,sp,#<#imm8>SUBsp,sp,#<#imm8>

THUMB指令系統

Thumb數據處理指令與等價的ARM指令

■注意事項:

口所有對低8個寄存器操作的數據處理指令都更新條件碼位

(等價的ARM指令位s置位)。

□對高8個寄存器操作的指令不改變條件碼位。CMP指令除

外,它只改變條件碼。

□上面的指令中“1/2Hiregs”表示至少有1個寄存器操作

數是高8位寄存器。

□#imm3>#imm7.#imm8分別表示3位、7位和8位立

即數域。#sh表示5位的移位數域。

THUMB指令系統

Thumb單寄存器數據傳送指令

LDR|STR{B}Rd,[Rnz#off5]

LDRH|STRHRd,[Rn,#off5]

LDR|STR{S}<H|B}Rd,[Rn,Rm]

LDRRd,[pc,#off8]

LDR|STRRd,[sp9#off8]

■說明

>這些指令是從ARM單寄存器傳送指令中精心導出的子集,并且與等

價的ARM指令有嚴格相同的語義。

“在所有的指令中,對偏移量需要根據數據類型按比例調整。例如,5

位偏移量的范圍在字節Load和Store指令中是32字節,在半字Load

和Store指令中是64字節,在字Load和Store指令中是128字節

THUMB指令系統

Thumb多寄存器數據傳送指令

-同ARM指令一樣,Thumb多寄存器數據傳送指令可以用

于過程調用與返回以及存儲器塊拷貝。但為了編碼的緊湊

性,這兩種用法由分開的指令實現,其尋址方式的數量也

有所限制,在其他方面,這些指令的性質與等價的ARM

指令相同。

LDMIARn!,<<reglist>>

STMIARn!,{vreglist〉}

POP{<reglist><,pc}}

PUSH{<reglist><,lr}}

THUMB指令系統

,Thumb多寄存器數據傳送指令

森藐除贏最誦LDMIA和STMIA尋址模式。寄存

器(低8個寄存器r0~r7)中的任何一個可以作為基址寄

存器。

-寄存器列表可以是這些寄存器的任意子集,但不應包括基

址寄存器,因為總是選擇回寫。

■堆棧形式使用SP(r13)作為基址寄存器,并且也總是使用

回寫。堆棧的模式也固定為滿棧遞減。寄存器列表除了可

以是8個Lo寄存器外,鏈接寄存器LR可以出現在PUSH指

令中,程序計數器PC可以出現在POP指令中,以優化過

程調用及返回程序。

THUMB指令系統

4Thumb的應用

小端的32位ARM系統可以用Thumb代碼實現特定的非關

鍵程序,以節省功耗或降低對存儲器的需求。

■低端的工6位系統可以有小規模的32位片上RAM供運行

ARM代碼的關鍵程序使用,所有非關鍵程序使用片外

Thumb代碼。

■上面第二種情況或許更接近于Thumb所適宜的應用。在

移動電話和尋呼機的應用中,需要ARM最大處理能力的

實時信號處理(DSP)功能。但這些程序可以緊湊編碼并放

在小規模的片上存儲器中。那些控制用戶界面、電池管理

系統等等復雜的比較長的代碼是非實時的,可由Thumb

代碼放在片外ROM中,由8位或16位總線就可以得到好

的性能,同時降低成本和延長電池壽命。

ATPCS介紹

lATPCS(ARMThumbProce

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論