嵌入式系統(tǒng)4+(ARM指令詳細介紹)_第1頁
嵌入式系統(tǒng)4+(ARM指令詳細介紹)_第2頁
嵌入式系統(tǒng)4+(ARM指令詳細介紹)_第3頁
嵌入式系統(tǒng)4+(ARM指令詳細介紹)_第4頁
嵌入式系統(tǒng)4+(ARM指令詳細介紹)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)第四講ARM指令詳細介紹西安電子科技大學(xué)計算機學(xué)院2ARM指令集編碼西安電子科技大學(xué)計算機學(xué)院3指令分類數(shù)據(jù)處理指令load/store指令跳轉(zhuǎn)指令CPSR處理指令異常產(chǎn)生指令協(xié)處理器指令西安電子科技大學(xué)計算機學(xué)院41數(shù)據(jù)處理指令數(shù)據(jù)傳送指令(2條)算術(shù)運算指令(6條)邏輯運算指令(4條)比較指令(2條)測試指令(2條)乘法指令(6條)西安電子科技大學(xué)計算機學(xué)院51.1數(shù)據(jù)傳送指令MOV指令

MOV指令的格式為:

MOV{條件}{S}目的寄存器,源操作數(shù)MOV指令可完成從另一個寄存器、被移位的寄存器或?qū)⒁粋€立即數(shù)加載到目的寄存器。其中S選項決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。指令示例: MOV R1,R0 MOV R1,R0,LSL#3西安電子科技大學(xué)計算機學(xué)院61.1數(shù)據(jù)傳送指令MVN指令MVN指令的格式為:

MVN{條件}{S}目的寄存器,源操作數(shù)MVN指令可完成從另一個寄存器、被移位的寄存器、或?qū)⒁粋€立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。指令示例: MVN R0,#0 西安電子科技大學(xué)計算機學(xué)院71.2算術(shù)運算指令A(yù)DD指令

ADD指令的格式為:

ADD{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2ADD指令用于把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。指令示例: ADD R0,R1,R2 ADD R0,R1,#256 ADD R0,R2,R3,LSL#1西安電子科技大學(xué)計算機學(xué)院81.2算術(shù)運算指令A(yù)DC指令

ADC指令的格式為:

ADC{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2ADC指令用于把兩個操作數(shù)相加,再加上CPSR中的C條件標志位的值,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。以下指令序列完成兩個128位數(shù)的加法,第一個數(shù)存放在寄存器R7~R4,第二個數(shù)存放在寄存器R11~R8,運算結(jié)果存放在寄存器R3~R0: ADDS R0,R4,R8;加低端的字 ADCS R1,R5,R9;加第二個字,帶進位 ADCS R2,R6,R10;加第三個字,帶進位 ADC R3,R7,R11;加第四個字,帶進位

西安電子科技大學(xué)計算機學(xué)院91.2算術(shù)運算指令SUB指令

SUB指令的格式為:

SUB{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。指令示例:SUB R0,R1,R2;R0=R1-R2SUB R0,R1,#256;R0=R1-256SUB R0,R2,R3,LSL#1;R0=R2-(R3<<1)西安電子科技大學(xué)計算機學(xué)院101.2算術(shù)運算指令SBC指令

SBC指令的格式為:

SBC{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中的C條件標志位的非,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。以下指令序列實現(xiàn)64減法(R1,R0)-(R3,R2) SUBS R0,R0,R2 SBC R1,R1,R3西安電子科技大學(xué)計算機學(xué)院111.2算術(shù)運算指令RSB指令

RSB指令的格式為:

RSB{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。指令示例: RSB R0,R1,R2 RSB R0,R1,#256 RSB R0,R2,R3,LSL#1西安電子科技大學(xué)計算機學(xué)院121.2算術(shù)運算指令RSC指令

RSC指令的格式為:

RSC{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標志位,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進位標志來表示借位,這樣就可以做大于32位的減法。下列指令實現(xiàn)64位數(shù)據(jù)的負數(shù) RSBSR2,R0,#0 RSCR3,R1,#0西安電子科技大學(xué)計算機學(xué)院131.3邏輯運算指令A(yù)ND指令A(yù)ND指令的格式為:

AND{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2AND指令用于在兩個操作數(shù)上進行邏輯與運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。例如: AND R0,R0,#3;將高位屏蔽(取出低位)西安電子科技大學(xué)計算機學(xué)院141.3邏輯運算指令ORR指令ORR指令的格式為:

ORR{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2ORR指令用于在兩個操作數(shù)上進行邏輯或運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。例如: ORR R0,R0,#3;將低位置位西安電子科技大學(xué)計算機學(xué)院151.3邏輯運算指令EOR指令EOR指令的格式為:EOR{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2EOR指令用于在兩個操作數(shù)上進行邏輯異或運算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。例如: EOR R0,R0,#3西安電子科技大學(xué)計算機學(xué)院161.3邏輯運算指令BIC指令BIC指令的格式為:

BIC{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。操作數(shù)2為32位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不變。例如:

BIC R0,R0,#3;清除低兩位西安電子科技大學(xué)計算機學(xué)院171.4比較指令CMP指令CMP指令的格式為:

CMP{條件}操作數(shù)1,操作數(shù)2CMP指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行比較,同時無條件更新CPSR中條件標志位的值。該指令進行一次減法運算,但不存儲結(jié)果,只更改條件標志位。標志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等),例如,當操作數(shù)1大于操作操作數(shù)2,則此后的有GT后綴的指令將可以執(zhí)行。例如: CMPR1,R0 CMPR1,#100西安電子科技大學(xué)計算機學(xué)院181.4比較指令CMN指令

CMN指令的格式為:

CMN{條件}操作數(shù)1,操作數(shù)2CMN指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)取補后進行比較,同時無條件更新CPSR中條件標志位的值。該指令實際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標志位。例如: CMN R1,R0 CMN R1,#100西安電子科技大學(xué)計算機學(xué)院191.5測試指令TST指令

TST指令的格式為:

TST{條件}操作數(shù)1,操作數(shù)2TST指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的與運算,并根據(jù)運算結(jié)果無條件更新CPSR中條件標志位的值。操作數(shù)1是要測試的數(shù)據(jù),而操作數(shù)2是一個位掩碼,該指令一般用來檢測是否設(shè)置了特定的位。 TST R1,#1 TST R1,#0xffe 西安電子科技大學(xué)計算機學(xué)院201.5測試指令TEQ指令

TEQ指令的格式為:

TEQ{條件}操作數(shù)1,操作數(shù)2TEQ指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的異或運算,并根據(jù)運算結(jié)果無條件更新CPSR中條件標志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。例如: TEQ R1,R2西安電子科技大學(xué)計算機學(xué)院211.6乘法指令MUL 32位乘法指令MLA 32位乘加指令SMULL 64位有符號數(shù)乘法指令SMLAL 64位有符號數(shù)乘加指令UMULL 64位無符號數(shù)乘法指令UMLAL 64位無符號數(shù)乘加指令西安電子科技大學(xué)計算機學(xué)院221.6乘法指令MUL指令

MUL指令的格式為:

MUL{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。例如: MUL R0,R1,R2 MULS R0,R1,R2 西安電子科技大學(xué)計算機學(xué)院231.6乘法指令MLA指令MLA指令的格式為:

MLA{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2,操作數(shù)3MLA指令完成將操作數(shù)1與操作數(shù)2的乘法運算,再將乘積加上操作數(shù)3,并把結(jié)果的低32位放置到目的寄存器中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。例如: MLA R0,R1,R2,R3 MLAS R0,R1,R2,R3西安電子科技大學(xué)計算機學(xué)院241.6乘法指令SMULL指令SMULL指令格式為:

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

SMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。例如:SMULLR0,R1,R2,R3;R0(Low32)←(R2×R3)Low32

;R1(High32)←(R2×R3)High32西安電子科技大學(xué)計算機學(xué)院251.6乘法指令SMLAL指令SMLAL指令的格式為:

SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2SMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。西安電子科技大學(xué)計算機學(xué)院261.6乘法指令UMULL指令UMULL指令的格式為:

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

UMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號數(shù)。例如:UMULLR0,R1,R2,R3;R0(Low32)←(R2×R3)Low32 ;R1(High32)←(R2×R3)High32西安電子科技大學(xué)計算機學(xué)院271.6乘法指令UMLAL指令UMLAL指令的格式為:

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

UMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運算結(jié)果設(shè)置CPSR中相應(yīng)的條件標志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號數(shù)。對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。西安電子科技大學(xué)計算機學(xué)院282load/store指令A(yù)RM微處理器支持加載(Load)/存儲(Store)指令用于在寄存器和存儲器之間傳送數(shù)據(jù)。單寄存器存取指令LDR 字數(shù)據(jù)加載指令LDRB 字節(jié)數(shù)據(jù)加載指令LDRH 半字數(shù)據(jù)加載指令STR 字數(shù)據(jù)存儲指令STRB 字節(jié)數(shù)據(jù)存儲指令STRH 半字數(shù)據(jù)存儲指令多寄存器存取指令LDM 批量數(shù)據(jù)加載指令STM 批量數(shù)據(jù)存儲指令存儲器和寄存器交換指令SWP/SWPB西安電子科技大學(xué)計算機學(xué)院292.1字數(shù)據(jù)加載指令LDR指令LDR指令的格式為:

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

LDR指令用于從存儲器中將一個32位的字數(shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲器中讀取32位的字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。例如:LDRR0,[R1];將內(nèi)存單元[R1]中的字讀取到R0寄存器中LDRR0,[R1,R2];將內(nèi)存單元[R1+R2]中的字讀取到 R0寄存器中LDRR0,[R1,#8];將內(nèi)存單元[R1+8]中的字讀取到R0 寄存器中LDRR0,[R1,R2]?。粚?nèi)存單元[R1+R2]中的字讀取到R0 寄存器中,同時R1←R1+R2西安電子科技大學(xué)計算機學(xué)院302.2字節(jié)數(shù)據(jù)加載指令LDRB指令LDRB指令的格式為:

LDR{條件}B目的寄存器,<存儲器地址>LDRB指令用于從存儲器中將一個8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高24位清零。該指令通常用于從存儲器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。LDRBR0,[R1];將內(nèi)存單元[R1]中的字節(jié)讀取到R0 寄存器中,R0中高24位設(shè)置為0LDRBR0,[R1,#8];將內(nèi)存單元[R1+8]中的字節(jié) 讀取到R0寄存器中,R0中高24位設(shè)置為0西安電子科技大學(xué)計算機學(xué)院312.3半字數(shù)據(jù)加載指令LDRH指令LDRH指令的格式為:

LDR{條件}H目的寄存器,<存儲器地址>LDRH指令用于從存儲器中將一個16位的半字數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高16位清零。該指令通常用于從存儲器中讀取16位的半字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。LDRHR0,[R1];將內(nèi)存單元[R1]中的半字(16位)數(shù)據(jù)讀 取到R0寄存器中,R0中高16位設(shè)置為0LDRHR0,[R1,#8];將內(nèi)存單元[R1+8]中的半字(16位) 數(shù)據(jù)讀取到R0寄存器中,R0中高16位設(shè)置為0LDRHR0,[R1,R2];將內(nèi)存單元[R1+R2]中的半字(16位) 數(shù)據(jù)讀取到R0寄存器中,R0中高16位設(shè)置為0

西安電子科技大學(xué)計算機學(xué)院322.4字數(shù)據(jù)存儲指令STR指令STR指令的格式為:

STR{條件}源寄存器,<存儲器地址>STR指令用于從源寄存器中將一個32位的字數(shù)據(jù)傳送到存儲器中。該指令在程序設(shè)計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。STR R0,[R1],#8;將R0的字數(shù)據(jù)保存到內(nèi)存單元 [R1]中,同時R1←R1+8(后變)STR R0,[R1,#8];將R0的字數(shù)據(jù)保存到內(nèi)存單元 [R1+8]中(前變)西安電子科技大學(xué)計算機學(xué)院332.5字節(jié)數(shù)據(jù)存儲指令STRB指令STRB指令的格式為:

STR{條件}B源寄存器,<存儲器地址>STRB指令用于從源寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。STRB R0,[R1];將R0的低8位數(shù)據(jù)保存到 內(nèi)存單元[R1]中STRB R0,[R1,#8];將R0的低8位數(shù)據(jù)保存到 內(nèi)存單元[R1]中西安電子科技大學(xué)計算機學(xué)院342.6半字數(shù)據(jù)存儲指令STRH指令STRH指令的格式為:

STR{條件}H源寄存器,<存儲器地址>STRH指令用于從源寄存器中將一個16位的半字數(shù)據(jù)傳送到存儲器中。該半字數(shù)據(jù)為源寄存器中的低16位。STRH R0,[R1];將R0中的16位的半字數(shù)據(jù) 保存到內(nèi)存單元[R1]中STRH R0,[R1,#8];將R0中的16位的半字數(shù)據(jù) 保存到內(nèi)存單元[R1+8]中

西安電子科技大學(xué)計算機學(xué)院35LDR/STR指令的尋址方式基址尋址變址尋址變址尋址靈活多變,需要認真掌握西安電子科技大學(xué)計算機學(xué)院36批量數(shù)據(jù)加載(LDM)/存儲(STM)內(nèi)存訪問指令A(yù)RM微處理器所支持批量數(shù)據(jù)加載/存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù)。批量數(shù)據(jù)加載指令(LDM)用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令(STR)則完成相反的操作。IA、IB、DA、DBFD、ED、FA、EA西安電子科技大學(xué)計算機學(xué)院372.7批量數(shù)據(jù)存儲指令STM指令STM指令的格式為:

STM{條件}{類型}基址寄存器{!},寄存器列表{^}STM指令用于將寄存器列表所指示的多個寄存器數(shù)據(jù)送到由基址寄存器所指示的一片連續(xù)存儲器,該指令的常見用途是將多個寄存器的內(nèi)容入棧。例如:STMFDR0!,{r0-r4};將寄存器列表中的寄存器 (R1~R4)內(nèi)容按照滿遞減的方式 存入到[R0]指示的4個連續(xù)存儲器單元中西安電子科技大學(xué)計算機學(xué)院382.8批量數(shù)據(jù)加載指令LDM指令LDM指令的格式為:

LDM{條件}{類型}基址寄存器{!},寄存器列表{^}LDM指令用于從由基址寄存器所指示的一片連續(xù)存儲器送字數(shù)據(jù)到寄存器列表所指示的多個寄存器中,該指令的常見用途是將多個寄存器出棧。例如:

LDMFDR0!,{r1-r4};將[R0]指示的4個連續(xù)存儲器 單元的內(nèi)容按照滿遞減的方式送到 寄存器列表中的寄存器(R1~R4)中西安電子科技大學(xué)計算機學(xué)院39可選后綴{!}回寫使能標志為可選后綴,若選用該后綴,則當數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。{^}為可選后綴,當指令為LDM,且寄存器列表中包含R15,選用該后綴時表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。西安電子科技大學(xué)計算機學(xué)院402.9存儲器和寄存器交換指令A(yù)RM微處理器所支持數(shù)據(jù)交換指令能在存儲器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令主要用于實現(xiàn)信號量操作,信號量用于進程間的同步與互斥。西安電子科技大學(xué)計算機學(xué)院412.9存儲器和寄存器交換指令SWP指令SWP指令的格式為:

SWP{條件}目的寄存器,源寄存器1,[源寄存器2]SWP指令用于將源寄存器2所指向的存儲器中的字數(shù)據(jù)傳送到目的寄存器中,同時將源寄存器1中的字數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。顯然,當源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。SWPR0,R1,[R2];R0←[R2],[R2]←R1SWPR0,R0,[R2];R0(目的)←[R2],[R2]←R0(源) 即實現(xiàn)了寄存器R0的內(nèi)容與存 儲器地址[R2]的內(nèi)容的交換

西安電子科技大學(xué)計算機學(xué)院42信號量操作舉例SEM EQU 0x40003000 …SEM_WAIT MOV R1,#0 LDR R0,=SEM SWP R1,R1,[R0];取出信號量, 并設(shè)置其為0 CMP R1,#0;判斷是否有信號 BEQ SEM_WAIT;若沒有,則等待西安電子科技大學(xué)計算機學(xué)院433跳轉(zhuǎn)指令A(yù)RM中實現(xiàn)程序跳轉(zhuǎn)直接向PC寄存器寫入目標地址值跳轉(zhuǎn)指令實現(xiàn)向PC寄存器寫入目標地址值可實現(xiàn)4GB地址空間的任意跳轉(zhuǎn)跳轉(zhuǎn)指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉(zhuǎn),包括:B 跳轉(zhuǎn)指令BL 帶返回的跳轉(zhuǎn)指令BX 帶狀態(tài)切換的跳轉(zhuǎn)指令BLX 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令西安電子科技大學(xué)計算機學(xué)院443.1跳轉(zhuǎn)指令B指令B指令的格式為:

B{條件} 目標地址B指令是最簡單的跳轉(zhuǎn)指令。一旦遇到一個B指令,ARM處理器將立即跳轉(zhuǎn)到給定的目標地址,從那里繼續(xù)執(zhí)行。注意存儲在跳轉(zhuǎn)指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算。它是24位有符號數(shù),左移兩位后有符號擴展為32位,表示的有效偏移為26位(前后32MB的地址空間)。如:BLabel/*程序無條件跳轉(zhuǎn)到標號Label處執(zhí)行*/西安電子科技大學(xué)計算機學(xué)院453.2帶返回的跳轉(zhuǎn)指令BL指令BL指令的格式為:

BL{條件} 目標地址BL是另一個跳轉(zhuǎn)指令,但跳轉(zhuǎn)之前,會在寄存器R14中保存PC的當前內(nèi)容,因此,可以通過將R14的內(nèi)容重新加載到PC中,來返回到跳轉(zhuǎn)指令之后的那個指令處執(zhí)行。該指令是實現(xiàn)子程序調(diào)用的一個基本但常用的手段。例如:BL Label /*當程序無條件跳轉(zhuǎn)到標號Label處執(zhí) 行時,同時將當前的PC值保存到R14中*/西安電子科技大學(xué)計算機學(xué)院463.3帶狀態(tài)切換的跳轉(zhuǎn)指令BX指令BX指令的格式為:

BX{條件}目標地址BX指令跳轉(zhuǎn)到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。因此,當前處理器工作狀態(tài)使用Thumb指令集時,通過BX指令可使當前處理器工作狀態(tài)切換到ARM指令集運行狀態(tài),反之亦然。具體狀態(tài)有目標寄存器最低位決定。例如:ADRL R0,ThumbFun+1BX R0 ;跳轉(zhuǎn)到R0指定的地址,并根 據(jù)R0最低位來切換處理器狀態(tài)西安電子科技大學(xué)計算機學(xué)院473.4帶返回和狀態(tài)切換的跳轉(zhuǎn)BLX指令BLX指令的格式為:

BLX目標地址BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標地址,并將處理器的工作狀態(tài)由ARM狀態(tài)切換到Thumb狀態(tài),該指令同時將PC的當前內(nèi)容保存到寄存器R14中。因此,當子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時,可以通過BLX指令實現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時,子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。西安電子科技大學(xué)計算機學(xué)院484程序狀態(tài)寄存器訪問指令

ARM微處理器支持程序狀態(tài)寄存器(PSR)訪問指令,用于在程序狀態(tài)寄存器(CPSR/SPSR)和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:MRS狀態(tài)寄存器的內(nèi)容讀取到通用寄存器(Rn←CPSR/SPSR)MSR立即數(shù)或通用寄存器內(nèi)容寫到狀態(tài)寄存器的指定區(qū)域(CPSR/SPSR←Rn)西安電子科技大學(xué)計算機學(xué)院494.1MRS指令MRS指令的格式為:MRS{條件}通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR)MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。例如:MRS R0,CPSR ;R0←CPSRMRS R0,SPSR ;R0←SPSR該指令一般用在以下幾種情況:當需要改變程序狀態(tài)寄存器的內(nèi)容時,可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。當在異常處理或進程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。西安電子科技大學(xué)計算機學(xué)院504.2MSR指令MSR指令的格式為:

MSR{條件} 程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù)MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。MSR指令的形式如下:

MSR{cond}<PSR>_<fields>,#immed_8r MSR{cond}<PSR>_<fields>,Rm西安電子科技大學(xué)計算機學(xué)院514.2MSR指令其中:<域>用于設(shè)置程序狀態(tài)寄存器中需要操作的位(4個域)c位[7:0]為控制位域,用c表示;x位[15:8]為擴展位域,用x表示;s位[23:16]為狀態(tài)位域,用s表示;

f位[31:24]為條件標志位域,用f表示;例如:MSR CPSR,R0 ;CPSR←R0MSR CPSR_c,R0 ;CPSR_c←R0,僅改變CPSR的控 制域即位[7:0]西安電子科技大學(xué)計算機學(xué)院525異常產(chǎn)生指令A(yù)RM微處理器所支持的異常指令有如下兩條:SWI 軟件中斷指令BKPT 斷點中斷指令(ARMv5以上)西安電子科技大學(xué)計算機學(xué)院535.1軟件中斷指令SWI指令SWI指令的格式為:

SWI{條件}24位的立即數(shù)SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應(yīng)的系統(tǒng)服務(wù),指令中24位的立即數(shù)指定用戶程序調(diào)用系統(tǒng)例程的類型,相關(guān)參數(shù)通過通用寄存器傳遞,當指令中24位的立即數(shù)被忽略時,用戶程序調(diào)用系統(tǒng)例程的類型由通用寄存器R0的內(nèi)容決定,同時,參數(shù)通過其他通用寄存器傳遞。例如:SWI 0x02;西安電子科技大學(xué)計算機學(xué)院545.2斷點中斷指令BKPT指令BKPT指令的格式為:

BKPT 16位的立即數(shù)BKPT指令產(chǎn)生軟件斷點中斷,可用于程序的調(diào)試。西安電子科技大學(xué)計算機學(xué)院556協(xié)處理器指令數(shù)據(jù)操作指令數(shù)據(jù)存取指令(內(nèi)存-協(xié)處理器寄存器)數(shù)據(jù)傳送指令(ARM寄存器-協(xié)處理器寄存器)西安電子科技大學(xué)計算機學(xué)院566.1數(shù)據(jù)操作指

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論