ARM和嵌入式系統(tǒng)設(shè)計(jì)3_第1頁(yè)
ARM和嵌入式系統(tǒng)設(shè)計(jì)3_第2頁(yè)
ARM和嵌入式系統(tǒng)設(shè)計(jì)3_第3頁(yè)
ARM和嵌入式系統(tǒng)設(shè)計(jì)3_第4頁(yè)
ARM和嵌入式系統(tǒng)設(shè)計(jì)3_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

ARM匯編指令本章目標(biāo)掌握ARM處理器的尋址方式ARM指令格式;ARM指令種類,重點(diǎn)掌握壓棧、出棧操作掌握ARM程序的跳轉(zhuǎn)ARM程序的文件類型:C程序:ARM開發(fā)中大部分程序使用C語言編寫,文件類型為“*.C”;匯編程序:涉及到硬件底層操作的代碼有時(shí)必須使用匯編語言編寫,文件類型為“*.S”。ARM程序的文件類型為什么要掌握部分常用ARM指令?熟悉ARM體系結(jié)構(gòu):通過指令的學(xué)習(xí)可以更深入的了解ARM硬件結(jié)構(gòu)的特點(diǎn);修改啟動(dòng)代碼:?jiǎn)?dòng)代碼為了滿足大部分系統(tǒng)的順利運(yùn)行,通常將系統(tǒng)硬件配置在最低性能,通過調(diào)整啟動(dòng)代碼中的參數(shù)使其更適合自己的硬件系統(tǒng);調(diào)試程序:通過觀察反匯編代碼了解程序執(zhí)行情況,比如某個(gè)變量的操作是否被編譯器優(yōu)化掉了。閱讀已有的匯編代碼;為什么要掌握部分常用ARM指令A(yù)RM指令系統(tǒng)簡(jiǎn)介ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡(jiǎn)單。ARM920T具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢(shì),它是ARM指令集的子集。所有的ARM指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。ARM程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開銷幾乎為零。ARM尋址方式尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有9種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.相對(duì)尋址。

操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R00xAA0x55R2R1ARM尋址方式寄存器尋址MOVR1,R20xAA立即尋址立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOV R0,#0xFF000;將立即數(shù)0xFF000裝入R0寄存器0x55R0MOVR0,#0xFF00程序存儲(chǔ)MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器移位尋址指令舉例如下:MOVR0,R2,LSL#3 ;R2的值左移3位,結(jié)果放入R0,;即是R0=R2×8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“與”操作,結(jié)果放入R10x55R0R20x01ARM尋址方式寄存器移位尋址0x080x08邏輯左移3位移位操作:LSL、LSR:邏輯左\右移;ASR:算術(shù)右移,保持符號(hào)位不變ROR:循環(huán)右移; RRX:帶擴(kuò)展位的循環(huán)右移寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDRR1,[R2];將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出;保存在R1中SWPR1,R1,[R2];將寄存器R1的值和R2指定的存儲(chǔ);單元的內(nèi)容交換0x55R0R20x400000000xAA0x40000000LDRR0,[R2]0xAA基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等。LDRR2,[R3,#0x0C];讀取R3+0x0C地址上的存儲(chǔ)單元的內(nèi)容放入R2STRR1,[R0,#-4]!;先R0=R0-4,然后把R1的值寄存;到保存到R0指定的存儲(chǔ)單元ARM尋址方式基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)多寄存器尋址多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到R2~R7、R12中STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保存到R0指向的存儲(chǔ)單元中0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲(chǔ)器LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000010堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出”。堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元。即是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N:向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧;堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置,稱為空堆棧。所以可以組合出四種類型的堆棧方式:滿遞增、空遞增、滿遞減、空遞減ARM尋址方式堆棧尋址相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下: BL SUBR1 ;調(diào)用到SUBR1子程序 BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處 ...LOOP MOV R6,#1 ...SUBR1 ...ARM尋址方式尋址方式分類——相對(duì)尋址;文件名:TEST1.S

;功能:實(shí)現(xiàn)兩個(gè)寄存器相加;說明:使用ARMulate軟件仿真調(diào)試 AREA Example1,CODE,READONLY ;聲明代碼段Example1

ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù) MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB

B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回 END ;文件結(jié)束

使用“;”進(jìn)行注釋標(biāo)號(hào)頂格寫實(shí)際代碼段聲明文件結(jié)束簡(jiǎn)單的ARM程序ARM指令的基本格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中<>號(hào)內(nèi)的項(xiàng)是必須的,{}號(hào)內(nèi)的項(xiàng)是可選的。各項(xiàng)的說明如下:opcode:指令助記符;cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個(gè)操作數(shù)的寄存器;operand2:第2個(gè)操作數(shù);ARM指令格式ARM指令格式ARM指令集——第2個(gè)操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

靈活的使用第2個(gè)操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:Rm——寄存器方式;

如:SUBR1,R1,R2Rm,shift——寄存器移位方式;

如:ADDR1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1

#immed_8r——常數(shù)表達(dá)式;

必須是一個(gè)8位的常數(shù)通過循環(huán)移位偶數(shù)位可以得到的數(shù)。如:ANDR1,R2,#0xC0000x0103C000;0x12800000;0x4000003B;0x0016C000×√√√但是0xffffffff是特例ARM指令格式

要用一個(gè)12位的編碼來表示任意的32位數(shù)是絕對(duì)不可能的(12位數(shù)有2^12種可能,而32位數(shù)有2^32種)。但是又要用12位的編碼表示32位數(shù),怎么辦?只有在表示數(shù)的數(shù)量上做限制。通過編碼來實(shí)現(xiàn)用12位的編碼來表示32位數(shù)。在12位的shifter_operand中:8位存數(shù)據(jù),4位存移位的次數(shù)。8位存數(shù)據(jù):解釋了“該常數(shù)必須對(duì)應(yīng)8位位圖”。4位存移位的次數(shù):解釋了為什么只能移偶數(shù)位。4位只有16種可能值,而32位數(shù)可以循環(huán)移位32次(32種可能),那就只好限制:只能移偶數(shù)位(兩位兩位地移,好像一個(gè)16位數(shù)在移位,16種移位可能)。這樣就解決了能表示的情況是實(shí)際情況一半的矛盾。對(duì)于0xFFFFFFFF,其實(shí)不是直接表示的,而是編譯器自動(dòng)用0x00000000取反得到的。具體可以分析機(jī)器碼。其指令編碼格式如下:31-2827-2524-212019-1615-1211-0cond001opcodeSRnRdshifter_operand操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號(hào)數(shù)大于或等于0011CC/LOC=0無符號(hào)數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號(hào)數(shù)大于1001LSC=0,Z=1無符號(hào)數(shù)小于或等于1010GEN=V有符號(hào)數(shù)大于或等于

1011LTN!=V有符號(hào)數(shù)小于

1100GTZ=0,N=V有符號(hào)數(shù)大于

1101LEZ=1,N!=V有符號(hào)數(shù)小于或等于

1110AL任何無條件執(zhí)行(指令默認(rèn)條件)1111NV任何從不執(zhí)行(不要使用)C代碼:if(a>b)a++;else b++;對(duì)應(yīng)的匯編代碼:CMP R0,R1 ;R0與R1比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤R1,則R1=R1+1ARM指令格式使用條件碼"cond"可以實(shí)現(xiàn)高效的邏輯操作,提高代碼效率1.存儲(chǔ)器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令A(yù)RM指令種類存儲(chǔ)器訪問指令A(yù)RM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。對(duì)外圍IO、程序數(shù)據(jù)的訪問均要通過加載/存儲(chǔ)指令進(jìn)行。存儲(chǔ)器訪問指令分為單寄存器操作指令和多寄存器操作指令。所有單寄存器加載/存儲(chǔ)指令可分為“字和無符號(hào)字節(jié)加載存儲(chǔ)指令”和“半字和有符號(hào)字節(jié)加載存儲(chǔ)指令。一條指令處理多寄存器的的加載/存儲(chǔ)。裝載指令:LDR目標(biāo)寄存器,源地址保存指令:STR源寄存器,目標(biāo)地址立即數(shù):立即數(shù)可以是一個(gè)無符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,#0x12]

寄存器:寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2]

寄存器及移位常數(shù):寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2,LSL

#2]單寄存器存取——地址形式存儲(chǔ)器訪問指令單寄存器存取——尋址方式裝載指令:LDR目標(biāo)寄存器,源地址保存指令:STR源寄存器,目標(biāo)地址零偏移:如:LDRRd,[Rn]前索引偏移: 如:LDRRd,[Rn,#0x04]!程序相對(duì)偏移: 如:LDRRd,=labe1

后索引偏移:

如:LDRRd,[Rn],#0x04注意:1、大多數(shù)情況下,必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。2、LDR/STR指令搭配不同的后綴實(shí)現(xiàn)不同方式的單寄存器存取操作存儲(chǔ)器訪問指令多寄存器存取多寄存器加載/存儲(chǔ)指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個(gè)寄存器;STM為存儲(chǔ)多個(gè)寄存器。允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。存儲(chǔ)器訪問指令裝載指令:LDM

源地址,目標(biāo)寄存器列表存儲(chǔ)指令:STM

目標(biāo)地址,源寄存器列表存儲(chǔ)器源地址目標(biāo)寄存器1目標(biāo)寄存器n存儲(chǔ)器目標(biāo)地址源寄存器1源寄存器n多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址寄存器。R5R6R7R1

R1’

指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1

R1’

指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1

R1’

指令STMIB

R1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’

R1

指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CH存儲(chǔ)器訪問指令LDM/STM指令搭配不同的后綴實(shí)現(xiàn)不同方式地址增長(zhǎng)方式:IA:每次傳送后地址加4IB:每次傳送前地址加4DA:每次傳送后地址減4DB:每次傳送前地址減40x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲(chǔ)器0x010x020x030x040x40000000應(yīng)用示例:LDMIAR1!,{R2-R4,R6}

將R1指向的內(nèi)存數(shù)據(jù)讀取到R0-R4和R6寄存器中多寄存器存取存儲(chǔ)器訪問指令存儲(chǔ)器訪問指令多寄存器存取多寄存器存取指令與堆棧操作指令的關(guān)系如下表所示。數(shù)據(jù)塊傳送存儲(chǔ)堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞增STMIASTMEA空遞增LDMIALDMFD滿遞減STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增0x01……0x07ARM內(nèi)核內(nèi)部寄存器存儲(chǔ)器0x000x4020……R0R1R7SP0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x01230x??0x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針指向棧頂;3.執(zhí)行壓棧操作指令保存R0-R7和LR0x010x020x030x040x050x070x000x060x01230x3FFC棧頂存儲(chǔ)器訪問指令應(yīng)用示例:STMFDSP!,{R0-R7,LR}滿遞減壓棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂;棧頂0x??0x??存儲(chǔ)器0x??0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x??0x3FF80x010x020x030x040x050x070x000x060x0123……ARM7內(nèi)核0x4020……R0R1R7SP0x????LR0x3FFCPC0x????3.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC0x40200x010x070x000x010x020x030x040x050x070x000x060x01230x0123存儲(chǔ)器訪問指令應(yīng)用示例: LDMFDSP!,{R0-R7,PC}滿遞減出棧操作SWP指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個(gè)寄存器Rd中,同時(shí)將另一個(gè)寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。使用SWP可實(shí)現(xiàn)信號(hào)量操作。寄存器和存儲(chǔ)器交換指令存儲(chǔ)器訪問指令裝載指令:SWP讀入寄存器,輸出寄存器,目標(biāo)地址存儲(chǔ)器目標(biāo)地址讀入寄存器輸出寄存器數(shù)據(jù)處理指令A(yù)RM數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類:

數(shù)據(jù)傳送指令;算術(shù)邏輯運(yùn)算指令;比較指令。數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。

數(shù)據(jù)處理指令數(shù)據(jù)傳送指令

MOV指令將8位圖立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。裝載指令: MOV目標(biāo)寄存器,操作數(shù)目標(biāo)寄存器操作數(shù)

同類型的指令還有MVN,它可以實(shí)現(xiàn)數(shù)據(jù)的非傳遞,即把操作數(shù)取反后送至目標(biāo)寄存器。應(yīng)用示例:MOV R3,R1,LSL#3;R3=R1×8思考與練習(xí)?1.MOV指令與LDR指令都是往目標(biāo)寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎?

MOV指令用于將數(shù)據(jù)從一個(gè)寄存器傳送到另一個(gè)寄存器中,或者將一個(gè)常數(shù)傳送到一個(gè)寄存器中,但是不能訪問內(nèi)存。LDR指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中。思考與練習(xí)算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令部分算術(shù)運(yùn)算符:ADD:加法運(yùn)算ADC:帶進(jìn)位加法運(yùn)算SUB:減法運(yùn)算RSB:逆向減法運(yùn)算SBC:帶進(jìn)位減法運(yùn)算RSC:帶進(jìn)位逆向減法運(yùn)算部分邏輯運(yùn)算符:AND:邏輯“與”運(yùn)算ORR:邏輯“或”運(yùn)算EOR:邏輯“異或”運(yùn)算BIC:位清除運(yùn)算應(yīng)用示例:AND R3,R1,#0xFF;R3=R1&0x000000FFORR R3,R1,R2;R3=R1|R2思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標(biāo)志位?R1R2BYTE2BYTE3BYTE1BYTE0BYTE2BYTE3BYTE1BYTE0BYTE0BYTE0 ANDR1,R1,#0x000000FF ANDR2,R2,#0xFFFFFF00 ORRR2,R2,R1思考與練習(xí)比較指令CMP:數(shù)值比較。將寄存器的值減去操作數(shù)的值CMN:負(fù)數(shù)比較。將寄存器的值加上操作數(shù)的值。結(jié)果為0,z=1;否則z=0;TST:位測(cè)試。寄存器的值與操作數(shù)的值按位"與"操作。結(jié)果為0,z=1;否則z=0;TEQ:相等測(cè)試。 寄存器的值與操作數(shù)的值按位"異或"操作。

結(jié)果為0,z=1;否則z=0;比較指令將兩個(gè)數(shù)值進(jìn)行的特定運(yùn)算,根據(jù)運(yùn)算結(jié)果影響CPSR的相關(guān)標(biāo)志位,用于后面程序的條件執(zhí)行,但是運(yùn)算結(jié)果不予保存。乘法指令乘法指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令RdRm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號(hào)乘法指令(RdLo,RdHi)Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號(hào)乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號(hào)乘法指令(RdLo,RdHi)Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號(hào)乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}分支指令程序如何跳轉(zhuǎn)?在ARM中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn):1.直接向PC寄存器賦值實(shí)現(xiàn)跳轉(zhuǎn);例:MOVPC,R142.使用分支指令直接跳轉(zhuǎn)。分支指令種類B:分支指令BL:帶鏈接的分支指令BX:帶狀態(tài)切換的分支指令BLLabel程序代碼BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPCBL指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)之前將下一條指令的地址拷貝到R14(即LR)鏈接寄存器中,它適用于子程序調(diào)用。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:Addr2+4LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時(shí),硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計(jì)數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行例如:BLDelayNS ;調(diào)用子程序DelayNS“BL”分支指令帶狀態(tài)切換的分支指令——BX指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時(shí)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:“BX”BXRn例如:ADRL R0,T_Fun+1

;將Thumb程序的入口地址加1存入R0BX R0

;跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來切換處理器狀態(tài)分支指令A(yù)RM內(nèi)核支持協(xié)處理器操作,協(xié)處理器的控制要通過協(xié)處理器命令實(shí)現(xiàn)。ARM內(nèi)核協(xié)處理器A協(xié)處理器B握手信號(hào)數(shù)據(jù)地址總線…在ARM指令集中雜項(xiàng)指令共有3條,它們非常重要,特別是與操作系統(tǒng)的使用息息相關(guān):1.軟件中斷產(chǎn)生指令:SWI2.程序狀態(tài)寄存器讀指令:MRS3.程序狀態(tài)寄存器寫指令:MSR雜項(xiàng)指令雜項(xiàng)指令軟中斷指令軟中斷指令“SWI”SWI指令用于產(chǎn)生軟中斷,主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。執(zhí)行該指令后,處理器將完成以下動(dòng)作:1.切換到管理模式2.將CPSR備份到管理模式下的SPSR寄存器3.程序跳轉(zhuǎn)到軟件中斷入口使用操作系統(tǒng)后,為了防止出錯(cuò)的任務(wù)影響其它任務(wù)的執(zhí)行,通常將任務(wù)放在用戶模式執(zhí)行,以限制其權(quán)限;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論