新聞中心

ARM匯編指令詳解1

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
RealView DeveloperSuite(RVDS)工具室ARM公司推出的新一代ARM集成開(kāi)發(fā)工具(上一代為ADS)。支持所有ARM系列核,并與眾多第三方實(shí)時(shí)操作系統(tǒng)及工具商合作簡(jiǎn)化開(kāi)發(fā)流程。其包含以下組件:GUI(GraphicsUser Interface,圖形用戶界面)開(kāi)發(fā)環(huán)境(CodeWarrior和AXD)、支持軟件組成。有了這些部件,用戶就可以為ARM系列的處理器編寫、調(diào)試自己的程序。

本文引用地址:http://butianyuan.cn/article/201611/317793.htm

Code Warrior IDE提供了一個(gè)簡(jiǎn)單通用的圖形化用戶界面用于管理項(xiàng)目??梢砸訟RM處理器為對(duì)象,利用CodeWarrior IDE開(kāi)發(fā)C、C++和ARM匯編代碼。

AXD是ADS軟件中獨(dú)立于CodeWarrior IDE的圖形軟件,AXD用于對(duì)程序進(jìn)行調(diào)試。(和Jlink一起使用)

工作狀態(tài)

從編程的角度看,ARM微處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換:

  • ARM狀態(tài),此時(shí)處理器執(zhí)行的是32位的字對(duì)齊的ARM指令。
  • Thumb狀態(tài),此時(shí)處理器執(zhí)行的是16位半字對(duì)齊的Thumb指令。

在程序執(zhí)行過(guò)程中,微處理器可以隨時(shí)在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。

存儲(chǔ)器格式

ARM體系結(jié)構(gòu)將存儲(chǔ)器看作是從零地址開(kāi)始的字節(jié)的線性組合。從零字節(jié)到三字節(jié)放置第一個(gè)存儲(chǔ)的字(32位)數(shù)據(jù),從第四個(gè)字節(jié)到第七個(gè)字節(jié)放置第二個(gè)存儲(chǔ)的字?jǐn)?shù)據(jù),依次排列。作為32位的微處理器,ARM體系結(jié)構(gòu)所支持的最大尋址空間是4G。

ARM體系結(jié)構(gòu)可以用兩種方式來(lái)存儲(chǔ)字?jǐn)?shù)據(jù),稱之為大端格式和小端格式。

  • 大端格式:字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在低地址上,而低字節(jié)存儲(chǔ)在高地址上。
  • 小端格式:字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在高地址上,而低字節(jié)存儲(chǔ)在低地址上。

ARM微處理器的指令長(zhǎng)度可以是32位(在ARM狀態(tài)下),也可以為16位(在Thumb狀態(tài)下)。ARM微處理器中支持字節(jié)(8位)、半字(16位)、字(32位)三種數(shù)據(jù)類型,其中,字需要4字節(jié)對(duì)齊(地址的低兩位為0)、半字需要2字節(jié)對(duì)齊(地址的最低位為0)。

ARM支持7中工作模式,分別為:

1、用戶模式(Usr):用于正常執(zhí)行程序

2、快速中斷模式(FIQ):用于高速數(shù)據(jù)傳輸

3、外部中斷模式(IRQ):用于通常的中斷處理

4、管理模式(svc):操作系統(tǒng)使用的保護(hù)模式

5、數(shù)據(jù)訪問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。

6、系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。

7、未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件

ARM微處理器的工作模式可以通過(guò)軟件改變,也可以通過(guò)外部中斷或異常處理改變。應(yīng)用程序運(yùn)行在用戶模式下,當(dāng)處理器運(yùn)行在用戶模式下時(shí),某些被保護(hù)的系統(tǒng)資源是不能被訪問(wèn)的。

除用戶模式以外,其余六種模式稱為非用戶模式或特權(quán)模式;其中除用戶模式和系統(tǒng)模式外的5種又稱為異常模式,常用于處理中斷或異常,以及需要訪問(wèn)受保護(hù)的系統(tǒng)資源等情況。

ARM的寄存器

ARM微處理器共有37個(gè)32位寄存器,其中31個(gè)通用寄存器,6個(gè)為狀態(tài)寄存器。但是這些寄存器不能被同時(shí)訪問(wèn),具體哪些寄存器可以訪問(wèn),取決于ARM工作狀態(tài)及具體的運(yùn)行模式。但在任何時(shí)候,通用寄存器R14-R0、程序計(jì)數(shù)器PC、一個(gè)狀態(tài)寄存器都是可以訪問(wèn)的。

寄存器(ARM狀態(tài)):在ARM工作狀態(tài)下,任一時(shí)刻可以訪問(wèn)16個(gè)通用寄存器和一到兩個(gè)狀態(tài)寄存器。在非用戶模式下(特權(quán)模式)下,則可訪問(wèn)到特定模式分組寄存器,具體見(jiàn)圖:

寄存器(Thumb狀態(tài)):是ARM狀態(tài)下寄存器集的一個(gè)子集,程序可以直接訪問(wèn)8個(gè)通用寄存器(R7-R0)、程序計(jì)數(shù)器(PC)、堆棧指針(SP)、連接寄存器(LR)和CPSR。具體見(jiàn)下頁(yè)圖:


Thumb狀態(tài)下的寄存器組織與ARM狀態(tài)下的寄存器組織的關(guān)系:

  • Thumb狀態(tài)下和ARM狀態(tài)下的R0-R7是相同的。
  • Thumb狀態(tài)下和ARM狀態(tài)下的CPSR和SPSR是相同的。
  • Thumb狀態(tài)下的SP對(duì)應(yīng)于ARM狀態(tài)下的R13。
  • Thumb狀態(tài)下的LR對(duì)應(yīng)于ARM狀態(tài)下的R14。
  • Thumb狀態(tài)下的程序計(jì)數(shù)器PC對(duì)應(yīng)于ARM狀態(tài)下R15。

不分組寄存器(The unbanked registers)

R0—R7

分組寄存器(The banked registers)

R8—R14

程序計(jì)數(shù)器:

R15(PC)

  • R0-R7是不分組寄存器。這意味著在所有處理器模式下,訪問(wèn)的都是同一個(gè)物理寄存器。未分組寄存器沒(méi)有被系統(tǒng)用于特別的用途,任何可采用通用寄存器的應(yīng)用場(chǎng)合都可以使用未分組寄存器。
  • 分組寄存器R8-R12
  • 分組寄存器R13、R14.R13通常用做堆棧指針SP,R14用作子程序鏈接寄存器,指向函數(shù)的返回地址。
  • R15是程序計(jì)數(shù)器,也稱為PC。其值等于當(dāng)前正在執(zhí)行的指令的地址+8(因?yàn)樵谌≈泛蛨?zhí)行之間多了一個(gè)譯碼的階段)。

狀態(tài)寄存器:

ARM所有工作模式下都可以訪問(wèn)程序狀態(tài)寄存器CPSR。CPSR包含條件碼標(biāo)志、中斷禁止位、當(dāng)前處理器模式以及其它狀態(tài)和控制信息。CPSR在每種異常模式下都有一個(gè)對(duì)應(yīng)的物理寄存器—程序狀態(tài)保存寄存器SPSR。當(dāng)異常出現(xiàn)時(shí),SPSR用于保存CPSR的值,以便異常返回后恢復(fù)異常發(fā)生時(shí)的工作狀態(tài)。

ARM的尋址方式:

所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來(lái)尋找物理地址的方式。

立即尋址:操作數(shù)本身就在指令中給出。

ADD R0, R0,#1; R0 <- R0 + 1

ADDR0,R0,#0x3f;R0 <- R0 + 0x3f

第二個(gè)源操作數(shù)即為立即數(shù),要求以“#”為前綴。

寄存器尋址:利用寄存器中的數(shù)值作為操作數(shù)。

ADDR0,R1,R2;R0 <- R1 + R2

寄存器間接尋址:以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。

ADDR0,R1,[R2]; R0 <- R1 + [R2]

LDRR0,[R1]; R0 <- [R1]

基址變址尋址:將寄存器(該寄存器一般稱為基址寄存器)的內(nèi)容與指令中的給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。

LDRR0,[R1,#4];R0 <- [R1 + 4]

LDRR0,[R1,#4]!;R0 <- [R1 + 4]、R1 <- R1 + 4

LDR R0,[R1],#4;R0 <- [R1]、R1 <- R1 + 4

LDR R0, [R1,R2]; R0 <- [R1 + R2]

多寄存器尋址:一條指令可以完成多個(gè)寄存器值的傳送。最多實(shí)現(xiàn)16個(gè)通用寄存器值得傳送。

LDMIAR0,{R1,R2,R3,R4}; R1<- [R0]; R2 <- [R0 + 4]; R3<- [R0 + 8]; R4 <- [R0 + 12]

該指令的后綴IA表示在每次執(zhí)行完加載后,R0按字長(zhǎng)增加,因此,指令可將連續(xù)存儲(chǔ)單元的值傳送到R1 -R4。

相對(duì)尋址:以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。

BLNEXT;跳轉(zhuǎn)到子程序NEXT處執(zhí)行

......

NEXT

......

MOV PC,LR;從子程序返回

堆棧尋址:堆棧是一種數(shù)據(jù)結(jié)構(gòu),使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。

遞增堆棧:向高地址方向生長(zhǎng)

遞減堆棧:向低地址方向生長(zhǎng)

滿堆棧:堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項(xiàng)

空堆棧:堆棧指針指向下一個(gè)要放入數(shù)據(jù)的空位置

ARM指令集

跳轉(zhuǎn)指令:實(shí)現(xiàn)程序流程的跳轉(zhuǎn),1.使用專門的跳轉(zhuǎn)指令。2.直接向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值。(跳轉(zhuǎn)之前結(jié)合使用 MOV LR,PC.保存將來(lái)返回地址值,從而實(shí)現(xiàn)在4G連續(xù)的線性地址空間的子程序調(diào)用。)

指令:B、BL、BLX、BX

B{條件}目標(biāo)地址

B Label

程序無(wú)條件跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行

CMPR1,#0

BEQ Label

當(dāng)CPSR寄存器中的Z條件碼置位時(shí),程序跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行。

BL{條件} 目標(biāo)地址

在跳轉(zhuǎn)之前,會(huì)在寄存器R14中保存PC當(dāng)前值。

BLX 目標(biāo)地址

從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)由ARM狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC的當(dāng)前內(nèi)容保存到寄存器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時(shí),可以通過(guò)BLX指令實(shí)現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時(shí),子程序的返回可以通過(guò)將寄存器R14值到PC中來(lái)完成。

BX{條件} 目標(biāo)地址

目標(biāo)地址可以是ARM指令,也可以是Thumb指令。

B跳轉(zhuǎn)指令

BL帶返回的跳轉(zhuǎn)指令

BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令

BX帶狀態(tài)切換的跳轉(zhuǎn)指令

數(shù)據(jù)處理指令:數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較指令

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

MOV指令完成從另一個(gè)寄存器、被移位的寄存器或進(jìn)一個(gè)立即數(shù)加載到目的寄存器。其中S選項(xiàng)決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒(méi)有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。

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

MVN{條件}{S} 目的寄存器,源操作數(shù)

MVN指令可完成從另一個(gè)寄存器、被移位的寄存器、或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒(méi)有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。

MVNR0,#0xff; R0 <= 0xffffff00

CMP{條件}操作數(shù)1,操作數(shù)2

CMP指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1大于操作數(shù)2時(shí),此后的有GT后綴的指令將可以執(zhí)行。

CMP R1,R0;將寄存器R1的值與寄存器R0的值相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

CMPR1,#100; 將寄存器R1的值與立即數(shù)100相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

TST{條件} 操作數(shù)1,操作數(shù)2

TST指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的與運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測(cè)試的數(shù)據(jù),而操作數(shù)2是一個(gè)位掩碼(掩碼是一串二進(jìn)制代碼對(duì)目標(biāo)字段進(jìn)行位與運(yùn)算,屏蔽當(dāng)前的輸入位),根據(jù)測(cè)試結(jié)果設(shè)置相應(yīng)標(biāo)志位。當(dāng)位與結(jié)果為0時(shí),EQ位被設(shè)置。

TSTR1,#%1;用于測(cè)試在寄存器R1中是否設(shè)置了最低位(%表示二進(jìn)制數(shù))。

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

ADD指令用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。

ADDR0,R1,R2,LSL#1;R0 = R2 + (R3 << 1)

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

SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。

SUBR0,R2,R3,LSL#1; R0 = R2 - (R3 << 1)

AND{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

AND指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。

ANDR0,R0,#3; 該指令保持R0的0、1位,其余位清零。

ORR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

ORR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2應(yīng)是一個(gè)寄存器,被移位寄存器,或一個(gè)立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。

ORRR0,R0,#3;該指令設(shè)置R0的0、1位,其余位保持不變。

BIC{cond}{S} Rd,Rn,operand2

BIC指令用于清除Rn中的某些位,并把結(jié)果存放在Rd中,操作數(shù)operand2為32位的掩碼,如果掩碼中設(shè)置了某一位為1,則清除這一位。

BICR0,R0,#11;將R0的0,1,3位清零,其余位不變。

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

MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算并把結(jié)果放置到目的寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)或無(wú)符號(hào)數(shù)。

MULR0,R1,R2;R0 = R1 * R2

MULSR0,R1,R2: R0 = R1 * R2,同時(shí)設(shè)置CPSR中的相關(guān)條件標(biāo)志位

程序狀態(tài)寄存器訪問(wèn)指令

ARM微處理器支持程序狀態(tài)寄存器訪問(wèn)指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。

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

MRS的用處是將狀態(tài)寄存器中的內(nèi)容傳遞到通用寄存器中。

1、當(dāng)需要修改程序狀態(tài)寄存器中內(nèi)容時(shí),可用MRS進(jìn)程序狀態(tài)寄存器的內(nèi)容讀入到通用寄存器,修改后再寫回程序狀態(tài)寄存器。

2、當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用MRS讀出程序狀態(tài)寄存器的值,然后保存。

MRS R0,CPSR;傳送CPSR的內(nèi)容到R0

MSR{條件}程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù)

MSR指令用于將操作數(shù)的內(nèi)容傳遞到程序狀態(tài)寄存器的特定域中。其中,操作時(shí)可以是通用寄存器或立即數(shù)。<域>用于設(shè)置程序狀態(tài)寄存器中需要操作的位,32位的程序狀態(tài)寄存器可分為4個(gè)域:

位[31:24]為條件標(biāo)志位域,用f表示;位[23: 16]為狀態(tài)位域,用s表示;

位[15:8]為擴(kuò)展位域,用x表示;位[7: 0]為控制位域,用c表示;

MSR CPSR,R0;傳送R0內(nèi)容到CPSR

MSRCPSR_c,R0;傳送R0的內(nèi)容到CPSR,但僅僅修改CPSR中的控制位域



關(guān)鍵詞: ARM匯編指

評(píng)論


技術(shù)專區(qū)

關(guān)閉