第二章嵌入式處理器(下)_第1頁
第二章嵌入式處理器(下)_第2頁
第二章嵌入式處理器(下)_第3頁
第二章嵌入式處理器(下)_第4頁
第二章嵌入式處理器(下)_第5頁
已閱讀5頁,還剩162頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)原理與開發(fā)第二章嵌入式處理器(下)

第二章嵌入式處理器2.1引言

2.2 嵌入式處理器概述2.3 ARM處理器基礎(chǔ)2.5 ARM程序設(shè)計基礎(chǔ)2.4 ARM指令系統(tǒng)2.4 ARM指令系統(tǒng)2.4.1ARM編程模型2.4.2ARM尋址方式2.4.3ARM指令集2.4.4Thumb指令集2.4.1ARM編程模型2.4ARM指令系統(tǒng)

流水線數(shù)據(jù)類型處理器模式處理器工作狀態(tài)寄存器組織異常存儲器和存儲器映射I/O1.流水線

2.4.1ARM編程模型

流水線技術(shù)是現(xiàn)代微處理器普遍采用的一種技術(shù),它可以使得幾條指令并行執(zhí)行,因此可以大大提高處理器的運行效率。

1.流水線

2.4.1ARM編程模型從程序存儲器中讀取指令,放入流水線中操作碼和操作數(shù)被譯碼,決定執(zhí)行什么功能,為下一個時鐘周期準備數(shù)據(jù)路徑所需要的控制信號執(zhí)行已譯碼的指令取指譯碼執(zhí)行ARM7的3級流水線:1.流水線流水線能夠正常工作的條件是在任意時刻,每一級所使用的硬件必須能夠獨立操作,不能多級同時占用同一硬件資源。在正常情況下,每條指令都被劃分成這樣3個時鐘周期來完成,即指令執(zhí)行時間(Latency)是3周期。流水線的執(zhí)行使得程序計數(shù)器PC必須在當前指令取指前計數(shù)。對于ARM處理器的3級流水線,以當前PC取指后,PC值會增加為PC+4。2.4.1ARM編程模型1.流水線圖2-5ARM單周期指令的多級流水線操作2.4.1ARM編程模型1.流水線圖2-6ARM多周期指令的多級流水線操作2.4.1ARM編程模型1.流水線圖2-7ARM分支指令的流水線操作2.4.1ARM編程模型2.數(shù)據(jù)類型

ARM處理器支持以下數(shù)據(jù)類型:2.4.1ARM編程模型

Byte

字節(jié),8位;

Halfword

半字,16位(半字必須與 2字節(jié)邊界對準);

Word

字,32位(字必須與4字 節(jié)邊界對準)。2.數(shù)據(jù)類型

2.4.1ARM編程模型圖2-8ARM數(shù)據(jù)類型存儲圖3.處理器模式

ARM體系結(jié)構(gòu)支持7種處理器模式

:2.4.1ARM編程模型處理器模式說明用戶usr程序正常執(zhí)行模式FIQfiq支持高速數(shù)據(jù)傳輸或通道處理IRQirq通用中斷處理管理svc操作系統(tǒng)保護模式中止abt虛擬存儲器或存儲器保護未定義und支持硬件協(xié)處理器的軟件仿真系統(tǒng)sys運行特權(quán)操作系統(tǒng)任務(wù)4.處理器工作狀態(tài)

ARM處理器具有特殊的兩種工作狀態(tài):2.4.1ARM編程模型

ARM狀態(tài):32位,執(zhí)行字對準的ARM指令;

Thumb狀態(tài):16位,執(zhí)行半字對準的Thumb指令。

ARM處理器的操作狀態(tài)可以通過BX指令(分支和交換指令)在ARM狀態(tài)和Thumb狀態(tài)之間切換。例:從ARM狀態(tài)切換到Thumb狀態(tài):

LDRR0,=Label+1BXR0從Thumb狀態(tài)切換到ARM狀態(tài):

LDRR0,=LabelBXR05.寄存器組織

ARM處理器共有37個寄存器:2.4.1ARM編程模型

31個通用寄存器:32位,含程序計數(shù)器PC;

6個狀態(tài)寄存器:32位,只使用了其中的12位。當編寫用戶程序時,37個寄存器中僅有15個通用寄存器r0~r14、程序計數(shù)器PC(r15)和當前程序狀態(tài)寄存器CPSR需要考慮。其余寄存器僅用于系統(tǒng)級編程和異常處理(如中斷)。ARM狀態(tài)下寄存器組織5.寄存器組織--不分組寄存器r0~r7

不分組意味著在所有處理器模式下,r0~r7都可被同樣訪問,沒有體系結(jié)構(gòu)所隱含的特殊用途。

2.4.1ARM編程模型5.寄存器組織--分組寄存器r8~r14

分組意味著r8~r14的訪問與當前處理器的模式相關(guān)。如果要訪問r8~r14,而不依賴于當前處理器的模式,就必須使用規(guī)定的寄存器名稱。名稱的形式為:2.4.1ARM編程模型r8_<mode>~r14_<mode>5.寄存器組織--分組寄存器r8~r14

r8~r12各有兩組物理寄存器:一組為FIQ模式,另一組為FIQ以外的模式。寄存器r8~r12沒有指定特殊用途,而使用r8_fiq~r12_fiq則允許快速中斷。2.4.1ARM編程模型5.寄存器組織--分組寄存器r8~r14

寄存器r13和r14的用途比較特殊:

2.4.1ARM編程模型

r13通常用作堆棧指針SP,被初始化成指向異常模式分配的堆棧。

r14通常用作子程序鏈接寄存器LR。處理異常時,在程序入口處將異常處理程序用到的其它寄存器的值壓入堆棧,返回時重新將這些值加載到寄存器中。當執(zhí)行分支指令BL時,r15的內(nèi)容拷貝到r14中,從而成為子程序調(diào)用后的返回地址5.寄存器組織--程序計數(shù)器r15

寄存器r15通常被用作程序計數(shù)器PC。在ARM狀態(tài)下,PC的值保存在位[31:2],而位[1:0]為0;在Thumb狀態(tài)下,PC的值保存在位[31:1],而位[0]為0。2.4.1ARM編程模型5.寄存器組織--當前程序狀態(tài)寄存器CPSR

CPSR和SPSR具有相同的格式2.4.1ARM編程模型標志位含義N當用兩個補碼表示的帶符號數(shù)進行運算時,N=1表示運算的結(jié)果為負數(shù);N=0表示運算的結(jié)果為正數(shù)或零;ZZ=1表示運算的結(jié)果為零;Z=0表示運算的結(jié)果為非零;C可以有4種方法設(shè)置C的值:─加法運算(包括比較指令CMN):當運算結(jié)果產(chǎn)生了進位時(無符號數(shù)溢出),C=1,否則C=0。─減法運算(包括比較指令CMP):當運算時產(chǎn)生了借位(無符號數(shù)溢出),C=0,否則C=1。─對于包含移位操作的非加/減運算指令,C為移出值的最后一位。─對于其他的非加/減運算指令,C的值通常不改變。V可以有2種方法設(shè)置V的值:─對于加/減法運算指令,當操作數(shù)和運算結(jié)果為二進制的補碼表示的帶符號數(shù)時,V=1表示符號位溢出。─對于其他的非加/減運算指令,V的值通常不改變。Q在ARMv5及以上版本的E系列處理器中,用Q標志位指示增強的DSP運算指令是否發(fā)生了溢出。在其他版本的處理器中,Q標志位無定義。5.寄存器組織--Thumb狀態(tài)的寄存器集

2.4.1ARM編程模型Thumb狀態(tài)下寄存器組織5.寄存器組織--Thumb狀態(tài)的寄存器集

2.4.1ARM編程模型Thumb狀態(tài)寄存器到ARM寄存器的映射6.異常

異常(exception)是指由內(nèi)部或外部源產(chǎn)生從而使處理器需要處理的一個事件。2.4.1ARM編程模型例如,外部中斷或試圖實行未定義的指令都會引起異常的發(fā)生。處理異常之前,處理器必須保存當前的狀態(tài),以便在異常處理完成后,能夠使原來的出現(xiàn)重新執(zhí)行。6.異常

ARM支持7種類型的異常。對于每種異常,處理器將強制從異常對應(yīng)的某個固定地址開始執(zhí)行程序。這些固定地址稱為異常向量。2.4.1ARM編程模型多個異??赡軙瑫r發(fā)生,因此在ARM中就通過給各個異常賦予不同的優(yōu)先級來確定處理異常的順序。6.異常

優(yōu)先級按照從高到低的順序排列如下:2.4.1ARM編程模型復(fù)位數(shù)據(jù)異常中止FIQIRQ預(yù)取指異常中止SWI、未定義指令(這兩種異常的指令編碼互斥,不可能同時發(fā)生)異常類型具體含義復(fù)位當處理器的復(fù)位電平有效時產(chǎn)生復(fù)位異常,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行。未定義指令當ARM處理器或協(xié)處理器遇到不能處理的指令時,產(chǎn)生未定義指令異常。可使用該異常機制進行軟件仿真。軟件中斷該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令??墒褂迷摦惓C制實現(xiàn)系統(tǒng)功能調(diào)用。指令預(yù)取中止若處理器預(yù)取指令的地址不存在,或該地址不允許當前指令訪問,存儲器會向處理器發(fā)出中止信號,但當預(yù)取的指令被執(zhí)行時,才會產(chǎn)生指令預(yù)取中止異常。數(shù)據(jù)中止若處理器數(shù)據(jù)訪問指令的地址不存在,或該地址不允許當前指令訪問時,產(chǎn)生數(shù)據(jù)中止異常。IRQ(外部中斷請求)當處理器的外部中斷請求引腳有效,且CPSR中的I位為0時,產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過該異常請求中斷服務(wù)。FIQ(快速中斷請求)當處理器的快速中斷請求引腳有效且CPSR中的F位為0時,產(chǎn)生FIQ異常。6.異常

進入異常的操作:2.4.1ARM編程模型在相應(yīng)的鏈接寄存器LR(r14)中保存下一條指令的地址將CPSR復(fù)制到相應(yīng)的SPSR中強制使CPSR模式位置成對應(yīng)異常類型的值強制使程序計數(shù)器指向相應(yīng)異常向量,取下一條指令例子:用戶模式到

FIQ模式*spsr_fiqcpsrr7r4r5r2r1r0r3r6r15(pc)r14_fiqr13_fiqr12_fiqr10_fiqr11_fiqr9_fiqr8_fiqr14(lr)r13(sp)r12r10r11r9r8用戶模式CPSR復(fù)制到

FIQ模式

SPSRcpsrr15(pc)r14(lr)r13(sp)r12r10r11r9r8r7r4r5r2r1r0r3r6r14_fiqr13_fiqr12_fiqr10_fiqr11_fiqr9_fiqr8_fiq返回一個從用戶模式計算的地址,PC值存儲在FIQ模式RegistersinuseRegistersinuse異常用戶模式FIQ模式spsr_fiq7.存儲器和存儲器映射I/O

與單片機等簡單系統(tǒng)相比,現(xiàn)在一些復(fù)雜的嵌入式系統(tǒng)中,存儲系統(tǒng)的功能更加強大,可能包含有多種現(xiàn)代計算機存儲技術(shù),如Cache和WriteBuffer、MMU、存儲保護機制、快速上下文切換等。基于ARM內(nèi)核的嵌入式系統(tǒng)可能包含F(xiàn)lash、ROM、SRAM、SDRAM等多種類型的存儲器,不同類型的存儲器存取速度和數(shù)據(jù)寬度等都不盡相同。2.4.1ARM編程模型7.存儲器和存儲器映射I/O

存儲系統(tǒng)的設(shè)計可以是多種多樣的,但是應(yīng)當遵循一定的規(guī)則,否則可能會引起一些不必要的麻煩。2.4.1ARM編程模型例如:可能使存儲系統(tǒng)的實現(xiàn)比較困難;可能導(dǎo)致向其它ARM處理器的移植出現(xiàn)麻煩;可能引起一些標準軟件(如編譯器)的不適應(yīng)?;谙到y(tǒng)設(shè)計和編程的考慮,關(guān)于ARM存儲系統(tǒng)一般只需涉及地址空間、存儲器格式、存儲器訪問對準以及存儲器映射I/O等方面的問題。7.存儲器和存儲器映射I/O--地址空間

ARM體系結(jié)構(gòu)使用232個8位字節(jié)的單一、線性地址空間,字節(jié)地址的范圍為0~232-1;也可以將地址空間看作由230個32位的字組成,字地址可被4整除,且按字對準,例如以A為字對準地址的字地址由A、A+1、A+2、A+3共4個字節(jié)組成;在ARM體系結(jié)構(gòu)v4以上版本中,也可以將地址空間看作由231個16位的半字組成,半字地址可被2整除,且按半字對準,例如以A為字對準地址的半字地址由A、A+1共2個字節(jié)組成。2.4.1ARM編程模型7.存儲器和存儲器映射I/O--存儲器格式

存儲器格式是指字、半字、字節(jié)在存儲器中存放的方式,也反映了存儲器中字、半字、字節(jié)之間的映射關(guān)系。存儲器格式包括小端和大端兩種格式。2.4.1ARM編程模型7.存儲器和存儲器映射I/O--存儲器格式

2.4.1ARM編程模型大、小端存儲格式對程序的影響7.存儲器和存儲器映射I/O--存儲器訪問對準對于非對準的取指,在ARM工作狀態(tài)下,未對準的地址寫入R15后,結(jié)果將不可預(yù)知或忽略地址位[1:0];在Thumb狀態(tài)下,未對準的地址寫入R15后,則通常忽略地址位[0]。對于非對準的數(shù)據(jù)訪問,則體系結(jié)構(gòu)可能定義成以下行為之一:2.4.1ARM編程模型不可預(yù)知;忽略使訪問非對準的低地址位;忽略使訪問非對準的低地址位,但使用這些位控制加載數(shù)據(jù)的循環(huán)移位(適用于LDR和SWP指令)。7.存儲器和存儲器映射I/O--存儲器映射I/O

ARM系統(tǒng)實現(xiàn)I/O功能的標準方法是使用存儲器映射I/O。這種方法使用特定的存儲器地址,對這些地址加載和存儲,即可完成I/O操作。通常,對存儲器映射I/O地址加載對應(yīng)輸入,對對存儲器映射I/O地址存儲對應(yīng)輸出。另外,加載和存儲也可執(zhí)行控制功能,替代或附加到正常的I/O操作上。2.4.1ARM編程模型2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型2.4.2ARM尋址方式2.4.3ARM指令集2.4.4Thumb指令集

尋址方式是指根據(jù)指令給出的地址碼尋找真實操作數(shù)地址的方式。 尋址方式的多樣化一方面出于編程的需要,另一方面可以增強程序設(shè)計的靈活性。2.4.2ARM尋址方式2.4ARM指令系統(tǒng)

2.4.2ARM尋址方式2.4ARM指令系統(tǒng)

寄存器尋址立即尋址寄存器移位尋址寄存器間接尋址基址尋址多寄存器尋址堆棧尋址塊拷貝尋址相對尋址1.寄存器尋址

指令地址碼給出寄存器的編號,寄存器中的內(nèi)容為操作數(shù)。2.4.2ARM尋址方式例如:ADD R0,R1,R2 ;R0←R1+R2寫操作數(shù)的順序為:第一個寄存器R0為結(jié)果寄存器,第二個寄存器R1為第一操作數(shù)寄存器,第三個寄存器R2為第二操作數(shù)寄存器。注意2.立即尋址指令操作碼后的地址碼是立即數(shù),即操作數(shù)本身。2.4.2ARM尋址方式例如:ADD R3,R3,#1 ;R3←R3+1AND R8,R7,#&FF ;R8←R7[7:0]立即數(shù)的表示以“#”為前綴,十六進制的立即數(shù)在“#”后面加“&”符號。

注意3.寄存器移位尋址

寄存器移位尋址是ARM指令集特有的尋址方式。第2個操作數(shù)與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。2.4.2ARM尋址方式例如:ADDR3,R2,R1,LSL#3 ;R3←R2+8×R13.寄存器移位尋址

可采取的移位操作包括:2.4.2ARM尋址方式

LSL:邏輯左移(LogicalShiftLeft)。寄存器中字的低端空出的位補0。

LSR:邏輯右移(LogicalShiftRight)。寄存器中字的高端空出的位補0。

ASR:算術(shù)右移(ArithmeticShiftRight)。算術(shù)移位的對象是帶符號數(shù)。在移位過程中必須保持操作數(shù)的符號不變。若源操作數(shù)為正數(shù),則字的高端空出的位補0;若源操作數(shù)為負數(shù),則字的高端空出的位補1。

ROR:循環(huán)右移(ROtateRight)。從字的最低端移出的位填入字的高端空出的位。

RRX:擴展為1的循環(huán)右移(RotateRighteXtendedby1place)。操作數(shù)右移1位,空位(位[31])用原C標志填充。3.寄存器移位尋址

2.4.2ARM尋址方式移位操作過程4.寄存器間接尋址

指令地址碼給出寄存器的編號,寄存器為地址指針,存放操作數(shù)的有效地址。2.4.2ARM尋址方式例如: LDR R0,[R1] ;R0←[R1] STR R0,[R1] ;R0→[R1]5.基址尋址

基址尋址是將基址寄存器的內(nèi)容與指令中給出的位移量相加,形成操作數(shù)有效地址?;穼ぶ酚糜谠L問基址附近的存儲單元。包括基址加偏移量尋址和基址加索引尋址,可以將寄存器間接尋址看作是位移量為0的基址加偏移量尋址。2.4.2ARM尋址方式5.基址尋址--基址加偏移量尋址

基址加偏移量尋址中的偏移量最大為4KB,可分為前索引尋址和后索引尋址。2.4.2ARM尋址方式前索引尋址舉例: LDR R0,[R1,#4] ;R0←[R1+4]5.基址尋址--基址加偏移量尋址2.4.2ARM尋址方式例: LDR R0,[R1,#4]! ;R0←[R1] ;R1←R1+4后索引尋址舉例: LDR R0,[R1],#4 ;R0←[R1] ;R1←R1+4這種改變基址寄存器指向下一個傳送的地址對數(shù)據(jù)塊傳送很有用,還可以采用帶自動索引的前索引尋址實現(xiàn)。注意5.基址尋址--基址加索引尋址基址加索引尋址是指令指定一個基址寄存器,再指定另一個寄存器(稱為索引),其值作為位移加到基址上形成存儲器地址。

2.4.2ARM尋址方式例: LDR R0,[R1,R2] ;R0←[R1+R2]6.多寄存器尋址

多寄存器尋址是指一次可以傳動多個寄存器的值,允許一條指令可以傳送16個寄存器的任何子集,包括16個寄存器。2.4.2ARM尋址方式例:LDMIA R1,{R0,R2,R5} ;R0←[R1] ;R2←[R1+4] ;R5←[R1+8]由于傳送的數(shù)據(jù)總是32位的字,因此基址寄存器R1應(yīng)當字對準。注意7.堆棧尋址

堆棧是一種按照特定順序進行存取的存儲區(qū)。這種特定的順序是指“后進先出”(LIFO)或“先進后出”(FILO)。使用堆棧時需要使用一個專門的寄存器作為堆棧指針,棧指針所指定的存儲單元就是堆棧的棧頂。如果堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項,就稱為滿堆棧(fullstack);如果堆棧指針指向下一個數(shù)據(jù)項放入的空位置,就稱為空堆棧(emptystack)。2.4.2ARM尋址方式7.堆棧尋址

另外,根據(jù)堆棧存儲區(qū)地址增長的方向,可將堆棧分為遞增堆棧(ascendingstack)和遞減堆棧(descendingstack)。以上表示遞增、遞減、滿、空的堆棧的各種組合就產(chǎn)生了4種堆棧類型。

ARM支持所有這4種類型的堆棧,即滿遞增、空遞增、滿遞減、空遞減。

ARM指令使用push向堆棧寫數(shù)據(jù),稱為進棧;使用pop從堆棧讀數(shù)據(jù),稱為出棧。2.4.2ARM尋址方式堆棧指針指向最后壓入的數(shù)據(jù)且由低地址向高地址生成堆棧指針指向最后壓入的數(shù)據(jù)且由高地址向低地址生成堆棧指針指向下一個將要放入數(shù)據(jù)的空位置且由低地址向高地址生成堆棧指針指向下一個將要放入數(shù)據(jù)的空位置且由高地址向低地址生成8.塊拷貝尋址

從堆棧的角度來看,多寄存器傳送指令是把一塊數(shù)據(jù)從存儲器的某一個位置拷貝到另一位置。從塊拷貝的角度來看,指令還要基于數(shù)據(jù)存儲在基址寄存器地址之上還是之下,地址在存儲第一個值之前或之后增加或減少。這兩種角度的映射均取決于執(zhí)行加載操作還是存儲操作。2.4.2ARM尋址方式8.塊拷貝尋址

2.4.2ARM尋址方式向上生長向下生長滿空滿空增加之前STMIBSTMFALDMIBLDMED之后STMIASTMEALDMIALDMFD減少之前LDMDBLDMEASTMDBSTMFD之后LDMDALDMFASTMDASTMED表2-4多寄存器加載和存儲指令映射8.塊拷貝尋址

2.4.2ARM尋址方式例如:LDMIA R0!,{R2-R9} ;將數(shù)據(jù)加載到R2~R9STMIA R1,{R2-R9} ;將數(shù)據(jù)存入存儲器執(zhí)行指令后,由于引用自動索引“!”,R0的值共增加32,而R1不變。注意8.塊拷貝尋址

2.4.2ARM尋址方式多寄存器指令的后綴含義如下:

I:Increment

D:DecrementorDescendingstack

A:AfterorAscendingstack

B:Before

F:Full

E:Empty 例如“FD”即表明是滿遞減堆棧尋址方式(fulldescendingstack)。9.相對尋址

可以將相對尋址看作是以程序計數(shù)器PC為基址的一種基址尋址方式。指令的地址碼作為位移量,與PC相加得到操作數(shù)的有效地址。位移量指出了操作數(shù)與當前指令之間的相對位置。2.4.2ARM尋址方式例: BL SUBR ;轉(zhuǎn)移到SUBR … ;返回到此SUBR … ;子程序入口地址 MOVPC,R14 ;返回2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型

2.4.2ARM尋址方式2.4.3ARM指令集2.4.4Thumb指令集2.4ARM指令系統(tǒng)

ARM指令集編碼條件執(zhí)行ARM指令格式ARM存儲器訪問指令A(yù)RM數(shù)據(jù)處理指令A(yù)RM分支指令A(yù)RM協(xié)處理器指令A(yù)RM雜項指令A(yù)RM偽指令2.4.3ARM指令集1.ARM指令集編碼

ARM指令集采用32位二進制編碼方式,大部分指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標志影響位以及每條指令所對應(yīng)的不同功能實現(xiàn)的二進制位。每條ARM指令都具有不同的編碼方式,與不同的指令功能相對應(yīng)。2.4.3ARM指令集1.ARM指令集編碼

2.4.3ARM指令集ARM指令集編碼2.條件執(zhí)行

條件執(zhí)行是指只有在當前程序狀態(tài)寄存器CPSR中的條件碼標志滿足指定的條件時,帶條件碼的指令才能執(zhí)行。條件轉(zhuǎn)移是絕大多數(shù)指令集的標準特征,但ARM指令集將條件執(zhí)行擴展到所有指令,包括監(jiān)控調(diào)用和協(xié)處理器指令。

2.4.3ARM指令集2.條件執(zhí)行2.4.3ARM指令集圖2-17ARM的條件代碼域操作碼[31:28]助記符后綴標志含義0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(無符號>=)0011CC/LOC清零小于(無符號<)0100MIN置位負0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零大于(無符號>)1001LSC清零或Z置位小于或等于(無符號<=)1010GEN和V相同帶符號>=1011LTN和V不同帶符號<1100GTZ清零且N和V相同帶符號>1101LEZ置位或N和V不同帶符號<=1110AL任何總是(缺?。?111NV無從不(不要使用)2.條件執(zhí)行2.4.3ARM指令集對于條件執(zhí)行,需要說明的有以下兩點:注意幾乎所有的ARM數(shù)據(jù)處理指令都可以根據(jù)執(zhí)行結(jié)果來選擇是否更新條件碼標志。當指令中包含后綴“S”時,指令將更新條件碼標志。可以根據(jù)另一條指令設(shè)置的標志,有條件地執(zhí)行某條指令。3.ARM指令格式

ARM指令集是Load/Store型,只能通過Load/Store指令實現(xiàn)對存儲器的訪問,其它類型的指令都基于寄存器完成。2.4.3ARM指令集操作碼;指令助記符,如ADD、LDR等可選的條件碼;執(zhí)行條件,如EQ、NE等可選后綴;若指定S,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中的條件碼目標寄存器存放第一操作數(shù)的寄存器第二操作數(shù)例: LDR R0,[R1] BEQ DATAEVEN ADDS R2,R1,#1 SUBNES R2,R1,#0x20

ARM指令使用的基本格式如下所示:<opcode>{<cond>}{S} <Rd>,<Rn>,{<operand2>}3.ARM指令格式

2.4.3ARM指令集4.ARM存儲器訪問指令--LDR、STR

LDR和STR為單一數(shù)據(jù)傳送指令,可傳送字和無符號字節(jié)、半字和帶符號字節(jié)、雙字。

2.4.3ARM指令集(1)字和無符號字節(jié)

op{cond}{B}{T}Rd,[Rn] ;零偏移

op{cond}{B}Rd,[Rn,Flexoffset]{!} ;前索引偏移

op{cond}{B}Rd,label ;程序相對偏移

op{cond}{B}{T}Rd,[Rn],Flexoffset ;后索引偏移4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集句法:(1)字和無符號字節(jié)

指令用于加載或存儲寄存器32位字或8位無符號字節(jié)。對于零偏移形式,Rn的值作為傳送數(shù)據(jù)的地址。對于前索引偏移形式,在傳送數(shù)據(jù)之前,將偏移量加到Rn中,結(jié)果作為傳送數(shù)據(jù)的存儲器地址。若使用“!”,則結(jié)果寫回到Rn,且Rn不允許是R15。對于程序相對偏移形式,匯編器由PC計算偏移量,并將PC作為Rn生成前索引指令。不能使用后綴“!”。對于后索引形式,Rn的值作為傳送數(shù)據(jù)的存儲器地址。數(shù)據(jù)傳送之后,將偏移量加到Rn中,結(jié)果寫回到Rn。Rn不允許是R15。4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集指令說明:(1)字和無符號字節(jié)

LDR R8,[R10] LDRNE R2,[R5,#960]! STR R2,[R9,#CON] STRB R0,[R3,-R8,ASR#2] 4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集例:(2)半字和帶符號字節(jié)

op{cond}typeRd,[Rn] ;零偏移

op{cond}typeRd,[Rn,offset]{!} ;前索引偏移

op{cond}typeRd,label ;程序相對偏移

op{cond}typeRd,[Rn],offset ;后索引偏移4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集句法:(2)半字和帶符號字節(jié)指令用于加載寄存器16位半字或帶符號8位字節(jié),存儲寄存器16位半字。

帶符號加載是指帶符號擴展到32位。

無符號半字加載是指零擴展到32位。半字傳送的地址必須是偶數(shù),即按照半字對準。不能將半字或字節(jié)加載到R15。。4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集指令說明:(2)字和無符號字節(jié)

LDREQSH R11,[R6] LDRH R1,[R0,#12] STRH R4,[R0,R1]! LDRSB R1,[R6],R3,LSL#4 4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集例:(3)雙字

op{cond}DRd,[Rn] ;零偏移

op{cond}DRd,[Rn,offset]{!} ;前索引偏移

op{cond}DRd,label ;程序相對偏移

op{cond}DRd,[Rn],offset ;后索引偏移4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集句法:(3)雙字

指令用于加載或存儲兩個相鄰寄存器64位雙字。對于雙字傳送,地址必須是8的倍數(shù)。4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集指令說明:(3)雙字

LDRD R6,[R11] LDRD R1,[R6] STRD R4,[R9,#24] STRD R14,[R9,#24] STRD R2,[R3],R6 4.ARM存儲器訪問指令--LDR、STR

2.4.3ARM指令集例:op{cond}modeRn{!},reglist{^}4.ARM存儲器訪問指令--LDM、STM

2.4.3ARM指令集句法:指令用于加載或存儲多個寄存器,可傳送R0~R15的任何組合。指令忽略地址的位[1:0]。到R15的加載將引起處理器轉(zhuǎn)移到加載地址處的指令如果Rn包含在寄存器列表中,且用“!”表明要寫回,則若op是STM,且Rn是寄存器列表中數(shù)字最小的寄存器,則Rn的初值被保存。否則,Rn的加載和存儲值不可預(yù)知。4.ARM存儲器訪問指令--LDM、STM

2.4.3ARM指令集指令說明:LDMIA R8, {R0,R2,R9}STMDB R1!, {R3-R6,R11,R12}STMFD R13!, {R0,R4-R7,LR} LDMFD R13!, {R0,R4-R7,PC}STMIA R5!, {R5,R4,R9} LDMDA R2, {}4.ARM存儲器訪問指令--LDM、STM

2.4.3ARM指令集例:PLD [Rn{Flexoffset}]4.ARM存儲器訪問指令--PLD

2.4.3ARM指令集句法:指令用于Cache預(yù)加載,提示存儲系統(tǒng)從后面的幾條指令所指定的存儲器地址加載,用這種方法可以加速以后的存儲器訪問。指令沒有地址的對準限制。指令說明:4.ARM存儲器訪問指令--PLD2.4.3ARM指令集PLD [R2]PLD [R0,#CON] ;CON范圍為±4KB例:4.ARM存儲器訪問指令--SWP

2.4.3ARM指令集SWP{cond}{B}Rd,Rm,[Rn]句法:指令用于在寄存器和存儲器之間進行數(shù)據(jù)交換,可以使用SWP來實現(xiàn)信號量。對于非字對準的處理與LDR、STR指令中的處理方法相同。指令說明:例:SWPB R1,R1,[R0] ;交換字節(jié)5.ARM數(shù)據(jù)處理指令

ARM數(shù)據(jù)處理指令可以完成的功能包括:2.4.3ARM指令集數(shù)據(jù)傳送算術(shù)運算邏輯運算比較測試乘法5.ARM數(shù)據(jù)處理指令

ARM數(shù)據(jù)處理指令的特點

2.4.3ARM指令集操作數(shù)為32位,來自寄存器或定義的立即數(shù)。對于操作數(shù)可進行符號擴展和零擴展。處理結(jié)果除了長乘法指令為64位之外,均為32位,存放在寄存器中。大多數(shù)ARM通用數(shù)據(jù)處理指令都有一個靈活的第二操作數(shù)(flexiblesecondoperand)。第二操作數(shù)operand2可以是立即數(shù)形式或寄存器形式。#32位立即數(shù)Rm,{#shift}5.ARM數(shù)據(jù)處理指令--移位操作2.4.3ARM指令集ASR: 算術(shù)右移。即將寄存器內(nèi)容除以2n。LSR: 邏輯右移。即將寄存器內(nèi)容除以2n。LSL: 邏輯左移。即將寄存器內(nèi)容乘以2n。ROR: 循環(huán)右移。RRX: 帶擴展的循環(huán)右移。將寄存器內(nèi)容循環(huán) 右移1位,進位標志拷貝到位[31]。5.ARM數(shù)據(jù)處理指令--移位操作2.4.3ARM指令集圖2-18移位操作過程ADD、SUB、RSB、ADC、SBC、RSCop{cond}{S}Rd,Rn,Operand25.ARM數(shù)據(jù)處理指令--算術(shù)運算指令

2.4.3ARM指令集句法:指令用于加、減、反減等算術(shù)運算,包括帶進位的算術(shù)運算。算術(shù)運算中如果使用R15作為Rn,則其值為指令的地址加8。如果使用R15作為Rd,則執(zhí)行轉(zhuǎn)移到結(jié)果相應(yīng)的地址;或者在使用“S”的情況下,拷貝SPSR到CPSR,利用這點可從異常返回。在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將R15作為Rd或任何操作數(shù)來使用。5.ARM數(shù)據(jù)處理指令--算術(shù)運算指令2.4.3ARM指令集指令說明:ADD、SUB、RSB、ADC、SBC、RSCADD R2,R1,R3SUBS R8,R6,#240 RSB R4,R4,#1280 ADCHI R11,R0,R3 RSCLES R0,R5,R0,LSLR4 RSCLES R0,R15,R0,LSLR4 5.ARM數(shù)據(jù)處理指令--算術(shù)運算指令2.4.3ARM指令集例:ADD、SUB、RSB、ADC、SBC、RSCAND、ORR、EOR、BICop{cond}{S}Rd,Rn,Operand25.ARM數(shù)據(jù)處理指令—邏輯運算指令

2.4.3ARM指令集句法:指令用于與、或、異或、位清零等邏輯運算。

BIC指令用于將Rn中的位與Operand2值中的相應(yīng)位的反碼進行“與”操作。若指定S,則指令將根據(jù)結(jié)果更新標志N和Z;計算Operand2時更新標志C;不影響標志V。關(guān)于R15的使用與算術(shù)運算指令相同。5.ARM數(shù)據(jù)處理指令--邏輯運算指令2.4.3ARM指令集指令說明:AND、ORR、EOR、BICAND R9,R2,#0xFF00ORREQ R2,R0,R5 EORS R0,R0,R3,RORR6 BICNES R8,R10,R0,RRX EORS R0,R15,R3,RORR6 5.ARM數(shù)據(jù)處理指令--邏輯運算指令2.4.3ARM指令集

例:AND、ORR、EOR、BICMOV、MVNop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令—數(shù)據(jù)傳送指令

2.4.3ARM指令集句法:指令用于數(shù)據(jù)傳送。

MOV指令將Operand2的值拷貝到Rd;

MVN指令對Operand2的值按位取非后,將結(jié)果拷貝到Rd。關(guān)于條件碼標志的影響與邏輯運算指令相同。關(guān)于R15的使用與算術(shù)運算指令相同。

5.ARM數(shù)據(jù)處理指令--數(shù)據(jù)傳送指令2.4.3ARM指令集指令說明:MOV、MVNMOV R5,R2MVNNE R11,#0x0F000000 MOVS R0,R0,ASRR3

5.ARM數(shù)據(jù)處理指令--數(shù)據(jù)傳送指令2.4.3ARM指令集

例:MOV、MVNCMP、CMNop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令--比較指令

2.4.3ARM指令集句法:指令用于比較操作,根據(jù)結(jié)果更新條件碼標志,結(jié)果并不放入寄存器。其中,CMP指令從Rn的值中減去Operand2的值,結(jié)果丟棄;CMN指令將Operand2的值加到Rn的值中,結(jié)果丟棄。如果將R15用作Rn,則使用的值是指令的地址加8。在控制寄存器移位的操作中,不能使用R15。5.ARM數(shù)據(jù)處理指令--比較指令2.4.3ARM指令集指令說明:CMP、CMNCMP R2,R9CMN R0,#6400CMPGT R13,R7,LSL#2 CMP R2,R15,ASRR0

5.ARM數(shù)據(jù)處理指令--比較指令2.4.3ARM指令集

例:CMP、CMNTST、TEQop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令--測試指令

2.4.3ARM指令集句法:指令用于測試操作,根據(jù)結(jié)果更新條件碼標志,結(jié)果不放入寄存器。其中,TST指令對Rn的值與Operand2的值進行按位“與”操作,結(jié)果丟棄;TEQ指令對Rn的值與Operand2的值進行按位“異或”操作,結(jié)果丟棄。關(guān)于條件碼標志的影響與算術(shù)運算指令相同。關(guān)于R15的使用與比較指令相同。5.ARM數(shù)據(jù)處理指令--測試指令2.4.3ARM指令集指令說明:TST、TEQTST R0,#0x3F8TEQEQ R10,R9 TSTNE R1,R5,ASRR1 TEQ R15,R1,RORR0 5.ARM數(shù)據(jù)處理指令--測試指令2.4.3ARM指令集

例:TST、TEQMUL、MLAMUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn5.ARM數(shù)據(jù)處理指令—乘法指令

2.4.3ARM指令集句法:指令用于進行乘法和乘加32位×32位運算,結(jié)果為低32位。如果指定S,則指令根據(jù)結(jié)果更新標志N和Z;不影響標志V;在ARMv4之前版本中標志C不可靠;在ARMv5以后版本中不影響標志C。

R15不能用作Rd、Rm、Rs或Rn。Rd不能與Rm相同。5.ARM數(shù)據(jù)處理指令--乘法指令2.4.3ARM指令集指令說明:MUL、MLAMUL R10,R2,R5MLA R10,R2,R1,R5MULS R0,R2,R2 MULLT R2,R3,R2 MLAVCS R8,R6,R3,R8 MUL R15,R0,R3 MLA R1,R1,R6 5.ARM數(shù)據(jù)處理指令--乘法指令2.4.3ARM指令集

例:MUL、MLACLZ {cond}Rd,Rm5.ARM數(shù)據(jù)處理指令--CLZ

2.4.3ARM指令集句法:指令用于對Rm中值的前導(dǎo)零的個數(shù)進行計數(shù),結(jié)果放入Rd中。若Rm內(nèi)容為0,則結(jié)果為32;若Rm位[31]為1,則結(jié)果為0。指令不影響條件碼標志。

Rd不允許是R15。指令說明:B {cond} labelBL {cond} label6.ARM分支指令--B、BL

2.4.3ARM指令集句法:指令用于分支和帶鏈接分支的操作。其中,B指令引起處理器轉(zhuǎn)移到label;BL指令將下一條指令的地址拷貝到R14(LR,鏈接寄存器),并引起處理器轉(zhuǎn)移到label。指令說明:6.ARM分支指令--B、BL2.4.3ARM指令集B loopABL sub例:BX {cond} Rm6.ARM分支指令--BX

2.4.3ARM指令集句法:指令用于實現(xiàn)分支,并可選地交換指令集。BX指令將引起處理器轉(zhuǎn)移到Rm中的地址。若Rm的位[0]為1,則指令集變換到Thumb指令集。指令說明:6.ARM分支指令--BX2.4.3ARM指令集BX R6例:BLX {cond} Rm6.ARM分支指令--BLX

2.4.3ARM指令集句法:6.ARM分支指令--BLX

2.4.3ARM指令集指令用于實現(xiàn)帶鏈接分支,并可選地交換指令集。

BLX指令具體用途有:將下一條指令的地址拷貝到R14(LR,鏈接寄存器)中;轉(zhuǎn)移到label或Rm中的地址;切換到Thumb指令集,條件是Rm的位[0]為1或者使用“BLXlabel”的形式。機器級的“BLXlabel”指令的轉(zhuǎn)移不能超過當前指令地址的±32Mb范圍。指令說明:6.ARM分支指令--BX2.4.3ARM指令集BLX R0BLX thumbsub例:7.ARM協(xié)處理器指令

2.4.3ARM指令集

ARM支持16個協(xié)處理器,如用于控制片上功能(如cache、MMU)的系統(tǒng)協(xié)處理器、浮點協(xié)處理器以及其它一些專用的協(xié)處理器。每個協(xié)處理器均忽略ARM處理器和其它協(xié)處理器的指令。如果協(xié)處理器沒有接受ARM的協(xié)處理器指令,則ARM將產(chǎn)生未定義指令中止的陷阱,以此可用來實現(xiàn)“協(xié)處理器丟失”的軟件仿真。SWI {cond}immed_248.ARM雜項指令--SWI2.4.3ARM指令集句法:

SWI指令引起處理器SWI異常,即處理器變?yōu)楣芾砟J?,CPSR內(nèi)容保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。這條指令不影響條件碼標志。指令說明:軟件中斷指令——SWIBKPT immed_168.ARM雜項指令--BKPT2.4.3ARM指令集句法:

BKPT指令引起處理器進入調(diào)試模式,調(diào)試工具可利用這條指令到達特定的地址時查詢系統(tǒng)狀態(tài)。指令說明:斷點指令——BKPTMRS {cond}Rd,psrMSR {cond}psr_fields,#immed_8rMSR {cond}psr_fields,Rm8.ARM雜項指令--MRS、MSR

2.4.3ARM指令集句法:

PSR操作指令MRS和MSR配合使用,可用來更新PSR的讀-修改-寫序列的一部分,如改變處理器模式或清除標志Q。指令說明:PSR操作指令——MRS、MSR9.ARM偽指令--ADR、ADRL、LDR

2.4.3ARM指令集ADR {cond}register,exprADRL{cond}register,exprLDR {cond}register,=[expr|label-expr]句法:

ADR、ADRL和LDR偽指令都是將一個地址加載到一個寄存器中。

指令說明:start MOV R0,#10 ADR R4,start ;=>SUBR4,PC,#0x0Cstart MOV R0,#10 ADRL R4,start+6000;=>ADDR4,PC,#0xE800 ;ADDR4,R4,#0x254LDR R3,=OxFF0 ;加載0xFF0到R3中 ;=>MOV R3,#0xFF0LDR R1,=OxFFF ;加載0xFFF到R1中 ;=>LDR R1,[PC,offset_to_litpool] ;… ;litpoolDCD0xFFFLDR R2,=place ;將place的地址加載到R2中 ;=>LDR R2,[PC,offset_to_litpool] ;… ;litpoolDCDplace9.ARM偽指令--NOP

2.4.3ARM指令集NOP句法:

NOP偽指令在匯編時被替換成ARM的空操作,如“MOVR0,R0”等。

NOP偽指令不能有條件執(zhí)行。

NOP偽指令不影響CPSR中的條件標志位。指令說明:空操作——NOP2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型

2.4.2ARM尋址方式2.4.3ARM指令集2.4.4Thumb指令集(*)第二章嵌入式處理器2.1引言

2.2 嵌入式處理器概述2.3 ARM處理器基礎(chǔ)2.4 ARM指令系統(tǒng)2.5 ARM程序設(shè)計基礎(chǔ)2.5 ARM程序設(shè)計基礎(chǔ)在嵌入式系統(tǒng)程序設(shè)計中,大量使用了C語言進行編程。在有些程序中,使用匯編語言進行編程則更加方便、簡單,甚至是不可替代的,例如初始化硬件的代碼、啟動代碼等。2.5 ARM程序設(shè)計基礎(chǔ)匯編語言都具有一些相同的基本特征,例如:一條指令一行。使用標號(label)給內(nèi)存單元提供名稱,從第一列開始書寫。指令必須從第二列或能區(qū)分標號的地方開始書寫。注釋跟在指定的注釋字符后面(ARM使用的是“;”),一直書寫到行尾。2.5 ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實例

2.5.4匯編語言與C語言的混合編程2.5ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式ARM匯編語句的格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}2.5ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

symbol:符號。在ARM匯編語言中,符號在指令和偽指令中用作地址標號,在一些偽操作中用作變量或常量。符號的使用有以下一些規(guī)則:符號必須從一行的行頭開始符號由大小寫字母、數(shù)字以及下劃線組成,但不能包含空格符號區(qū)分大小寫局部標號以數(shù)字開頭,其它符號都不能以數(shù)字開頭符號在作用范圍內(nèi)是唯一的,即在其作用范圍內(nèi)不能有同名的符號程序中的符號不能與系統(tǒng)的內(nèi)部變量或系統(tǒng)預(yù)定義的符號同名程序中的符號通常不要與指令助記符或偽操作同名2.5ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

instruction:指令。在ARM匯編語言中,指令不能從一行的行頭開始。在一行語句中,指令的前面必須有空格或符號。

directive:偽操作。

pseudo-instruction:偽指令。

comment:語句的注釋。在ARM匯編語言中,注釋以分號“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可單獨占用一行。2.5ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式關(guān)于ARM匯編語句,需要說明的有以下幾點:指令、偽指令以及偽操作的助記符可全部使用大寫字母,也可全部使用小寫字母,但不能在一個助記符中既有大寫字母又有小寫字母;在程序中,語句之間最好適當?shù)夭迦肟招校@樣可提高源代碼的可讀性;如果一條語句很長,為提高可讀性,可使用“\”將其分成若干行進行書寫。在“\”后面不能再有其它字符,包括空格和制表符。

2.5 ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實例

2.5.4匯編語言與C語言的混合編程2.5ARM程序設(shè)計基礎(chǔ)

2.5.2ARM匯編程序格式采用不同的編譯器,ARM匯編語言程序的格式可能會略有不同??傮w上,ARM匯編程序的基本格式是相同的。ARM匯編程序以段(section)為單位來組織源文件。2.5ARM程序設(shè)計基礎(chǔ)

2.5.2ARM匯編程序格式ARM匯編程序經(jīng)過匯編處理后生成一個可執(zhí)行的映像文件,映像文件通常包括以下3個部分:一個或多個代碼段。代碼段的屬性通常是只讀的。

0或多個包含初始值的數(shù)據(jù)段。數(shù)據(jù)段的屬性通常是可讀/寫的。

0或多個不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,屬性是可讀/寫的。ARM匯編程序的基本結(jié)構(gòu)AREAEXAMPLE,CODE,READONLY ENTRY start MOV R0,#10 MOV R1,#3 ADD R0,R0,R1 ENDAREA表示了一個段的開始,同時定義了這個段的名稱和相關(guān)屬性標識了程序執(zhí)行的第一條指令,即程序的入口點標識源文件的結(jié)束。每一個匯編模塊必須包含一個END偽操作,用來指示模塊的結(jié)束2.5 ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實例

2.5.4匯編語言與C語言的混合編程

AREAHelloWorld,CODE,READONLY ;聲明代碼段SWI_WriteCEQU &0 ;輸出R0中的字符SWI_Exit

EQU &11 ;程序結(jié)束

ENTRY

;代碼的入口START ADR R1,TEXT ;R1→“HelloWorld”LOOP LDRB R0,[R1],#1 ;讀取下一個字節(jié)

CMP R0,#0 ;檢查文本終點

SWINE SWI_WriteC ;若非終點,則打印

BNE LOOP ;并返回LOOP

SWI SWI_Exit ;執(zhí)行結(jié)束TEXT = “HelloWorld”,&0a,&0d,0

END

;程序源代碼結(jié)束

AREABlkCpy,CODE,READONLY ;聲明代碼段SWI_WriteC EQU &0 ;輸出R0中的字符SWI_Exit EQU &11 ;程序結(jié)束

ENTRY ;代碼的入口 ADR R1,TABLE1 ;R1→TABLE1 ADR R2,TABLE2 ;R2→TABLE2 ADR R3,T1END ;R3→T1ENDLOOP1 LDR R0,[R1],#4 ;讀取TABLE1的第一個字 STR R0,[R2],#4 ;拷貝到TABLE2 CMP R1,R3 ;結(jié)束? BLT LOOP1 ;若非,則再拷貝 ADR R1,TABLE2 ;R1→TABLE2LOOP2 LDRB R0,[R1],#1 ;讀取下一個字 CMP R0,#0 ;檢查文本終點 SWINE SWI_WriteC ;若非終點,則打印 BNE LOOP2 ;并返回LOOP2 SWI SWI_Exit ;執(zhí)行結(jié)束TABLE1 = “Thisistherightstring!”,&0a,&0d,0T1END

ALIGN ;保證字對準TABLE2 = “Thisisthewrongstring!”,0

END ;程序源代碼結(jié)束2.5 ARM程序設(shè)計基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實例

2.5.4匯編語言與C語言的混合編程2.5ARM程序設(shè)計基礎(chǔ)

2.5.4匯編語言與C語言的混合編程高級語言使程序能夠以抽象的方式來表述。編譯器是支持高級語言、可以達到抽象目的的依賴。靈活地運用匯編語言和C語言之間的關(guān)系進行混合編程,有利于系統(tǒng)和相關(guān)模塊的開發(fā)。2.5ARM程序設(shè)計基礎(chǔ)

2.5.4匯編語言與C語言的混合編程匯編語言和C語言的混合編程分為兩種情況:如果匯編代碼比較簡單,則可以直接利用內(nèi)嵌匯編的方式進行混合編程;如果匯編代碼比較復(fù)雜,則可以將匯編程序和C程序分別以文件的形式加到一個工程里,通過ATPCS標準來完成匯編程序和C程序之間的調(diào)用。1.內(nèi)嵌匯編

內(nèi)嵌匯編器armcc和armcpp用來支持完整的ARM指令集,tcc和tcpp用來支持Thumb指令集。內(nèi)嵌的匯編指令包括大部分ARM指令和Thumb指令,但不能直接引用C語言的變量定義,數(shù)據(jù)交換必須通過函數(shù)過程調(diào)用標準ATPCS(ARM-ThumbProcedureCallStandard)進行。嵌入式匯編在形式上表現(xiàn)為獨立定義的函數(shù)體。2.5.4匯編語言與C語言的混合編程1.內(nèi)嵌匯編--內(nèi)嵌匯編指令

2.5.4匯編語言與C語言的混合編程__asm(“指令[;指令]”);語法格式

:其中“__asm”是ARMC編譯器使用的關(guān)鍵字,“__”是兩個下劃線。指令之間用“;”分隔。如果一條指令占據(jù)多行,在行尾可使用連字符“\”。匯編命令段中可使用C語言的注釋語句。如果有多條匯編指令嵌入,則可用“{}”將它們歸為一條語句,注意1.內(nèi)嵌匯編--內(nèi)嵌匯編注意事項

對于寄存器R0~R3、LR和PC的使用要格外小心。編譯器在計算表達式時可能會將寄存器R0~R3、R12和R14用于子程序調(diào)用,因此在內(nèi)嵌的匯編指令中,不要將這些寄存器同時指定為物理寄存器。

2.5.4匯編語言與C語言的混合編程__asm{ MOV R0,x ADD y,R0,x/y /*(x/y)的結(jié)果覆蓋了R0*/}例:__asm{ MOV var,x ADD y,var,x/y }1.內(nèi)嵌匯編--內(nèi)嵌匯編注意事項

不要使用寄存器尋址變量。2.5.4匯編語言與C語言的混合編程intbad_f(intx){ __asm{ADDR0,R0,#1} /*將發(fā)生寄存器沖突,R0 中保存的x的值將不變*/ returnx; }例:intbad_f(intx){ __asm{ADDx,x,#1} /*將發(fā)生寄存器沖突,R0 中保存的x的值將不變*/ returnx; }1.內(nèi)嵌匯編--內(nèi)嵌匯編注意事項

使用內(nèi)嵌匯編時,編譯器會自動保存和恢復(fù)可能用到的寄存器,用戶無須在程序中再作這些工作。讀物理寄存器(除PSR寄存器之外)之前必須先進行寫入。2.5.4匯編語言與C語言的混合編程intf(intx){__asm { STMFD SP,{R0} ;由于SP出現(xiàn)了寫前先讀,因 此對R0的保存是非法的 ADD R0,x,#1 EOR x,R0,x LDMFD SP!,{R0} ;對R0的恢復(fù)沒有必要 }returnx;}例:1.內(nèi)嵌匯編--內(nèi)嵌匯編注意事項

LDM和STM指令的寄存器列表中只允許使用物理寄存器。內(nèi)嵌匯編可以修改處理器模式、協(xié)處理器狀態(tài)和FP、SL、SB等ATPCS寄存器,但是編譯器在編譯時并不了解這些變化,所以必須保證在執(zhí)行C語言代碼前恢復(fù)被改變了的處理器模式。2.5.4匯編語言與C語言的混合編程由于匯編語言使用“,”作為操作數(shù)的分隔符,因此帶“,”的C語言表達式作為操作數(shù)時,必須用“()”括起來歸為一個匯編操作數(shù)。#include <stdio.h>void my_strcpy(char *src,constchar *dst){ intch; __asm { loop: #ifdef _arm /*ARM版本*/ LDRB ch,[src],#1 STRB ch,[dst],#1 #else /*Thumb版本*/ LDRB ch,[src] ADD src,#1 STRB ch,[dst] ADD dst,#1 #endif CMP ch,#0 BNE loop }}例1、字符串復(fù)制intmain(void){ constchar *a=“HelloWorld!”; charb[20]; __asm { MOVR0,a /*設(shè)置入口參數(shù)*/ MOVR1,b BLmy_strcpy,{R0,R1} /*調(diào)用my_strcpy()函數(shù)*/ } printf(“Originalstring:%s\n”,a); /*顯示字符串復(fù)制結(jié)果*/ printf(“Copiedstring:%s\n”,b); return0;}__inlinevoid enable_IRQ(void){ inttmp; __asm { MRS tmp,CPSR BIC tmp,tmp,#0x80 MSR CPSR_c,tmp }}__inlinevoid disable-_IRQ(void){ inttmp; __asm { MRS tmp,CPSR ORR tmp,tmp,#0x80 MSR CPSR_c,tmp }}例2、使能和禁止中斷intmain(void){ disable_IRQ(); enable_IRQ();}2.C語言和ARM匯編語言之間相互調(diào)用為了使不同編譯器產(chǎn)生的程序和匯編語言編寫的程序能靈活地混合,ARM公司定義了一系列過程調(diào)用的規(guī)則,稱為ATPCS(ARM-ThumbProcedureCallStandard)。這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則

溫馨提示

  • 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

提交評論