《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第三章_第1頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第三章_第2頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第三章_第3頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第三章_第4頁
《ARM Cortex-A9多核嵌入式系統(tǒng)開發(fā)教程》課件第三章_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ARM的指令系統(tǒng)及匯編程序設(shè)計3指令系統(tǒng)簡介尋址方式ARM指令集GNUARM匯編器支持的偽操作指令A(yù)RM匯編偽指令A(yù)RM匯編編程簡介第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.1

指令系統(tǒng)簡介

指令是規(guī)定處理器進行某種操作的命令,處理器能夠執(zhí)行的各種指令的集合稱為指令系統(tǒng)。3.1.1

ARM指令分類1、ARM指令集ARM指令集主要包括數(shù)據(jù)處理和雜項指令、分支指令、存儲器訪問指令、程序狀態(tài)寄存器處理指令、協(xié)處理器指令和異常中斷指令六大類。所有ARM指令均為32位長度,指令以字對齊方式保存在存儲器中。2、Thumb指令集

當處理器工作在Thumb狀態(tài)時,執(zhí)行Thumb指令集。所有的Thumb指令都是16位長度,指令以半字對齊方式保存在存儲器中。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計表3.1ARM指令的典型編碼格式3.1.2

ARM指令的編碼格式各部分編碼含義如下:

cond:指令執(zhí)行的條件碼;opcode:指令操作符的編碼;S:決定指令的執(zhí)行是否影響CPSR(當前程序狀態(tài)寄存器)的值;Rn:包含第一個源操作數(shù)的寄存器編碼;第3章ARM的指令系統(tǒng)及匯編程序設(shè)計第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.1.3ARM指令的條件碼域表3.2指令的條件碼第3章ARM的指令系統(tǒng)及匯編程序設(shè)計

當處理器工作在ARM狀態(tài)時,幾乎所有的指令均根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件地執(zhí)行,如表3.2所示。當指令的執(zhí)行條件滿足時,指令被執(zhí)行,否則指令被忽略,繼續(xù)執(zhí)行下一條指令。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.2

尋址方式1.立即數(shù)尋址立即數(shù)尋址指令中,操作碼字段后面的地址部分即操作數(shù)本身。SUBSR0,R0,#1;R0←R0–1,并且影響標志位ADDR0,R0,#0x3f;R0←R0+0x3f第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2.寄存器尋址寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù)。ADDR0,R1,R2;R0←R1?+?R2該指令的執(zhí)行效果是將寄存器R1和R2的內(nèi)容相加,其結(jié)果存放在寄存器R0中。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.寄存器移位尋址寄存器移位尋址是ARM指令集特有的尋址方式。當?shù)诙€操作數(shù)是寄存器方式時,第二個寄存器操作數(shù)在與第一個操作數(shù)結(jié)合之前,先進行移位操作。MOVR0,R2,LSL#3 ;R2的值左移3位,結(jié)果放入R0ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“與”,結(jié)果放入R1中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計4.寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。LDRR1,[R2];將R2指向的存儲單元的數(shù)據(jù)讀出,保存在R1中SWPR1,R1,[R2];將寄存器R1的值和R2指定的存儲單元的內(nèi)容交換第3章ARM的指令系統(tǒng)及匯編程序設(shè)計5.基址變址尋址基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。LDRR0,[R1,#4];將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址,從該地

址取得操作數(shù)存入寄存器R0中。LDRR0,[R1,R2];將寄存器R1的內(nèi)容加上寄存器R2的內(nèi)容,形成操作數(shù)的有效地址,從該地址取得操作數(shù)存入寄存器R0中。LDRR0,[R1],#4;寄存器R1的內(nèi)容作為操作數(shù)的有效地址,從該地址取得操作數(shù)存入寄存器R0中,然后,R1的內(nèi)容自增4個字節(jié)。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計6.多寄存器尋址該指令可以一次完成多個寄存器值的傳送,這種尋址方式可以用一條指令完成傳送最多16個通用寄存器的值。LDMIAR0,{R1,R2,R3,R4};R1←[R0],R2←[R0?+?4],R3←[R0?+?8],R4←[R0?+?12]第3章ARM的指令系統(tǒng)及匯編程序設(shè)計7.相對尋址相對尋址以程序計數(shù)器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到的操作數(shù)作為有效地址。8.堆棧尋址使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3

ARM指令集3.3.1

移位操作指令

移位操作包括LSL(邏輯左移)、ASL(算術(shù)左移)、LSR(邏輯右移)、ASR(算術(shù)右移)、ROR(循環(huán)右移)和RRX(帶擴展的循環(huán)右移)6種類型。1.LSL(或ASL)LSL(或ASL)可完成對通用寄存器中的內(nèi)容進行邏輯(或算術(shù))左移的操作。MOVR0,R1,LSL#2;將R1中的內(nèi)容左移兩位后傳送到R0中。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2.?LSRLSR可完成對通用寄存器中的內(nèi)容進行邏輯右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。MOVR0,R1,LSR#2;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用零來填充。3.?ASRASR可完成對通用寄存器中的內(nèi)容進行算術(shù)右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用位31的值來填充。MOVR0,R1,ASR#2;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用位31的值來填充第3章ARM的指令系統(tǒng)及匯編程序設(shè)計4.?RORROR可完成對通用寄存器中的內(nèi)容進行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。MOVR0,R1,ROR#2;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0中。5.?RRXRRX可完成對通用寄存器中的內(nèi)容進行帶擴展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進位標志位C來填充。MOVR0,R1,RRX#2;將R1中的內(nèi)容進行帶擴展的循環(huán)右移兩位后傳送到R0中。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.2數(shù)據(jù)處理指令

數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運算指令和比較指令等。數(shù)據(jù)傳送指令:

1)MOVMOVR1,R0;

將寄存器R0的值傳送到寄存器R1中MOVPC,R14;

將寄存器R14的值傳送到PC中,常用于子程序返回

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)傳送指令:

2)MOVN

與MOV不同的是在傳送之前,將操作數(shù)按位取反,再進行傳送。

MVNR0,#0;

將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

1)AND

將兩個操作數(shù)進行邏輯與操作,常用于屏蔽操作數(shù)1的某些位。

ANDR0,R0,#3(#00000011);指令保持R0的0、1位,其余位清零

2)ORR

將兩個操作數(shù)進行邏輯或運算,常用于設(shè)置操作數(shù)1的某些位。ORRR0,R0,#3(#00000011);該指令設(shè)置R0的0、1位,其余位保持不變第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

3)EOR

將兩個操作數(shù)進行異或操作,常用于反轉(zhuǎn)操作數(shù)1的某些位。

EORR0,R0,#3(#00000011);

該指令反轉(zhuǎn)R0的0、1位,其余位不變

4)ADD

將兩個操作數(shù)進行算術(shù)相加運算。 ADDR0,R1,R2;該指令將寄存器R1的內(nèi)容與R2的內(nèi)容相加,結(jié)果放在寄存器R0里面第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

5)ADC

與ADD的區(qū)別是除了兩個操作數(shù)進行相加外,還包括CPSR中的C標志位。

ADDSR0,R4,R8;

加低端的字

ADCSR1,R5,R9;

加第二個字,帶進位

ADCSR2,R6,R10;

加第三個字,帶進位 ADCR3,R7,R11;

加第四個字,帶進位

上面四行指令的作用是實現(xiàn)兩個128位數(shù)的加法運算。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

6)SUB

將兩個操作數(shù)進行相減操作。

SUBR0,R2,R3,LSL#1;

將R3寄存器的內(nèi)容左移一位后的結(jié)果與R3相減

7)SBC

與SUB的區(qū)別是還要減去C標志位的反碼。 SBCR0,R1,R2; R0=R1-R2-!C,并根據(jù)結(jié)果設(shè)置CPSR的進位標志位第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

8)RSB

與SUB的區(qū)別是:減數(shù)與被減數(shù)的位置顛倒一下。

RSBR0,R1,R2;

R0=R2–R1

9)RSC

與RSB的區(qū)別是:除了兩個數(shù)相減外,還要減去C標志位的反碼。

RSCR0,R1,R2;

R0=R2–R1-!C第3章ARM的指令系統(tǒng)及匯編程序設(shè)計算術(shù)邏輯運算指令:

10)TST

將操作數(shù)1和操作數(shù)2按位與運算之后,再更新GPSR中的條件標志位。一般用來檢測是否設(shè)置了特定的位

TSTR1,#0xffee;

將寄存器R1的值與0xffe按位與,并根據(jù)結(jié)果設(shè)置CPSR的標志位

11)TEQ

將操作數(shù)1和操作數(shù)2按位異或運算之后,再更新GPSR中的條件標志位。一般用來檢測操作數(shù)1和操作數(shù)2是否相等 TEQR1,R2;

檢查兩個操作數(shù)是否相等第3章ARM的指令系統(tǒng)及匯編程序設(shè)計比較指令:

1)CMP

將兩個操作數(shù)進行比較,同時更新CPSR中的標志位。

CMPR1,R0 ;

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

2)CMN

操作數(shù)1和取反后的操作數(shù)2進行比較,再更新CPSR中的標志位。 CMNR1,R0 ;

將寄存器R1的值與寄存器R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR的標志位第3章ARM的指令系統(tǒng)及匯編程序設(shè)計比較指令:

3)BIC

操作數(shù)2是32位的掩碼,如果在掩碼中設(shè)置了某一位,則相應(yīng)的在操作數(shù)1中清除對應(yīng)的那一位。

BICR0,R0,#%1011;該指令清除R0中的位0、1和3,其余的位保持不變

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.3乘法指令與乘加指令

指令中的寄存器必須是通用寄存器,不能是立即數(shù)。乘法指令:

1)MUL

操作數(shù)1和操作數(shù)2進行相乘運算。

MULR0,R1,R2;R0=R1×R2

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計乘法指令:

2)SMULL

完成操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中。

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

3)UMLAL

與SMULL的區(qū)別是操作數(shù)1和2均為無符號整數(shù)。

UMULLR0,R1,R2,R3;R0?=?(R2?×?R3)的低32位,R1?=?(R2?×?R3)的高32位第3章ARM的指令系統(tǒng)及匯編程序設(shè)計乘加指令:

1)MLA

完成操作數(shù)1與操作數(shù)2的乘法運算,再將乘積加上操作數(shù)3,并把結(jié)果放置到目的寄存器中。

MLAR0,R1,R2,R3;

R0=R1×R2+R3

2)SMLAL

與SMULL的區(qū)別是將SMULL得到的結(jié)果低32位同目的寄存器的低32位相加放到目的寄存器low中,高32位是類似的。

SMLALR0,R1,R2,R3;R0?=?(R2?×?R3)的低32位?+?R0,R1?=?(R2?×?R3)的高32位?+?R1第3章ARM的指令系統(tǒng)及匯編程序設(shè)計乘加指令:

3)UMLAL

與SMLAL的區(qū)別是操作數(shù)1和2均為無符號的32位整數(shù)。

UMLALR0,R1,R2,R3;

R0?=?(R2?×?R3)的低32位?+?R0,R1=(R2?×?R3)的高32位?+?R1第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.4加載/存儲指令

加載/存儲指令用于寄存器和存儲器之間的數(shù)據(jù)傳送。加載指令用于將存儲器中的數(shù)據(jù)傳送到寄存器,存儲指令則完成相反的操作。加載指令:

1)LDR

從存儲器中將一個32位的字數(shù)據(jù)傳送到目的寄存器中。

LDRR0,[R1,R2];

將存儲器地址為R1?+?R2的字數(shù)據(jù)讀入寄存器R0 LDRR0,[R1],R2;

將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1?+?R2寫入R1第3章ARM的指令系統(tǒng)及匯編程序設(shè)計加載指令:

2)LDRH

從存儲器中將一個16位的半字數(shù)據(jù)傳送到目的寄存器中,將寄存器的高16位清零。

LDRHR0,[R1,#8];

將存儲器地址為R1?+?8的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清零

3)LDRB

與LDRH的區(qū)別是傳送的是8位字節(jié)數(shù)據(jù),將寄存器的高24位清零。 LDRBR0,[R1];

將存儲器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零第3章ARM的指令系統(tǒng)及匯編程序設(shè)計存儲指令:

1)STR

將源寄存器的32位數(shù)據(jù)傳送到存儲器上面。

STRR0,[R1,#8];

將R0中的字數(shù)據(jù)寫入以R1?+?8為地址的存儲器中

2)STRH

將源寄存器的低16位數(shù)據(jù)傳送到存儲器上面。 STRHR0,[R1,#8];

將寄存器R0中的半字數(shù)據(jù)寫入以R1?+?8為地址的存儲器中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計存儲指令:

3)STRB

將源寄存器的低8位數(shù)據(jù)傳送到存儲器上面。

STRBR0,[R1];

將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1為地址的存儲器中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.5批量數(shù)據(jù)加載/存儲指令

批量數(shù)據(jù)加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令則完成相反的操作。批量數(shù)據(jù)加載指令為LDM,批量數(shù)據(jù)存儲指令為STM。 LDM(或STM)指令的格式為: LDM(或STM){條件}{類型}基址寄存器{!},寄存器列表{^}注意:基址寄存器不能為R15!!!!!第3章ARM的指令系統(tǒng)及匯編程序設(shè)計{類型}有以下幾種情況: IA—每次傳送后地址加1; IB—每次傳送前地址加1; DA—每次傳送后地址減1; DB—每次傳送前地址減1; FD—滿遞減堆棧; ED—空遞減堆棧; FA—滿遞增堆棧; EA—空遞增堆棧;第3章ARM的指令系統(tǒng)及匯編程序設(shè)計STMFD?R13!,{R0,R4-R12,LR};

將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧LDMFD?R13!,{R0,R4-R12,LR} ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.6跳轉(zhuǎn)指令

跳轉(zhuǎn)指令用于實現(xiàn)程序流程的跳轉(zhuǎn)。一般有兩種方法實現(xiàn)程序的跳轉(zhuǎn):(1)使用專門的跳轉(zhuǎn)指令。(2)直接向程序計數(shù)器PC寫入跳轉(zhuǎn)地址值。

1)B

處理器將立即跳轉(zhuǎn)到給定的目標地址,從那里繼續(xù)執(zhí)行。

B?Label; 程序無條件跳轉(zhuǎn)到標號Label處執(zhí)行 CMP?R1,#0; BEQ?Label; 當CPSR寄存器中的Z條件碼置位,程序跳轉(zhuǎn)到標號Label處執(zhí)行第3章ARM的指令系統(tǒng)及匯編程序設(shè)計跳轉(zhuǎn)指令:

2)BL

與B的區(qū)別是:在跳轉(zhuǎn)之前會將當前PC的值保存在R14中。

BLLabel;當程序無條件跳轉(zhuǎn)到標號Label處執(zhí)行時,將當前的PC值保存到R14中

3)BLX

與BL的區(qū)別是ARM處理器的狀態(tài)由ARM狀態(tài)轉(zhuǎn)換到Thumb狀態(tài)。

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.7程序狀態(tài)寄存器訪問指令 ARM微處理器支持程序狀態(tài)寄存器訪問指令,這些指令用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。程序狀態(tài)寄存器訪問指令包括MRS指令和MSR指令。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 1)MRS

MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。

MRS指令的語法格式為:MRS{條件}通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR) MRS?R0,CPSR;

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

傳送SPSR的內(nèi)容到R0第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 2)MSR

MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。

MSR指令的語法格式為:MSR{條件}程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù) MSR?CPSR,R0;

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

傳送R0的內(nèi)容到SPSR MSR?CPSR_c,R0;

傳送R0的內(nèi)容到SPSR,但僅僅修改CPSR中的控制位域第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.8數(shù)據(jù)交換指令 ARM微處理器支持數(shù)據(jù)交換指令,這些指令用于在存儲器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令包括SWP(字數(shù)據(jù)交換指令)和SWPB(字節(jié)數(shù)據(jù)交換指令)。與之相對應(yīng)的程序狀態(tài)寄存器訪問指令,它用于的是在程序狀態(tài)寄存器和通用寄存器之間的數(shù)據(jù)交換。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 1)SWP

SWP指令用于將源寄存器2所指向的存儲器中的字數(shù)據(jù)傳送到目的寄存器中,同時將源寄存器1中的字數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。

SWP指令的語法格式為

SWP{條件}目的寄存器,源寄存器1,[源寄存器2] SWPR0,R1,[R2]; 將R2所指向的存儲器中的字數(shù)據(jù)傳送到R0,同時將R1中的字數(shù)據(jù)傳送到R2所指向的存儲單元第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 2)SWPB

SWPB指令用于將源寄存器2所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24位清零,同時將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。

SWPB指令的語法格式為SWPB{條件}目的寄存器,源寄存器1,[源寄存器2] SWPB?R0,R0,[R1]; 將R1所指向的存儲器中的字節(jié)數(shù)據(jù)與R0中的低8位數(shù)據(jù)交換第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.9協(xié)處理器指令 ARM的協(xié)處理器指令主要用于ARM處理器初始化、ARM協(xié)處理器的數(shù)據(jù)處理操作、在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù)、在ARM協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括CDP、LDC、STC、和MRC。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 1)CDP

CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作。若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。

CDP指令的語法格式為CDP{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2 CDP?P3,2,C12,C10,C3,4;

完成協(xié)處理器P3的初始化第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 2)LDC

LDC指令用于將源寄存器所指向的存儲器中的字數(shù)據(jù)傳送到目的寄存器中。若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。

LDC指令的語法格式為LDC{條件}{L}協(xié)處理器編碼,目的寄存器,[源寄存器]

LDC?P3,C4,[R0];

將ARM處理器的寄存器R0所指向的存儲器中的字數(shù)據(jù)傳送到協(xié)處理器P3的寄存器C4中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 3)STC

STC指令用于將源寄存器中的字數(shù)據(jù)傳送到目的寄存器所指向的存儲器中。若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。 STC指令的語法格式為STC{條件}{L}協(xié)處理器編碼,源寄存器,[目的寄存器]

STC?P3,C4,[R0];

將協(xié)處理器P3的寄存器C4中的字數(shù)據(jù)傳送到ARM處理器的寄存器R0所指向的存儲器中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 4)MCR

MCR指令用于將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器中。若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。 MCR指令的語法格式為MCR{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2

MCR?P3,3,R0,C4,C5,6;

將ARM處理器的寄存器R0中的數(shù)據(jù)傳送到協(xié)處理器P3的寄存器C4和C5中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 5)MRC

MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。 MRC指令的語法格式為MRC{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2

MRC?P3,3,R0,C4,C5,6;

將協(xié)處理器P3的寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.3.10異常產(chǎn)生指令 ARM微處理器支持的異常指令有SWI指令(軟件中斷指令)和BKPT指令(斷點中斷指令)。

1)SWI

SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。SWI指令的語法格式為: SWI{條件}24位的立即數(shù) SWI?0x02;

調(diào)用操作系統(tǒng)編號為02的系統(tǒng)例程第3章ARM的指令系統(tǒng)及匯編程序設(shè)計 2)BKPT

BKPT指令產(chǎn)生軟件斷點中斷,可用于程序的調(diào)試。 BKPT指令的語法格式為: BKPT16位的立即數(shù)

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.4GNUARM匯編器支持的偽操作指令

在ARM匯編語言程序中,有一些特殊指令助記符,它們與指令系統(tǒng)的助記符有所不同,沒有相應(yīng)的操作碼,通常稱這些特殊指令助記符為偽操作標識符。在匯編程序中,偽操作指令主要有符號定義偽操作指令、數(shù)據(jù)定義偽操作指令、匯編控制偽操作指令及其雜項偽操作指令等。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計符號定義偽操作指令:

1)GBLA、GBLL

和GBLS GBLA:用于定義一個全局的數(shù)字變量;

GBLL:用于定義一個全局的邏輯變量; GBLS:用于定義一個全局的字符串變量。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計符號定義偽操作指令:

2)LCLA、LCLL和LCLS LCLA:用于定義一個ARM程序中的局部變量; LCLL:用于定義一個局部的邏輯變量; LCLS:用于定義一個局部的字符串變量。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計符號定義偽操作指令:

3)SETA、SETL和SETS SETA:用于給一個已經(jīng)定義的全局變量或局部變量賦值; SETL:用于給一個邏輯變量賦值; SETS:用于給一個字符串變量賦值。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計符號定義偽操作指令:

4)RLIST

RLIST偽指令用于對一個通用寄存器列表定義名稱。該偽指令定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序需根據(jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。 RLIST偽指令的語法格式為

名稱RLIST{寄存器列表}第3章ARM的指令系統(tǒng)及匯編程序設(shè)計符號定義偽操作指令:

GBLATest1;

定義一個全局的數(shù)字變量,變量名為Test1

Test1SETA0xaa;

將該變量賦值為0xaa

LCLLTest5;

聲明一個局部的邏輯變量,變量名為Test5

Test4SETL{TRUE};

將該變量賦值為真

LCLATest3;

聲明一個局部的數(shù)字變量,變量名為Test3

Test3SETA0xaa;

將該變量賦值為0xaa

RegListRLIST{R0-R5,R8,R10};

將寄存器列表定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

1)DCB

DCB偽指令用于分配一片連續(xù)的字節(jié)存儲單元并用偽指令中指定的表達式初始化。

DCB偽指令的語法格式為:

標號DCB表達式 StrDCB"Thisisatest!";

分配一片連續(xù)的字節(jié)存儲單元并初始化第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

2)DCW(DCWU)

DCW(DCWU)偽指令用于分配一片連續(xù)的半字存儲單元并用偽指令中指定的表達式初始化。

DCW偽指令的語法格式為:

標號DCW(DCWU)表達式 DataTestDCW1,2,3;

分配一片連續(xù)的半字存儲單元并初始化第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

3)DCD(DCDU)

DCD(DCDU)偽指令用于分配一片連續(xù)的字存儲單元并用偽指令中指定的表達式初始化。

DCD(DCDU)偽指令的語法格式為:

標號DCD(DCDU)表達式 DataTestDCD4,5,6;

分配一片連續(xù)的字存儲單元并初始化第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

4)DCFD(DCFDU)

DCFD(DCFDU)偽指令用于為雙精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽指令中指定的表達式初始化。

DCFD(DCFDU)偽指令的語法格式為:

標號DCFD(或DCFDU)表達式 FDataTestDCFD2E115,-5E7;

分配一片連續(xù)的字存儲單元并初始化為指定的雙精度數(shù)第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

5)DCFS(DCFSU)

DCFS(或DCFSU)偽指令用于為單精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽指令中指定的表達式初始化。

DCFS(DCFSU)偽指令的語法格式為:

標號DCFS(或DCFSU)表達式 FDataTestDCFS2E5,-5E-7;

分配一片連續(xù)的字存儲單元并初始化為指定的單精度數(shù)第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

6)DCQ(DCQU)

DCQ(DCQU)偽指令用于分配一片以8個字節(jié)為單位的連續(xù)存儲區(qū)域并用偽指令中指定的表達式初始化。

DCQ(DCQU)偽指令的語法格式為:

標號DCQ(DCQU)表達式 DataTestDCQ100;

分配一片連續(xù)的存儲單元并初始化為指定的值第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

7)SPACE

SPACE偽指令用于分配一片連續(xù)的存儲區(qū)域并初始化為0。其中,表達式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。 SPACE偽指令的語法格式為:

標號SPACE表達式 DataSpaceSPACE100 ;分配連續(xù)100字節(jié)的存儲單元并初始化為0第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

8)MAP

MAP偽指令用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。 MAP偽指令的語法格式為: MAP表達式{,基址寄存器} MAP0x100,R0;

定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100?+?R0第3章ARM的指令系統(tǒng)及匯編程序設(shè)計數(shù)據(jù)定義偽操作指令:

9)FIELD

FIELD偽指令用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。 FIELD偽指令的語法格式為:

標號FIELD表達式 MAP0x100;

定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100 AFIELD16;

定義A的長度為16字節(jié),位置為0x100第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編控制偽操作指令:

1).if….else….endif

.if….else….endif偽操作指令的語法格式為 .if邏輯表達式

指令1

… .elseif邏輯表達式2

指令2

… .endif第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編控制偽操作指令:

2).macro….endm

.macro….endm偽操作指令的語法格式為 .macro {$標號}宏名{$參數(shù)1{,參數(shù)2,…}}

指令 .endm第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編控制偽操作指令:

3).mexit

.mexit偽操作指令的語法格式為 .macro {$標號}宏名{$參數(shù)1{,參數(shù)2,…}}

指令 .endm第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編控制偽操作指令:

4)WHILE、WEND

WHILE、WEND偽操作指令的語法格式為 WHILE邏輯表達式

指令序列

WEND第3章ARM的指令系統(tǒng)及匯編程序設(shè)計雜項偽操作指令:

1)AREA

AREA偽指令用于定義一個代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用“?|?”括起來,如?|1_test|。屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個屬性用逗號分隔。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計常用的屬性如下:●?CODE屬性:定義代碼段,默認為READONLY?!?/p>

DATA屬性:定義數(shù)據(jù)段,默認為READWRITE。●

READONLY屬性:指定本段為只讀,代碼段默認為READONLY?!?/p>

READWRITE屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認屬性為READWRITE?!?/p>

COMMON屬性:定義一個通用的段,不包含任何用戶代碼和數(shù)據(jù)。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計雜項偽操作指令:

2)ALIGN 8)IMPORT 3)CODE16 9)EXTERN 4)ENTRY 10)GET 5)END 11)INCBIN 6)EQU 12)RN 7)EXPORT 13)ROUT第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.5ARM匯編偽指令A(yù)RM匯編程序中的偽指令不是真正的ARM指令或者Thumb指令。這些偽指令在匯編編譯時被替換成對應(yīng)的ARM或Thumb指令(序列)。ARM偽指令包括ADR、ADRL、LDR和NOP等。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

1)ADR(小范圍地址的讀取偽指令)

ADR指令將基于PC的地址值或基于寄存器的地址值讀取到寄存器中。 ADR偽指令的語法格式為: ADR{cond}register,expr

其中,cond為可選的指令執(zhí)行條件,register為目標寄存器,expr為基于PC或者基于寄存器的地址表達式。

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

startMOVr0,#10;

因為PC值為當前指令地址值加8字節(jié) ADRr4,start;

本ADR偽指令將被編譯器替換成SUBr4,pc,#0xc

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

2)ADRL(中等范圍的地址讀取偽指令)

ADRL指令將基于PC或基于寄存器的地址值讀取到寄存器中。ADRL偽指令比ADR偽指令可以讀取更大范圍的地址。 ADRL偽指令的語法格式為: ADRL{cond}register,expr

其中,地址表達式expr的取值范圍為:當?shù)刂分凳亲止?jié)對齊時,其取指范圍為?-64?K~64?K;當?shù)刂分凳亲謱R時,其取指范圍為?-256?K~256?K。

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

startMOVr0,#10;

因為PC值為當前指令地址值加8字節(jié) ADRLr4,start?+?60000;

本ADRL偽指令將被編譯器替換成下面兩條指令 ADDr4,pc,#0xe800 ADDr4,r4,#0x254

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

3)LDR(大范圍的地址讀取偽指令)

LDR偽指令將一個32位的常數(shù)或者一個地址值讀取到寄存器中。 LDR偽指令的語法格式為: LDR{cond}register,=[expr|label-expr]

其中,expr為32位的常量。label-expr為基于PC的地址表達式或者是外部表達式。

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

LDR偽指令主要有以下兩種用途:

①當需要讀取到寄存器中的數(shù)據(jù)超過了MOV及MVN指令可以操作的范圍時,可以使用LDR偽指令將該數(shù)據(jù)讀取到寄存器中。

②將一個基于PC的地址值或者外部的地址值讀取到寄存器中。

第3章ARM的指令系統(tǒng)及匯編程序設(shè)計匯編偽指令:

LDRR1,=0xFF0;

將0xff0讀取到R1中

匯編后將得到 MOVR1,0xFF0 LDRR1,=0xFFF;

將0xfff讀取到R1中

匯編后將得到 LDRR1,[PC,OFFSET_TO_LPOOL]

… LPOOLDCD0xFFF LDRR1,=ADDR1;

將外部地址ADDR1讀取到R1中

匯編后將得到 LDRR1,[PC,OFFSET_TO_LPOOL] 第3章ARM的指令系統(tǒng)及匯編程序設(shè)計程

序文件名后綴匯編*.SC程序*.C頭文件*.H引入文件*.INC3.6ARM匯編編程簡介3.6.1ARM匯編語言文件格式表3.3ARM源程序文件名的后綴名第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.6.2ARM匯編語言語句格式

ARM匯編語言的語句格式為: [標號]<指令|條件|S><操作數(shù)>[;注釋]

ARM匯編語言中,所有標號必須在一行的頂格書寫,其后面不要添加“:”,而所有指令均不能頂格書寫。ARM匯編器對標示符大小寫敏感,書寫標號及指令時字母大小寫要一致。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計1、匯編語言程序中的標號1)標號

在ARM匯編程序中,標號代表一個地址,段內(nèi)標號的地址在匯編時確定,而段外標號的地址值在連接時確定。根據(jù)標號的生成方式可將其分為三種:基于PC的標號基于寄存器的標號絕對地址第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2)局部標號

局部標號主要用于局部范圍代碼中,也經(jīng)常在宏定義中使用。

局部標號的定義格式為: N{routname}

其中,N為局部標號,范圍為0~99;routname為局部標號作用范圍的名稱,由ROUT偽指令定義。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2、匯編語言程序中的符號1)常量(1)數(shù)字常量:

①十進制數(shù),如12、4、987、0。

②十六進制數(shù),如0x439、0xFF0、0x1。

③n進制數(shù),用n-XXX表示,其中n?=?2~9,XXX為具體的數(shù)。(2)字符常量。(3)布爾常量。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2)變量

變量是指其值在程序的運行過程中可以改變的量。ARM匯編程序所支持的變量有數(shù)字變量、邏輯變量和字符串變量。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3)匯編語言程序中的表達式和運算符

常用的表達式有數(shù)學(xué)表達式、邏輯表達式和字符串表達式,其運算的優(yōu)先級次序如下:(1)優(yōu)先級相同的雙目運算符的運算順序為從左到右;(2)相鄰的單目運算符的運算順序是從右到左,且單目運算符的優(yōu)先級高于其他運算符;(3)括號運算符的優(yōu)先級最高。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計3.6.3C語言和匯編語言的混合編程1.匯編語言的程序結(jié)構(gòu)

一個匯編程序至少應(yīng)該有一個代碼段,當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段。多個段在程序編譯鏈接時最終形成一個可執(zhí)行的映像文件。第3章ARM的指令系統(tǒng)及匯編程序設(shè)計以下是一個匯編語言源程序的基本結(jié)構(gòu): AREAInit,CODE,READONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,0xFF STR R1,[R0] LDR R0,=0x3FF5008 LDR R0,=0x01 STR R1,[R0]

… END第3章ARM的指令系統(tǒng)及匯編程序設(shè)計2.匯編語言與C語言的混合編程

在應(yīng)用系統(tǒng)的程序設(shè)計中,若所有的編程任務(wù)都用匯

溫馨提示

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

評論

0/150

提交評論