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

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)第二章嵌入式處理器下第1頁,課件共167頁,創(chuàng)作于2023年2月第二章嵌入式處理器2.1引言

2.2 嵌入式處理器概述2.3 ARM處理器基礎(chǔ)2.5 ARM程序設(shè)計(jì)基礎(chǔ)2.4 ARM指令系統(tǒng)第2頁,課件共167頁,創(chuàng)作于2023年2月2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型

2.4.2ARM尋址方式

2.4.3ARM指令集

2.4.4Thumb指令集第3頁,課件共167頁,創(chuàng)作于2023年2月2.4.1ARM編程模型2.4ARM指令系統(tǒng)

流水線數(shù)據(jù)類型處理器模式處理器工作狀態(tài)寄存器組織異常存儲器和存儲器映射I/O第4頁,課件共167頁,創(chuàng)作于2023年2月1.流水線

2.4.1ARM編程模型

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

第5頁,課件共167頁,創(chuàng)作于2023年2月1.流水線

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

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

Byte

字節(jié),8位;

Halfword

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

Word

字,32位(字必須與4字 節(jié)邊界對準(zhǔn))。第11頁,課件共167頁,創(chuàng)作于2023年2月2.數(shù)據(jù)類型

2.4.1ARM編程模型圖2-8ARM數(shù)據(jù)類型存儲圖第12頁,課件共167頁,創(chuàng)作于2023年2月3.處理器模式

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

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

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

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

Thumb狀態(tài):16位,執(zhí)行半字對準(zhǔn)的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,=LabelBXR0第14頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織

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

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

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

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

2.4.1ARM編程模型第17頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織--分組寄存器r8~r14

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

r8_<mode>~r14_<mode>第18頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織--分組寄存器r8~r14

r8~r12各有兩組物理寄存器:一組為FIQ模式,另一組為FIQ以外的模式。寄存器r8~r12沒有指定特殊用途,而使用r8_fiq~r12_fiq則允許快速中斷。2.4.1ARM編程模型第19頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織--分組寄存器r8~r14

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

2.4.1ARM編程模型

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

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

寄存器r15通常被用作程序計(jì)數(shù)器PC。在ARM狀態(tài)下,PC的值保存在位[31:2],而位[1:0]為0;在Thumb狀態(tài)下,PC的值保存在位[31:1],而位[0]為0。2.4.1ARM編程模型第21頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織--當(dāng)前程序狀態(tài)寄存器CPSR

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

2.4.1ARM編程模型Thumb狀態(tài)下寄存器組織第24頁,課件共167頁,創(chuàng)作于2023年2月5.寄存器組織--Thumb狀態(tài)的寄存器集

2.4.1ARM編程模型Thumb狀態(tài)寄存器到ARM寄存器的映射第25頁,課件共167頁,創(chuàng)作于2023年2月6.異常

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

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

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

進(jìn)入異常的操作:2.4.1ARM編程模型在相應(yīng)的鏈接寄存器LR(r14)中保存下一條指令的地址將CPSR復(fù)制到相應(yīng)的SPSR中強(qiáng)制使CPSR模式位置成對應(yīng)異常類型的值強(qiáng)制使程序計(jì)數(shù)器指向相應(yīng)異常向量,取下一條指令第30頁,課件共167頁,創(chuàng)作于2023年2月例子:用戶模式到

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返回一個從用戶模式計(jì)算的地址,PC值存儲在FIQ模式RegistersinuseRegistersinuse異常用戶模式FIQ模式spsr_fiq第31頁,課件共167頁,創(chuàng)作于2023年2月7.存儲器和存儲器映射I/O

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

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

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

存儲器格式是指字、半字、字節(jié)在存儲器中存放的方式,也反映了存儲器中字、半字、字節(jié)之間的映射關(guān)系。存儲器格式包括小端和大端兩種格式。2.4.1ARM編程模型第35頁,課件共167頁,創(chuàng)作于2023年2月7.存儲器和存儲器映射I/O--存儲器格式

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

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

2.4.1ARM編程模型

2.4.2ARM尋址方式

2.4.3ARM指令集

2.4.4Thumb指令集第39頁,課件共167頁,創(chuàng)作于2023年2月

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

第40頁,課件共167頁,創(chuàng)作于2023年2月2.4.2ARM尋址方式2.4ARM指令系統(tǒng)

寄存器尋址立即尋址寄存器移位尋址寄存器間接尋址基址尋址多寄存器尋址堆棧尋址塊拷貝尋址相對尋址第41頁,課件共167頁,創(chuàng)作于2023年2月1.寄存器尋址

指令地址碼給出寄存器的編號,寄存器中的內(nèi)容為操作數(shù)。2.4.2ARM尋址方式例如:

ADD R0,R1,R2 ;R0←R1+R2寫操作數(shù)的順序?yàn)椋旱谝粋€寄存器R0為結(jié)果寄存器,第二個寄存器R1為第一操作數(shù)寄存器,第三個寄存器R2為第二操作數(shù)寄存器。注意第42頁,課件共167頁,創(chuàng)作于2023年2月2.立即尋址指令操作碼后的地址碼是立即數(shù),即操作數(shù)本身。2.4.2ARM尋址方式例如:

ADD R3,R3,#1 ;R3←R3+1AND R8,R7,#&FF ;R8←R7[7:0]立即數(shù)的表示以“#”為前綴,十六進(jìn)制的立即數(shù)在“#”后面加“&”符號。

注意第43頁,課件共167頁,創(chuàng)作于2023年2月3.寄存器移位尋址

寄存器移位尋址是ARM指令集特有的尋址方式。第2個操作數(shù)與第1個操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。2.4.2ARM尋址方式例如:

ADDR3,R2,R1,LSL#3 ;R3←R2+8×R1第44頁,課件共167頁,創(chuàng)作于2023年2月3.寄存器移位尋址

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

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

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

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

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

RRX:擴(kuò)展為1的循環(huán)右移(RotateRighteXtendedby1place)。操作數(shù)右移1位,空位(位[31])用原C標(biāo)志填充。第45頁,課件共167頁,創(chuàng)作于2023年2月3.寄存器移位尋址

2.4.2ARM尋址方式移位操作過程第46頁,課件共167頁,創(chuàng)作于2023年2月4.寄存器間接尋址

指令地址碼給出寄存器的編號,寄存器為地址指針,存放操作數(shù)的有效地址。2.4.2ARM尋址方式例如:

LDR R0,[R1] ;R0←[R1] STR R0,[R1] ;R0→[R1]第47頁,課件共167頁,創(chuàng)作于2023年2月5.基址尋址

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

基址加偏移量尋址中的偏移量最大為4KB,可分為前索引尋址和后索引尋址。2.4.2ARM尋址方式前索引尋址舉例:

LDR R0,[R1,#4] ;R0←[R1+4]第49頁,課件共167頁,創(chuàng)作于2023年2月5.基址尋址--基址加偏移量尋址2.4.2ARM尋址方式例:

LDR R0,[R1,#4]! ;R0←[R1] ;R1←R1+4后索引尋址舉例:

LDR R0,[R1],#4 ;R0←[R1] ;R1←R1+4這種改變基址寄存器指向下一個傳送的地址對數(shù)據(jù)塊傳送很有用,還可以采用帶自動索引的前索引尋址實(shí)現(xiàn)。注意第50頁,課件共167頁,創(chuàng)作于2023年2月5.基址尋址--基址加索引尋址基址加索引尋址是指令指定一個基址寄存器,再指定另一個寄存器(稱為索引),其值作為位移加到基址上形成存儲器地址。

2.4.2ARM尋址方式例:

LDR R0,[R1,R2] ;R0←[R1+R2]第51頁,課件共167頁,創(chuàng)作于2023年2月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)當(dāng)字對準(zhǔn)。注意第52頁,課件共167頁,創(chuàng)作于2023年2月7.堆棧尋址

堆棧是一種按照特定順序進(jìn)行存取的存儲區(qū)。這種特定的順序是指“后進(jìn)先出”(LIFO)或“先進(jìn)后出”(FILO)。使用堆棧時需要使用一個專門的寄存器作為堆棧指針,棧指針?biāo)付ǖ拇鎯卧褪嵌褩5臈m?。如果堆棧指針指向最后壓入堆棧的有效?shù)據(jù)項(xiàng),就稱為滿堆棧(fullstack);如果堆棧指針指向下一個數(shù)據(jù)項(xiàng)放入的空位置,就稱為空堆棧(emptystack)。2.4.2ARM尋址方式第53頁,課件共167頁,創(chuàng)作于2023年2月7.堆棧尋址

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

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

ARM指令使用push向堆棧寫數(shù)據(jù),稱為進(jìn)棧;使用pop從堆棧讀數(shù)據(jù),稱為出棧。2.4.2ARM尋址方式堆棧指針指向最后壓入的數(shù)據(jù)且由低地址向高地址生成堆棧指針指向最后壓入的數(shù)據(jù)且由高地址向低地址生成堆棧指針指向下一個將要放入數(shù)據(jù)的空位置且由低地址向高地址生成堆棧指針指向下一個將要放入數(shù)據(jù)的空位置且由高地址向低地址生成第54頁,課件共167頁,創(chuàng)作于2023年2月8.塊拷貝尋址

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

2.4.2ARM尋址方式向上生長向下生長滿空滿空增加之前STMIBSTMFALDMIBLDMED之后STMIASTMEALDMIALDMFD減少之前LDMDBLDMEASTMDBSTMFD之后LDMDALDMFASTMDASTMED表2-4多寄存器加載和存儲指令映射第56頁,課件共167頁,創(chuàng)作于2023年2月8.塊拷貝尋址

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

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

I:Increment

D:DecrementorDescendingstack

A:AfterorAscendingstack

B:Before

F:Full

E:Empty 例如“FD”即表明是滿遞減堆棧尋址方式(fulldescendingstack)。第58頁,課件共167頁,創(chuàng)作于2023年2月9.相對尋址

可以將相對尋址看作是以程序計(jì)數(shù)器PC為基址的一種基址尋址方式。指令的地址碼作為位移量,與PC相加得到操作數(shù)的有效地址。位移量指出了操作數(shù)與當(dāng)前指令之間的相對位置。2.4.2ARM尋址方式例:

BL SUBR ;轉(zhuǎn)移到SUBR

… ;返回到此SUBR … ;子程序入口地址

MOVPC,R14 ;返回第59頁,課件共167頁,創(chuàng)作于2023年2月2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型

2.4.2ARM尋址方式

2.4.3ARM指令集

2.4.4Thumb指令集第60頁,課件共167頁,創(chuàng)作于2023年2月2.4ARM指令系統(tǒng)

ARM指令集編碼條件執(zhí)行ARM指令格式ARM存儲器訪問指令A(yù)RM數(shù)據(jù)處理指令A(yù)RM分支指令A(yù)RM協(xié)處理器指令A(yù)RM雜項(xiàng)指令A(yù)RM偽指令2.4.3ARM指令集第61頁,課件共167頁,創(chuàng)作于2023年2月1.ARM指令集編碼

ARM指令集采用32位二進(jìn)制編碼方式,大部分指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標(biāo)志影響位以及每條指令所對應(yīng)的不同功能實(shí)現(xiàn)的二進(jìn)制位。每條ARM指令都具有不同的編碼方式,與不同的指令功能相對應(yīng)。2.4.3ARM指令集第62頁,課件共167頁,創(chuàng)作于2023年2月1.ARM指令集編碼

2.4.3ARM指令集ARM指令集編碼第63頁,課件共167頁,創(chuàng)作于2023年2月2.條件執(zhí)行

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

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

ARM指令集是Load/Store型,只能通過Load/Store指令實(shí)現(xiàn)對存儲器的訪問,其它類型的指令都基于寄存器完成。2.4.3ARM指令集第68頁,課件共167頁,創(chuàng)作于2023年2月操作碼;指令助記符,如ADD、LDR等可選的條件碼;執(zhí)行條件,如EQ、NE等可選后綴;若指定S,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中的條件碼目標(biāo)寄存器存放第一操作數(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指令集第69頁,課件共167頁,創(chuàng)作于2023年2月4.ARM存儲器訪問指令--LDR、STR

LDR和STR為單一數(shù)據(jù)傳送指令,可傳送字和無符號字節(jié)、半字和帶符號字節(jié)、雙字。2.4.3ARM指令集第70頁,課件共167頁,創(chuàng)作于2023年2月(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指令集句法:第71頁,課件共167頁,創(chuàng)作于2023年2月(1)字和無符號字節(jié)

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

2.4.3ARM指令集指令說明:第72頁,課件共167頁,創(chuàng)作于2023年2月(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指令集例:第73頁,課件共167頁,創(chuàng)作于2023年2月(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指令集句法:第74頁,課件共167頁,創(chuàng)作于2023年2月(2)半字和帶符號字節(jié)指令用于加載寄存器16位半字或帶符號8位字節(jié),存儲寄存器16位半字。

帶符號加載是指帶符號擴(kuò)展到32位。

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

2.4.3ARM指令集指令說明:第75頁,課件共167頁,創(chuàng)作于2023年2月(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指令集例:第76頁,課件共167頁,創(chuàng)作于2023年2月(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指令集句法:第77頁,課件共167頁,創(chuàng)作于2023年2月(3)雙字

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

2.4.3ARM指令集指令說明:第78頁,課件共167頁,創(chuàng)作于2023年2月(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指令集例:第79頁,課件共167頁,創(chuàng)作于2023年2月op{cond}modeRn{!},reglist{^}4.ARM存儲器訪問指令--LDM、STM

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

2.4.3ARM指令集指令說明:第81頁,課件共167頁,創(chuàng)作于2023年2月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指令集例:第82頁,課件共167頁,創(chuàng)作于2023年2月PLD [Rn{Flexoffset}]4.ARM存儲器訪問指令--PLD

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

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

ARM數(shù)據(jù)處理指令可以完成的功能包括:2.4.3ARM指令集數(shù)據(jù)傳送算術(shù)運(yùn)算邏輯運(yùn)算比較測試乘法第86頁,課件共167頁,創(chuàng)作于2023年2月5.ARM數(shù)據(jù)處理指令

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

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

2.4.3ARM指令集句法:第90頁,課件共167頁,創(chuàng)作于2023年2月指令用于加、減、反減等算術(shù)運(yùn)算,包括帶進(jìn)位的算術(shù)運(yùn)算。算術(shù)運(yùn)算中如果使用R15作為Rn,則其值為指令的地址加8。如果使用R15作為Rd,則執(zhí)行轉(zhuǎn)移到結(jié)果相應(yīng)的地址;或者在使用“S”的情況下,拷貝SPSR到CPSR,利用這點(diǎn)可從異常返回。在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將R15作為Rd或任何操作數(shù)來使用。5.ARM數(shù)據(jù)處理指令--算術(shù)運(yùn)算指令2.4.3ARM指令集指令說明:ADD、SUB、RSB、ADC、SBC、RSC第91頁,課件共167頁,創(chuàng)作于2023年2月ADD 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ù)運(yùn)算指令2.4.3ARM指令集例:ADD、SUB、RSB、ADC、SBC、RSC第92頁,課件共167頁,創(chuàng)作于2023年2月AND、ORR、EOR、BICop{cond}{S}Rd,Rn,Operand25.ARM數(shù)據(jù)處理指令—邏輯運(yùn)算指令

2.4.3ARM指令集句法:第93頁,課件共167頁,創(chuàng)作于2023年2月

媽媽新開了個淘寶店,歡迎前來捧場

媽媽的淘寶點(diǎn)開了快半年了,主要賣的是毛絨玩具、坐墊、抱枕之類的,但生意一直不是很好,感覺媽媽還是很用心的,花了不少功夫,但是就是沒有人氣,所以我也來出自己的一份力,幫忙宣傳一下。 并且媽媽總是去五亭龍?zhí)糇詈玫耐婢哒?、發(fā)貨,質(zhì)量絕對有保證。 另外我家就在揚(yáng)州五亭龍玩具城旁邊,貨源豐富,質(zhì)量可靠,價格便宜。歡迎大家來逛逛【揚(yáng)州五亭龍玩具總動員】

99個人小廣告:第94頁,課件共167頁,創(chuàng)作于2023年2月指令用于與、或、異或、位清零等邏輯運(yùn)算。

BIC指令用于將Rn中的位與Operand2值中的相應(yīng)位的反碼進(jìn)行“與”操作。若指定S,則指令將根據(jù)結(jié)果更新標(biāo)志N和Z;計(jì)算Operand2時更新標(biāo)志C;不影響標(biāo)志V。關(guān)于R15的使用與算術(shù)運(yùn)算指令相同。5.ARM數(shù)據(jù)處理指令--邏輯運(yùn)算指令2.4.3ARM指令集指令說明:AND、ORR、EOR、BIC第95頁,課件共167頁,創(chuàng)作于2023年2月AND 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ù)處理指令--邏輯運(yùn)算指令2.4.3ARM指令集

例:AND、ORR、EOR、BIC第96頁,課件共167頁,創(chuàng)作于2023年2月MOV、MVNop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令—數(shù)據(jù)傳送指令

2.4.3ARM指令集句法:第97頁,課件共167頁,創(chuàng)作于2023年2月指令用于數(shù)據(jù)傳送。

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

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

5.ARM數(shù)據(jù)處理指令--數(shù)據(jù)傳送指令2.4.3ARM指令集指令說明:MOV、MVN第98頁,課件共167頁,創(chuàng)作于2023年2月MOV R5,R2MVNNE R11,#0x0F000000 MOVS R0,R0,ASRR3

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

例:MOV、MVN第99頁,課件共167頁,創(chuàng)作于2023年2月CMP、CMNop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令--比較指令

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

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

例:CMP、CMN第102頁,課件共167頁,創(chuàng)作于2023年2月TST、TEQop{cond}{S}Rd,Operand25.ARM數(shù)據(jù)處理指令--測試指令

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

例:TST、TEQ第105頁,課件共167頁,創(chuàng)作于2023年2月MUL、MLAMUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn5.ARM數(shù)據(jù)處理指令—乘法指令

2.4.3ARM指令集句法:第106頁,課件共167頁,創(chuàng)作于2023年2月指令用于進(jìn)行乘法和乘加32位×32位運(yùn)算,結(jié)果為低32位。如果指定S,則指令根據(jù)結(jié)果更新標(biāo)志N和Z;不影響標(biāo)志V;在ARMv4之前版本中標(biāo)志C不可靠;在ARMv5以后版本中不影響標(biāo)志C。

R15不能用作Rd、Rm、Rs或Rn。Rd不能與Rm相同。5.ARM數(shù)據(jù)處理指令--乘法指令2.4.3ARM指令集指令說明:MUL、MLA第107頁,課件共167頁,創(chuàng)作于2023年2月MUL 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、MLA第108頁,課件共167頁,創(chuàng)作于2023年2月CLZ {cond}Rd,Rm5.ARM數(shù)據(jù)處理指令--CLZ

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

Rd不允許是R15。指令說明:第109頁,課件共167頁,創(chuàng)作于2023年2月B {cond} labelBL {cond} label6.ARM分支指令--B、BL

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

2.4.3ARM指令集句法:指令用于實(shí)現(xiàn)分支,并可選地交換指令集。BX指令將引起處理器轉(zhuǎn)移到Rm中的地址。若Rm的位[0]為1,則指令集變換到Thumb指令集。指令說明:第112頁,課件共167頁,創(chuàng)作于2023年2月6.ARM分支指令--BX2.4.3ARM指令集BX R6例:第113頁,課件共167頁,創(chuàng)作于2023年2月BLX {cond} Rm6.ARM分支指令--BLX

2.4.3ARM指令集句法:第114頁,課件共167頁,創(chuàng)作于2023年2月6.ARM分支指令--BLX

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

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

2.4.3ARM指令集

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

SWI指令引起處理器SWI異常,即處理器變?yōu)楣芾砟J?,CPSR內(nèi)容保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。這條指令不影響條件碼標(biāo)志。指令說明:軟件中斷指令——SWI第118頁,課件共167頁,創(chuàng)作于2023年2月BKPT immed_168.ARM雜項(xiàng)指令--BKPT2.4.3ARM指令集句法:

BKPT指令引起處理器進(jìn)入調(diào)試模式,調(diào)試工具可利用這條指令到達(dá)特定的地址時查詢系統(tǒng)狀態(tài)。指令說明:斷點(diǎn)指令——BKPT第119頁,課件共167頁,創(chuàng)作于2023年2月MRS {cond}Rd,psrMSR {cond}psr_fields,#immed_8rMSR {cond}psr_fields,Rm8.ARM雜項(xiàng)指令--MRS、MSR

2.4.3ARM指令集句法:

PSR操作指令MRS和MSR配合使用,可用來更新PSR的讀-修改-寫序列的一部分,如改變處理器模式或清除標(biāo)志Q。指令說明:PSR操作指令——MRS、MSR第120頁,課件共167頁,創(chuàng)作于2023年2月9.ARM偽指令--ADR、ADRL、LDR

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

句法:

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

指令說明:第121頁,課件共167頁,創(chuàng)作于2023年2月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] ;… ;litpoolDCDplace第122頁,課件共167頁,創(chuàng)作于2023年2月9.ARM偽指令--NOP

2.4.3ARM指令集NOP句法:

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

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

NOP偽指令不影響CPSR中的條件標(biāo)志位。指令說明:空操作——NOP第123頁,課件共167頁,創(chuàng)作于2023年2月2.4 ARM指令系統(tǒng)

2.4.1ARM編程模型

2.4.2ARM尋址方式

2.4.3ARM指令集

2.4.4Thumb指令集(*)第124頁,課件共167頁,創(chuàng)作于2023年2月第二章嵌入式處理器2.1引言

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

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實(shí)例

2.5.4匯編語言與C語言的混合編程第128頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

2.5.1ARM匯編語句格式

ARM匯編語句的格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}第129頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

2.5.1ARM匯編語句格式

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

2.5.1ARM匯編語句格式

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

directive:偽操作。

pseudo-instruction:偽指令。

comment:語句的注釋。在ARM匯編語言中,注釋以分號“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可單獨(dú)占用一行。第131頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

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

第132頁,課件共167頁,創(chuàng)作于2023年2月2.5 ARM程序設(shè)計(jì)基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實(shí)例

2.5.4匯編語言與C語言的混合編程第133頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

2.5.2ARM匯編程序格式采用不同的編譯器,ARM匯編語言程序的格式可能會略有不同。總體上,ARM匯編程序的基本格式是相同的。ARM匯編程序以段(section)為單位來組織源文件。第134頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

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

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

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

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實(shí)例

2.5.4匯編語言與C語言的混合編程第137頁,課件共167頁,創(chuàng)作于2023年2月

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

;檢查文本終點(diǎn)

SWINE SWI_WriteC ;若非終點(diǎn),則打印

BNE LOOP

;并返回LOOP SWI SWI_Exit

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

END

;程序源代碼結(jié)束第138頁,課件共167頁,創(chuàng)作于2023年2月

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 ;檢查文本終點(diǎn)

SWINE SWI_WriteC ;若非終點(diǎn),則打印

BNE LOOP2 ;并返回LOOP2 SWI SWI_Exit ;執(zhí)行結(jié)束TABLE1 = “Thisistherightstring!”,&0a,&0d,0T1END

ALIGN

;保證字對準(zhǔn)TABLE2 = “Thisisthewrongstring!”,0

END

;程序源代碼結(jié)束第139頁,課件共167頁,創(chuàng)作于2023年2月2.5 ARM程序設(shè)計(jì)基礎(chǔ)

2.5.1ARM匯編語句格式

2.5.2ARM匯編程序格式

2.5.3匯編語言編程實(shí)例

2.5.4匯編語言與C語言的混合編程第140頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

2.5.4匯編語言與C語言的混合編程高級語言使程序能夠以抽象的方式來表述。編譯器是支持高級語言、可以達(dá)到抽象目的的依賴。靈活地運(yùn)用匯編語言和C語言之間的關(guān)系進(jìn)行混合編程,有利于系統(tǒng)和相關(guān)模塊的開發(fā)。第141頁,課件共167頁,創(chuàng)作于2023年2月2.5ARM程序設(shè)計(jì)基礎(chǔ)

2.5.4匯編語言與C語言的混合編程匯編語言和C語言的混合編程分為兩種情況:如果匯編代碼比較

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論