微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)(第2版)chap9_第1頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)(第2版)chap9_第2頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)(第2版)chap9_第3頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)(第2版)chap9_第4頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)(第2版)chap9_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第九章第九章 ARM程序設(shè)計(jì)程序設(shè)計(jì)9.1 ARM程序程序開發(fā)環(huán)境開發(fā)環(huán)境9.2 ARM匯編語言程序設(shè)計(jì)技術(shù)匯編語言程序設(shè)計(jì)技術(shù)1. 匯編語言程序匯編語言程序開發(fā)特點(diǎn)開發(fā)特點(diǎn)2. 匯編偽指令匯編偽指令3. 匯編語句格式匯編語句格式4. 匯編語言匯編語言程序結(jié)構(gòu)程序結(jié)構(gòu)及及實(shí)例實(shí)例9.3 ARM“匯編匯編+C”混合編程技術(shù)混合編程技術(shù)1. ARM工程及程序框架工程及程序框架2. C/C+語言和匯編語言的語言和匯編語言的混合編程混合編程2022-4-20符號定義符號定義、數(shù)據(jù)定義數(shù)據(jù)定義、匯編控制匯編控制、宏指令宏指令、其他其他符號符號、表達(dá)式和運(yùn)算符表達(dá)式和運(yùn)算符

2、第九章第九章 習(xí)題習(xí)題思考:思考:2424、6 6、7 7、914914作業(yè):作業(yè):5 5、8 8、151915192022-4-20第 九 章 結(jié) 束ARM常用開發(fā)環(huán)境常用開發(fā)環(huán)境一一基于基于Windows平臺平臺 ADS ,目前已經(jīng)基本被替代,目前已經(jīng)基本被替代 RealView Developer Suite(RVDS) Embedded Workbench for ARM(EWARM) ,IAR System公司,入門簡單,授權(quán)費(fèi)用高公司,入門簡單,授權(quán)費(fèi)用高 RealView Microcontroller Development Kit(MDK) ,Keil公司,多用于低端公司,多

3、用于低端ARM處理器開發(fā)處理器開發(fā)二二基于基于Linux平臺平臺 ARM-Linux-GCC,GNU公司,使用繁瑣但不需授權(quán)費(fèi)用公司,使用繁瑣但不需授權(quán)費(fèi)用 CodeWarrior IDERV DebuggerCodeWarrior IDE的主窗口的主窗口 RVD調(diào)試器主窗口調(diào)試器主窗口 匯編語言程序設(shè)計(jì)特點(diǎn)匯編語言程序設(shè)計(jì)特點(diǎn)1.匯編語言依賴匯編語言依賴機(jī)器硬件機(jī)器硬件,不同,不同CPU提供的匯編指令可能提供的匯編指令可能有很大的不同,因此匯編源程序幾乎不具移植性;但匯有很大的不同,因此匯編源程序幾乎不具移植性;但匯編語言程序速度快、效率高,更能發(fā)揮機(jī)器硬件的長處;編語言程序速度快、效率高,

4、更能發(fā)揮機(jī)器硬件的長處;2.匯編程序需要用戶將匯編過程中需要的一些匯編程序需要用戶將匯編過程中需要的一些輔助信息輔助信息明明確地寫入源程序,如:內(nèi)存邏輯段的劃分情況、數(shù)據(jù)在確地寫入源程序,如:內(nèi)存邏輯段的劃分情況、數(shù)據(jù)在內(nèi)存中的存放情況,等等。這些信息的說明由匯編程序內(nèi)存中的存放情況,等等。這些信息的說明由匯編程序指定相應(yīng)的偽指令來完成,并不由指定相應(yīng)的偽指令來完成,并不由CPU定義;定義;3. 偽指令偽指令是在匯編過程中執(zhí)行的,因而不會在機(jī)器語言是在匯編過程中執(zhí)行的,因而不會在機(jī)器語言程序中產(chǎn)生目標(biāo)代碼;只有程序中產(chǎn)生目標(biāo)代碼;只有CPU定義的定義的(助記符)指令(助記符)指令才會生成目標(biāo)代

5、碼,并在程序運(yùn)行過程中執(zhí)行;才會生成目標(biāo)代碼,并在程序運(yùn)行過程中執(zhí)行;匯編語言源程序匯編語言源程序機(jī)器語言程序機(jī)器語言程序(目標(biāo)代碼)(目標(biāo)代碼)匯編(匯編程序)匯編(匯編程序)高級語言源程序高級語言源程序編譯或解釋(編譯程序)編譯或解釋(編譯程序)8/524.源程序經(jīng)匯編得到的目標(biāo)代碼實(shí)際上也是不能運(yùn)源程序經(jīng)匯編得到的目標(biāo)代碼實(shí)際上也是不能運(yùn)行行的,還要經(jīng)過系統(tǒng)的鏈接定位后才能生成真正的,還要經(jīng)過系統(tǒng)的鏈接定位后才能生成真正的的可執(zhí)行文件??蓤?zhí)行文件。 即一般用匯編語言開發(fā)應(yīng)用軟即一般用匯編語言開發(fā)應(yīng)用軟件時應(yīng)依次完成以下幾個步驟:件時應(yīng)依次完成以下幾個步驟:(1 1)編輯編輯得到源程序得到

6、源程序(2 2)匯編匯編得到目標(biāo)代碼(解決語法錯誤)得到目標(biāo)代碼(解決語法錯誤)(3 3)鏈接鏈接得到可執(zhí)行文件(解決定位錯誤)得到可執(zhí)行文件(解決定位錯誤) (4 4)調(diào)試調(diào)試得到功能正確的應(yīng)用軟件(解決邏輯錯誤)得到功能正確的應(yīng)用軟件(解決邏輯錯誤)(以上第(以上第2 24 4步任何一步有錯都應(yīng)返回到第步任何一步有錯都應(yīng)返回到第1 1步重來)步重來)9/52匯編語言、匯編語言源程序、目標(biāo)程序、可執(zhí)行程序匯編語言、匯編語言源程序、目標(biāo)程序、可執(zhí)行程序助記符指令、助記符指令、偽指令偽指令匯編、匯編器(匯編軟件、匯編程序)匯編、匯編器(匯編軟件、匯編程序)符號定義偽指令符號定義偽指令 符號類型符

7、號類型指示符指示符功能功能符號定義符號定義偽指令偽指令GBLA聲明和初始化一個聲明和初始化一個全局全局算術(shù)變量,初始值為算術(shù)變量,初始值為0GBLL聲明和初始化一個全局邏輯變量,初始值為聲明和初始化一個全局邏輯變量,初始值為FALSEGBLS聲明和初始化一個全局字符串變量,初始值為空聲明和初始化一個全局字符串變量,初始值為空LCLA聲明和初始化一個聲明和初始化一個局部局部算術(shù)變量,初始值為算術(shù)變量,初始值為0。局部算術(shù)變量只。局部算術(shù)變量只能在宏中進(jìn)行聲明。能在宏中進(jìn)行聲明。LCLL聲明和初始化一個局部邏輯變量,初始值為聲明和初始化一個局部邏輯變量,初始值為FALSE。局部邏輯變。局部邏輯變量

8、只能在宏中進(jìn)行聲明。量只能在宏中進(jìn)行聲明。LCLS聲明和初始化一個局部字符串變量,初始值為空。局部字符串變聲明和初始化一個局部字符串變量,初始值為空。局部字符串變量只能在宏中進(jìn)行聲明。量只能在宏中進(jìn)行聲明。SETA給一個局部或全局算術(shù)變量給一個局部或全局算術(shù)變量置值置值SETL給一個局部或全局邏輯變量置值給一個局部或全局邏輯變量置值SETS給一個局部或全局字符串變量置值給一個局部或全局字符串變量置值RLIST給寄存器集給寄存器集命名命名CN給一個協(xié)處理器寄存器命名給一個協(xié)處理器寄存器命名CP給一個特定協(xié)處理器命名,協(xié)處理器號為給一個特定協(xié)處理器命名,協(xié)處理器號為015DN給一個雙精度給一個雙精

9、度VFP寄存器命名寄存器命名SN給一個單精度給一個單精度VFP寄存器命名寄存器命名FN給一個特定的浮點(diǎn)寄存器命名給一個特定的浮點(diǎn)寄存器命名yyyy-M-d10/52GBLA Test1;聲明全局?jǐn)?shù)字變量聲明全局?jǐn)?shù)字變量Test1,賦值為,賦值為0 xaa Test1 SETA 0 xaaGBLL Test2;聲明全局邏輯變量聲明全局邏輯變量Test2,賦值為,賦值為“真真” Test2 SETL TRUEGBLS Test3;聲明全局字符串變量為聲明全局字符串變量為Test3,賦值為,賦值為Testing“ Test3 SETS Testing“LCLA Test4; 聲明局部數(shù)字變量聲明局部

10、數(shù)字變量Test4,賦值為,賦值為0 xaa Test3 SETA 0 xaaLCLL Test5; 聲明局部邏輯變量聲明局部邏輯變量Test5 ,賦值為,賦值為“真真” Test4 SETL TRUELCLS Test6;聲明局部字符串變量聲明局部字符串變量Test6 ,賦值為,賦值為Testing“ Test6 SETS Testing“RegList RLIST R0-R5, R8, R10; 聲明寄存器列表聲明寄存器列表RegList,LDM/STM指令可通過該名稱訪問寄存器列表指令可通過該名稱訪問寄存器列表yyyy-M-d11/52數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令 數(shù)據(jù)定義數(shù)據(jù)定義偽指令

11、偽指令LTORG指定指定一個文字池用以保存數(shù)據(jù)一個文字池用以保存數(shù)據(jù) 或或MAP指定一個內(nèi)存表的首址指定一個內(nèi)存表的首址# 或或FIELD指定內(nèi)存表中的各數(shù)據(jù)域的長度(一般在指定內(nèi)存表中的各數(shù)據(jù)域的長度(一般在MAP之后)之后)% 或或SPACE指定一塊存儲器的長度并將其中單元初始化為指定一塊存儲器的長度并將其中單元初始化為0= 或或DCB分配分配一片連續(xù)的字節(jié)單元并一片連續(xù)的字節(jié)單元并初始化初始化分配一片連續(xù)的字節(jié)單元并用于存放代碼分配一片連續(xù)的字節(jié)單元并用于存放代碼& 或或DCD分配一片連續(xù)的字單元并初始化(字邊界對齊)分配一片連續(xù)的字單元并初始化(字邊界對齊)DCDU分配一片連續(xù)的字單元

12、并初始化(任意邊界)分配一片連續(xù)的字單元并初始化(任意邊界)DCDO分配一片連續(xù)的分配一片連續(xù)的字單元字單元,并初始化為到靜態(tài)基址寄存器,并初始化為到靜態(tài)基址寄存器R9R9的偏移量的偏移量(字邊界對齊)(字邊界對齊)DCFD分配一片連續(xù)的字單元給雙精度浮點(diǎn)數(shù)并初始化(字邊界對齊)分配一片連續(xù)的字單元給雙精度浮點(diǎn)數(shù)并初始化(字邊界對齊)分配一片連續(xù)的字單元給單精度浮點(diǎn)數(shù)并初始化(字邊界對齊)分配一片連續(xù)的字單元給單精度浮點(diǎn)數(shù)并初始化(字邊界對齊)DCFDU分配一片連續(xù)的字單元給雙精度浮點(diǎn)數(shù)并初始化(任意邊界)分配一片連續(xù)的字單元給雙精度浮點(diǎn)數(shù)并初始化(任意邊界)分配一片連續(xù)的字單元給單精度浮點(diǎn)數(shù)

13、并初始化(任意邊界)分配一片連續(xù)的字單元給單精度浮點(diǎn)數(shù)并初始化(任意邊界)DCFSDCFSUDCIDCQ分配一片連續(xù)的分配一片連續(xù)的8字節(jié)單元并初始化(字邊界對齊)字節(jié)單元并初始化(字邊界對齊)DCQU分配一片連續(xù)的分配一片連續(xù)的8字節(jié)單元并初始化(任意邊界)字節(jié)單元并初始化(任意邊界)DCW分配一片連續(xù)的半字單元并初始化(半字邊界對齊)分配一片連續(xù)的半字單元并初始化(半字邊界對齊)DCWU分配分配一片連續(xù)的半字單元并初始化(任意邊界)一片連續(xù)的半字單元并初始化(任意邊界)DATA標(biāo)識標(biāo)識代碼段中的數(shù)據(jù)標(biāo)號,該符號后是代碼段中的數(shù)據(jù)標(biāo)號,該符號后是DCBDCB等等yyyy-M-dStr DCB

14、 “This is a test!”; ; 分配一片連續(xù)的分配一片連續(xù)的字節(jié)字節(jié)存儲單元并初始化存儲單元并初始化Test2Data DCW 1, 2, 3; ; 分配一片連續(xù)的分配一片連續(xù)的半字半字存儲單元并初始化存儲單元并初始化DataTest DCD 4, 5, 6; ; 分配一片連續(xù)的分配一片連續(xù)的字字存儲單元并初始化存儲單元并初始化FdataTest DCFD 2E115, -5E7; ; 分配一片連續(xù)的分配一片連續(xù)的字字存儲單元并初始化存儲單元并初始化FdataTest DCFS 2E5, -5E-7; ; 分配一片連續(xù)的分配一片連續(xù)的字字存儲單元并初始化存儲單元并初始化DataTe

15、st DCQ 100; ; 分配一片連續(xù)的分配一片連續(xù)的8 8字節(jié)字節(jié)存儲單元并初始化存儲單元并初始化DataSpace SPACE 100; ; 分配連續(xù)分配連續(xù)100100個字節(jié)個字節(jié)存儲單元并初始化為存儲單元并初始化為0 0 定義一個首址為定義一個首址為4096(0 x1000)4096(0 x1000)的內(nèi)存表,該表中包含的內(nèi)存表,該表中包含5 5個字段:個字段:A(4Bytes)A(4Bytes)、B(4Bytes)B(4Bytes)、X(8Bytes)X(8Bytes)、Y(8Bytes)Y(8Bytes)、String(256Bytes)String(256Bytes)。 MAP

16、 0 x1000; ; 內(nèi)存表首地址的值為內(nèi)存表首地址的值為0 x10000 x1000A FIELD 4; ; 定義定義A A的長度為的長度為4 4字節(jié),位置為字節(jié),位置為0 x10000 x1000B FIELD 4 4; ; 定義定義B B的長度為的長度為4 4字節(jié),位置為字節(jié),位置為0 x10040 x1004X FIELD 8; ; 定義定義X X的長度為的長度為8 8字節(jié),位置為字節(jié),位置為0 x10080 x1008Y FIELD 8; ; 定義定義Y Y的長度為的長度為8 8字節(jié),位置為字節(jié),位置為0 x10100 x1010String FIELD 256; ; 定義定義St

17、ringString為為256256字節(jié),位置為字節(jié),位置為0 x10180 x1018LDR R6, A R6, A 基于絕對地基于絕對地址的內(nèi)存表址的內(nèi)存表僅可訪問指令前僅可訪問指令前/ /后后4KB4KB地址范圍的數(shù)據(jù)字段地址范圍的數(shù)據(jù)字段雙精度雙精度單精度單精度定義一個內(nèi)存表,其首址為固定地址與定義一個內(nèi)存表,其首址為固定地址與R9R9和,表中包含同樣字段。和,表中包含同樣字段。MAP MAP 0, R9 0, R9 ; ; 內(nèi)存表首地址為內(nèi)存表首地址為0 0與與R9R9寄存器內(nèi)容的和寄存器內(nèi)容的和A A FIELD FIELD 4 4; ; 定義定義A A的長度為的長度為4 4字節(jié),

18、相對位置為字節(jié),相對位置為0 0B B FIELD FIELD 4 4; ; 定義定義B B的長度為的長度為4 4字節(jié),相對位置為字節(jié),相對位置為4 4X X FIELD FIELD 8 8; ; 定義定義X X的長度為的長度為8 8字節(jié),相對位置為字節(jié),相對位置為8 8Y YFIELD FIELD 8 8; ; 定義定義Y Y的長度為的長度為8 8字節(jié),相對位置為字節(jié),相對位置為1616String String FIELD FIELD 256256; ; 定義定義StringString為為256256字節(jié),相對位置為字節(jié),相對位置為2424ADR ADR R9, DATASTARTR9,

19、 DATASTART;偽指令;偽指令A(yù)DR ADR 初始化初始化R9 R9 LDR LDR R5, B R5, B ; ; 相當(dāng)于相當(dāng)于LDR R5, R9, #4LDR R5, R9, #4可訪問地址范圍可訪問地址范圍超過超過4 KB4 KB的數(shù)據(jù)的數(shù)據(jù)基于相對地基于相對地址的內(nèi)存表址的內(nèi)存表定義一個內(nèi)存表,其首址為定義一個內(nèi)存表,其首址為PCPC的值,表中包含同樣字段。的值,表中包含同樣字段。Dstruc Dstruc SPACE SPACE 280280; ; 分配分配280280個字節(jié)單元個字節(jié)單元MAP MAP Dstruc Dstruc ; ; 內(nèi)存表首地址為內(nèi)存表首地址為Dstr

20、ucDstrucA A FIELDFIELD4 4; ; 定義定義A A的長度為的長度為4 4字節(jié),相對位置為字節(jié),相對位置為0 0B B FIELDFIELD4 4; ; 定義定義B B的長度為的長度為4 4字節(jié),相對位置為字節(jié),相對位置為4 4X X FIELDFIELD8 8; ; 定義定義X X的長度為的長度為8 8字節(jié),相對位置為字節(jié),相對位置為8 8Y Y FIELDFIELD8 8; ; 定義定義Y Y的長度為的長度為8 8字節(jié),相對位置為字節(jié),相對位置為1616String String FIELDFIELD256256; ; 定義定義StringString為為256256字

21、節(jié),相對位置為字節(jié),相對位置為2424LDR LDR R5, B R5, B ; ; 相當(dāng)于相當(dāng)于LDR R5, PC, #4LDR R5, PC, #4基于基于PCPC的的內(nèi)存表內(nèi)存表可訪問地址范圍不可訪問地址范圍不超過超過4 KB4 KB的數(shù)據(jù)的數(shù)據(jù)匯編控制偽指令匯編控制偽指令 GBLA Counter ; 聲明全局的數(shù)字變量聲明全局的數(shù)字變量Counter Counter SETA 3; 由變量由變量Counter控制循環(huán)次數(shù)控制循環(huán)次數(shù)WHILE Counter 10指令序列指令序列修改修改Counter的值的值WENDyyyy-M-d15/52助助記記符符指令功能描述指令功能描述IF

22、、ELSE和和ENDIF根據(jù)條件成立與否決定是否編譯某個指令序列根據(jù)條件成立與否決定是否編譯某個指令序列WHILE和和WEND根據(jù)條件成立與否決定是否循環(huán)編譯某個指令序列根據(jù)條件成立與否決定是否循環(huán)編譯某個指令序列MACRO和和MEND將一段代碼用一個標(biāo)號替代,可在程序中多次調(diào)用該段代碼將一段代碼用一個標(biāo)號替代,可在程序中多次調(diào)用該段代碼MEXIT從宏定義中跳轉(zhuǎn)出去從宏定義中跳轉(zhuǎn)出去宏和宏定義指令宏和宏定義指令 MACRO $標(biāo)號標(biāo)號 宏名宏名 $參數(shù)參數(shù)1,$參數(shù)參數(shù)2, 宏體宏體MEND MACRO MACRO和和MENDMEND偽指令可以嵌套使用。偽指令可以嵌套使用。 宏宏的使用方式和功

23、能與的使用方式和功能與子程序子程序有些相似。子程序有些相似。子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲空間并提高可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲空間并提高運(yùn)行速度,但在使用子程序結(jié)構(gòu)時需要保護(hù)現(xiàn)場,運(yùn)行速度,但在使用子程序結(jié)構(gòu)時需要保護(hù)現(xiàn)場,從而增加了系統(tǒng)的開銷。因此,在代碼較短且需要從而增加了系統(tǒng)的開銷。因此,在代碼較短且需要傳遞的參數(shù)較多時,可以使用宏指令代替子程序。傳遞的參數(shù)較多時,可以使用宏指令代替子程序。yyyy-M-d16/52定義一條宏指令,使其可以完成測試定義一條宏指令,使其可以完成測試- -跳轉(zhuǎn)操作。跳轉(zhuǎn)操作。 MICRO ; 宏定義開始宏定義開始 $lable TestAn

24、dBranch $dest, $reg, $cc $lable CMP $reg, #0 B$cc $destMEND ; 宏定義結(jié)束宏定義結(jié)束 宏名宏名宏參宏參目標(biāo)地址目標(biāo)地址測試寄存器測試寄存器條件條件用于構(gòu)造宏義用于構(gòu)造宏義體內(nèi)的標(biāo)號體內(nèi)的標(biāo)號test TestAndBranch NonZero, R0, NE ;程序中的程序中的宏調(diào)用宏調(diào)用NonZerotest CMP R0, #0;程序匯編時宏展開;程序匯編時宏展開BNE NonZero;其它;其它指令序列指令序列NonZero ;其它指令序列;其它指令序列yyyy-M-d17/52MICRO ; 宏定義宏定義開始開始$lable

25、xmac $p1, $p2 ; 宏的名稱為宏的名稱為xmac,有兩個參數(shù),有兩個參數(shù)$p1和和$p2$lable.loop1 ; $lable.loop1為宏定義體的內(nèi)部標(biāo)號為宏定義體的內(nèi)部標(biāo)號 BGE $lable.loop1$lable.loop2 指令指令 ; $lable.loop2為宏定義體的內(nèi)部標(biāo)號為宏定義體的內(nèi)部標(biāo)號 BL $p1 ; 參數(shù)參數(shù)$p1為一個子程序的名稱為一個子程序的名稱 BGT $lable.loop2 ADR $p2MEND ; 宏定義結(jié)束宏定義結(jié)束 abc xmac subr1, de ;宏調(diào)用宏調(diào)用,其中宏標(biāo)號為,其中宏標(biāo)號為abc,參數(shù)為參數(shù)為subr1,

26、de ;宏展開宏展開abc.loop1 BGE abc.loop1abc.loop2 BL subr1 BGT abc.loop2 ADR de 類似宏的類似宏的偽指令偽指令A(yù)DR , ADR , 將相對于程序或相對于寄存器的地址載入寄存器中將相對于程序或相對于寄存器的地址載入寄存器中MOV R0, #0 x18 ; MOV R0, #0 x18 ; 給給R0R0賦值用于查表賦值用于查表ADRADR R3, R3, JumpTableJumpTable ; ; 裝載裝載跳轉(zhuǎn)表的首跳轉(zhuǎn)表的首地址地址LDR PC, R3,R0,LSL#2 ; LDR PC, R3,R0,LSL#2 ; 查表,將查

27、到的地址賦給查表,將查到的地址賦給PCPCJumpTableJumpTableADR R3 JumpTableLDR PC,R3,R0,LSL#2xxxJumpTablexxxxxxJumpTable+72xxxPCR3JumpTablexxxLDR LDR , , / 將將3232位常數(shù)或地址載入寄存器位常數(shù)或地址載入寄存器數(shù)值常數(shù)數(shù)值常數(shù)exprexpr取值位于規(guī)定范圍內(nèi)時匯編器取值位于規(guī)定范圍內(nèi)時匯編器將會生成一個將會生成一個MOVMOV或或MVNMVN指令指令否則匯編器會將常數(shù)放入否則匯編器會將常數(shù)放入文字池文字池中,并會生中,并會生成一個相對于程序的成一個相對于程序的LDRLDR指令

28、,該指令可從指令,該指令可從文字池中讀取此常數(shù)文字池中讀取此常數(shù)LDRLDR R3,R3,=0 xFF00 xFF0; ; 把把立即數(shù)立即數(shù)0 xFF00 xFF0賦值給賦值給R3R3LDR LDR R2, R2,=place place ; ; 把把標(biāo)號標(biāo)號placeplace對應(yīng)的地址賦值給對應(yīng)的地址賦值給R2 R2 其它常用偽指令其它常用偽指令 其他常用其他常用的偽指令的偽指令 AREAALIGN從一個字邊界開始從一個字邊界開始指示匯編器匯編一段新的代碼或數(shù)據(jù)部分指示匯編器匯編一段新的代碼或數(shù)據(jù)部分CODE16指示匯編器將隨后的指令作為指示匯編器將隨后的指令作為16位位Thumb指令指令

29、CODE32指示匯編器將隨后的指令作為指示匯編器將隨后的指令作為32位位ARM指令指令END表示源程序的結(jié)束表示源程序的結(jié)束ENTRY指向程序的入口,一個源文件中只能有一個指向程序的入口,一個源文件中只能有一個ENTRY* 或或EQU對一個常量賦予一個符號名對一個常量賦予一個符號名EXPORT或或GLOBAL說明了由鏈接器在目標(biāo)和庫文件中使用的符號說明了由鏈接器在目標(biāo)和庫文件中使用的符號IMPORT或或EXTERN提供匯編器在當(dāng)前匯編中未曾定義的符號名提供匯編器在當(dāng)前匯編中未曾定義的符號名GET或或INCLUDE包含一個文件,在包含一個文件,在GET處匯編包含的文件處匯編包含的文件INCBIN

30、包含一個未被匯編過的文件包含一個未被匯編過的文件KEEP指示匯編器保留符號表中的局部符號指示匯編器保留符號表中的局部符號NOFP在匯編語言程序中禁止浮點(diǎn)指令在匯編語言程序中禁止浮點(diǎn)指令REQUIRE指示兩段之間的依賴關(guān)系指示兩段之間的依賴關(guān)系REQUIRE8指示當(dāng)前文件請求堆棧為指示當(dāng)前文件請求堆棧為8字節(jié)對準(zhǔn)字節(jié)對準(zhǔn)PRESERVE8指示當(dāng)前文件保持堆棧為指示當(dāng)前文件保持堆棧為8字節(jié)對準(zhǔn)字節(jié)對準(zhǔn)RN給特定的寄存器命名給特定的寄存器命名ROUT標(biāo)記局部標(biāo)號使用范圍的界面標(biāo)記局部標(biāo)號使用范圍的界面yyyy-M-d21/52AREA、ENTRY、END偽指令偽指令 AREA 段名段名屬性屬性1,屬

31、性,屬性2,定義代碼段或數(shù)據(jù)段定義代碼段或數(shù)據(jù)段 1.段名若以數(shù)字開頭,則該段名需用段名若以數(shù)字開頭,則該段名需用“|”括起來,如括起來,如|1_test|。 2.屬性字段表示該代碼或數(shù)據(jù)的相關(guān)屬性,多個屬性關(guān)鍵字以逗號分隔:屬性字段表示該代碼或數(shù)據(jù)的相關(guān)屬性,多個屬性關(guān)鍵字以逗號分隔:lCODE:用于定義代碼段。:用于定義代碼段。lDATA:用于定義數(shù)據(jù)段。:用于定義數(shù)據(jù)段。lREADONLY:指定本段為只讀屬性,代碼段默認(rèn)為:指定本段為只讀屬性,代碼段默認(rèn)為READONLY。lREADWRITE:指定本段為可讀寫屬性,數(shù)據(jù)段默認(rèn)為:指定本段為可讀寫屬性,數(shù)據(jù)段默認(rèn)為READWRITE。l

32、lALIGN 表達(dá)式:表達(dá)式取值為表達(dá)式:表達(dá)式取值為031。ELF(可執(zhí)行連接文件可執(zhí)行連接文件)的段默認(rèn)按字對齊。的段默認(rèn)按字對齊。l lCOMMON:定義一個通用段,各源文件中同名:定義一個通用段,各源文件中同名的的COMMON段共享同一段存儲單元。段共享同一段存儲單元。 一個匯編源程序至少包含一個段,程序太長時可分為多個段并用一個匯編源程序至少包含一個段,程序太長時可分為多個段并用AREA標(biāo)示;標(biāo)示;一個匯編源程序最多只能有一個一個匯編源程序最多只能有一個 (可以沒有可以沒有)ENTRY標(biāo)示程序入口;標(biāo)示程序入口;一個完整的匯編源程序中至少應(yīng)有一個用一個完整的匯編源程序中至少應(yīng)有一個用

33、ENTRY標(biāo)示的入口,如有多個則程序的標(biāo)示的入口,如有多個則程序的真正入口點(diǎn)由連接器指定;真正入口點(diǎn)由連接器指定;一個匯編源程序用一個匯編源程序用END標(biāo)示源文件結(jié)束;標(biāo)示源文件結(jié)束;AREA Init, CODE, READONLY;代碼段代碼段Init屬性為只讀屬性為只讀 ENTRY;指定應(yīng)用程序的入口點(diǎn)指定應(yīng)用程序的入口點(diǎn)指令序列指令序列END ;通知編譯器源程序結(jié)束通知編譯器源程序結(jié)束22/52ALIGN偽指令偽指令 ALIGN 表達(dá)式表達(dá)式,偏移量,偏移量 ALIGN偽指令可通過添加填充字節(jié)的方式,使當(dāng)前位置偽指令可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對其方式。其中:滿足一定

34、的對其方式。其中:表達(dá)式可能的取值為表達(dá)式可能的取值為2的冪(如的冪(如1,2,4,8和和16等)。若等)。若未指定表達(dá)式則將當(dāng)前位置對齊到下一個字的位置。未指定表達(dá)式則將當(dāng)前位置對齊到下一個字的位置。若使用偏移量字段,則當(dāng)前位置的對齊方式為:表達(dá)式若使用偏移量字段,則當(dāng)前位置的對齊方式為:表達(dá)式+偏偏移量。移量。AREA Init, CODE, READONLY, ALIEN = 3 ; 指定后面的指令指定后面的指令 ;為為8字節(jié)對齊字節(jié)對齊 指令序列指令序列ENDyyyy-M-d23/52CODE16、CODE32偽指令偽指令 在在ARM指令和指令和Thumb指令混合編程的代碼里,該偽指令

35、指令混合編程的代碼里,該偽指令用于通知編譯器其后的指令序列為用于通知編譯器其后的指令序列為16位還是位還是32位。位。 注意它們只能控制編譯方式,并不能切換處理器狀態(tài)。注意它們只能控制編譯方式,并不能切換處理器狀態(tài)。AREA Init, CODE, READONLYCODE32 ; 通知編譯器其后為通知編譯器其后為32位的位的ARM指令指令 LDR R0, = NEXT + 1 ; 將跳轉(zhuǎn)地址放入寄存器將跳轉(zhuǎn)地址放入寄存器R0 BX R0 ; 程序跳轉(zhuǎn),并將處理器切換到程序跳轉(zhuǎn),并將處理器切換到Thumb狀態(tài)狀態(tài)CODE16 ; 通知編譯器其后為通知編譯器其后為16位的位的Thumb指令指令N

36、EXT LDR R3, = 0 x3FFEND ; 程序結(jié)束程序結(jié)束24/52EQU偽指令偽指令 名稱名稱 EQU 表達(dá)式表達(dá)式,類型,類型 用于為程序中的用于為程序中的常量和標(biāo)號常量和標(biāo)號等定義一個等效的字符名稱,等定義一個等效的字符名稱,類似于類似于C語言中的語言中的define。其中。其中EQU可用可用“*”代替。代替。 當(dāng)表達(dá)式為當(dāng)表達(dá)式為32位的常量時,其數(shù)據(jù)類型可以為位的常量時,其數(shù)據(jù)類型可以為CODE16,CODE32或或DATA三種類型之一。三種類型之一。Test EQU 50; 定義常量定義常量Test的值為的值為50Addr EQU 0 x55, CODE32 ; 定義標(biāo)號

37、定義標(biāo)號Addr的值為的值為0 x55,且該處為且該處為32位的位的ARM指令指令yyyy-M-d25/52EXPORT(或或GLOBAL) 標(biāo)號標(biāo)號WEAKIMPORT(或或EXTERN) 標(biāo)號標(biāo)號WEAK EXPORT用于聲明一個全局標(biāo)號,該標(biāo)號可在其他文件中引用。用于聲明一個全局標(biāo)號,該標(biāo)號可在其他文件中引用。 WEAK選項(xiàng)聲明其他同名標(biāo)號優(yōu)先于該標(biāo)號被引用。選項(xiàng)聲明其他同名標(biāo)號優(yōu)先于該標(biāo)號被引用。IMPORT用于通知編譯器當(dāng)前源文件可能要引用其他源文件中定義的標(biāo)號。用于通知編譯器當(dāng)前源文件可能要引用其他源文件中定義的標(biāo)號。 WEAK選項(xiàng)表示所有源文件都沒有定義這個標(biāo)號時編譯器不會給出選

38、項(xiàng)表示所有源文件都沒有定義這個標(biāo)號時編譯器不會給出 錯誤錯誤信息,在多數(shù)情況下將該標(biāo)號置為信息,在多數(shù)情況下將該標(biāo)號置為0。若該標(biāo)號被。若該標(biāo)號被B或或BL指令引用,則將指令引用,則將B或或BL指令置為指令置為NOP操作。操作。 使用使用IMPORT則標(biāo)號一定會被加入到當(dāng)前源文件的符號表中。使用則標(biāo)號一定會被加入到當(dāng)前源文件的符號表中。使用EXTERN則標(biāo)號未被引用時不會被加入到當(dāng)前源文件的符號表中。則標(biāo)號未被引用時不會被加入到當(dāng)前源文件的符號表中。標(biāo)號在程序中區(qū)分大小寫。標(biāo)號在程序中區(qū)分大小寫。 AREA Init1, CODE, READONLYEXPORT Main; 源文件源文件1聲明

39、一個可全局引用的標(biāo)號聲明一個可全局引用的標(biāo)號Main END AREA Init2, CODE, READONLYIMPORT Main ;源文件源文件2需要引用在別處定義的標(biāo)號需要引用在別處定義的標(biāo)號Main END26/52INCLUDE(或或GET)、INCBIN偽指令偽指令 INCLUDE 文件名文件名INCBIN 文件名文件名INCLUDE(或或GET)偽指令用于將一個偽指令用于將一個源文件源文件包含到當(dāng)前的源文件中。包含到當(dāng)前的源文件中。 被包含的源文件在當(dāng)前位置進(jìn)行匯編處理。被包含的源文件在當(dāng)前位置進(jìn)行匯編處理。INCBIN偽指令用于將一個偽指令用于將一個目標(biāo)文件或數(shù)據(jù)文件目標(biāo)文

40、件或數(shù)據(jù)文件包含到當(dāng)前的源文件中包含到當(dāng)前的源文件中 被包含的文件不作任何變動,編譯器從其后開始繼續(xù)被包含的文件不作任何變動,編譯器從其后開始繼續(xù)處理。處理。 AREA Init, CODE, READONLY GET C:a2.s; 通知編譯器此處插入源文件通知編譯器此處插入源文件C:a2.s INCBIN a1.dat; 通知編譯器此處插入數(shù)據(jù)文件通知編譯器此處插入數(shù)據(jù)文件a1.dat INCBIN C:a2.o; 通知編譯器此處插入目標(biāo)文件通知編譯器此處插入目標(biāo)文件C:a2.o END 編寫匯編源程序時,常將一個源文件專門用于定義編寫匯編源程序時,常將一個源文件專門用于定義宏指令宏指令(

41、MICROMICRO)、)、符號常量符號常量(EQUEQU),),結(jié)構(gòu)化數(shù)據(jù)類型結(jié)構(gòu)化數(shù)據(jù)類型(MAPMAP和和FIELDFIELD),然后再用),然后再用GETGET偽指令將這個源文件包含到其他源文件中偽指令將這個源文件包含到其他源文件中。匯編語言中常用的符號匯編語言中常用的符號 在匯編語言程序設(shè)計(jì)中,經(jīng)常使用各種符在匯編語言程序設(shè)計(jì)中,經(jīng)常使用各種符號代替號代替地址、變量和常量地址、變量和常量等,以增加程序的可等,以增加程序的可讀性。盡管符號的命名由編程者決定,但并不讀性。盡管符號的命名由編程者決定,但并不是任意的,必須遵循以下的約定:是任意的,必須遵循以下的約定:l l 符號區(qū)分符號區(qū)分

42、大小寫大小寫,同名的大小寫字母符號會,同名的大小寫字母符號會被編譯器認(rèn)為是兩個不同的符號;被編譯器認(rèn)為是兩個不同的符號;l l 局部標(biāo)號可以以數(shù)字開頭,其他標(biāo)號均不得局部標(biāo)號可以以數(shù)字開頭,其他標(biāo)號均不得以數(shù)字開頭;以數(shù)字開頭;l l 符號在其符號在其作用范圍作用范圍內(nèi)必須唯一;內(nèi)必須唯一;l l 自定義的符號名不能與系統(tǒng)的自定義的符號名不能與系統(tǒng)的保留字保留字相同相同, ,如如指令或偽指令;指令或偽指令;常常 量量指其值在程序的運(yùn)行過程中不能被改變的量指其值在程序的運(yùn)行過程中不能被改變的量ARM(Thumb)匯編程序所支持的常量有匯編程序所支持的常量有數(shù)字常量數(shù)字常量、邏輯常量和字符串常量、

43、邏輯常量和字符串常量。l數(shù)字常量一般為數(shù)字常量一般為32位的整數(shù),用位的整數(shù),用“#”標(biāo)識。標(biāo)識。 當(dāng)作為無符號數(shù)時,其取值范圍為當(dāng)作為無符號數(shù)時,其取值范圍為0232-1 當(dāng)作為有符號數(shù)時,其取值范圍為當(dāng)作為有符號數(shù)時,其取值范圍為-231231-1l邏輯常量只有兩種取值情況:邏輯常量只有兩種取值情況:真真TURE或假或假FAUSE 。l字符串常量為一個固定的字符串,一般用于程序運(yùn)行時的字符串常量為一個固定的字符串,一般用于程序運(yùn)行時的信息提示。信息提示。yyyy-M-d29/52變變 量量 ARM(Thumb)匯編程序支持?jǐn)?shù)字、邏輯和字符串變量。匯編程序支持?jǐn)?shù)字、邏輯和字符串變量??捎每捎?/p>

44、GBLAGBLA,GBLLGBLL和和GBLSGBLS偽指令聲明全局變量,用偽指令聲明全局變量,用LCLALCLA,LCLLLCLL和和LCLSLCLS偽指令聲明局部變量,并可使用偽指令聲明局部變量,并可使用SETASETA,SETLSETL和和SETSSETS對其進(jìn)行初始化。對其進(jìn)行初始化。變量可通過代換操作(變量可通過代換操作(“$”$”)獲得一個常量:)獲得一個常量:l數(shù)字變量前加數(shù)字變量前加“$” $” ,編譯器會將其值轉(zhuǎn)換為十六進(jìn)制的字,編譯器會將其值轉(zhuǎn)換為十六進(jìn)制的字符串,并用該十六進(jìn)制的字符串代換符串,并用該十六進(jìn)制的字符串代換“$”$”后的數(shù)字變量。后的數(shù)字變量。l邏輯變量前加

45、邏輯變量前加“$”$”,編譯器會將該邏輯變量代換為其值,編譯器會將該邏輯變量代換為其值( (真或假真或假) )。l字符串變量前加字符串變量前加“$”$”,編譯器會用其值代換,編譯器會用其值代換 “$”$”后的后的 字字符串變量。符串變量。LCLSLCLS S1 S1; ; 定義局部字符串變量定義局部字符串變量S1S1和和S2S2LCLS LCLS S2S2S1 S1 SETS SETS Test!Test!S2S2SETS SETS This is a $S1This is a $S1; S2; S2的值為的值為This is a Test!”This is a Test!”30/52算術(shù)算術(shù)

46、/邏輯表達(dá)式及運(yùn)算符邏輯表達(dá)式及運(yùn)算符算術(shù)算術(shù)/邏輯表達(dá)式由邏輯表達(dá)式由數(shù)字?jǐn)?shù)字/邏輯變量、數(shù)字邏輯變量、數(shù)字/邏輯常量、運(yùn)算符和括號邏輯常量、運(yùn)算符和括號構(gòu)成。構(gòu)成。 X+Y和X-Y差XY乘X/Y除X:MOD:Y余運(yùn)算次序的規(guī)定:運(yùn)算次序的規(guī)定:l l 優(yōu)先級相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接?;?yōu)先級相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接?;l l 相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶螅覇文窟\(yùn)算符相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,且單目運(yùn)算符的優(yōu)先級高于其他運(yùn)算符;的優(yōu)先級高于其他運(yùn)算符;l括號運(yùn)算符的優(yōu)先級最高。括號運(yùn)算符的優(yōu)先級最高。X:ROL:YX循環(huán)左移Y位X:ROR:YX循環(huán)右

47、移Y位X:SHL:YX左移Y位X:SHR:YX右移Y位X:AND:Y按位邏輯與X:OR:Y按位邏輯或:NOT:Y按位邏輯非X:EOR:Y按位邏輯異或X = YX等于YX YX大于YX = YX大于等于YX = YX小于等于YX /= YX不等于YX YX不等于YX:LAND:Y邏輯與X:LOR:Y邏輯或:LNOT:Y邏輯非X:LEOR:Y邏輯異或31/52注意:這些運(yùn)算在匯注意:這些運(yùn)算在匯編過程中計(jì)算,機(jī)器編過程中計(jì)算,機(jī)器碼中出現(xiàn)的已經(jīng)是表碼中出現(xiàn)的已經(jīng)是表達(dá)式的值了。達(dá)式的值了。字符串表達(dá)式及運(yùn)算符字符串表達(dá)式及運(yùn)算符 字符串表達(dá)式一般由字符串表達(dá)式一般由字符串常量、字符串變量、運(yùn)算符和

48、括號字符串常量、字符串變量、運(yùn)算符和括號構(gòu)成。構(gòu)成。編譯器支持的字符串最大長度為編譯器支持的字符串最大長度為512512字節(jié)字節(jié)。 LEN:XLEN:X 返回字符串返回字符串X X的長度的長度( (字符數(shù)字符數(shù)) )。 CHR:MCHR:M 將將02550255之間的整數(shù)之間的整數(shù)M M轉(zhuǎn)換為一個字符。轉(zhuǎn)換為一個字符。 STR:XSTR:X 將數(shù)字或邏輯表達(dá)式將數(shù)字或邏輯表達(dá)式X X轉(zhuǎn)換為一個字符串。轉(zhuǎn)換為一個字符串。對于數(shù)字表達(dá)式,對于數(shù)字表達(dá)式,STRSTR運(yùn)算得到一個以十六進(jìn)制字符組成的字符串;運(yùn)算得到一個以十六進(jìn)制字符組成的字符串;對于邏輯表達(dá)式,對于邏輯表達(dá)式,STRSTR運(yùn)算得到字

49、符串運(yùn)算得到字符串“T T”或或“F F”。 X:LEFT:Y X:LEFT:Y 返回字符串返回字符串X X左端的子串。整數(shù)左端的子串。整數(shù)Y Y表示要返回的字符個數(shù)表示要返回的字符個數(shù)。 X:RIGHT:YX:RIGHT:Y 返回字符串返回字符串X X右端的子串。整數(shù)右端的子串。整數(shù)Y Y表示要返回的字符個數(shù)表示要返回的字符個數(shù) X:CC:YX:CC:Y 將字符串將字符串Y Y連接到字符串連接到字符串X X的后面形成一個新字符串。的后面形成一個新字符串。yyyy-M-d32/52其它常用運(yùn)算符其它常用運(yùn)算符 ?X?X返回定義符號返回定義符號X X的代碼行所生成的可執(zhí)行代碼的長度的代碼行所生成

50、的可執(zhí)行代碼的長度(字節(jié)數(shù))(字節(jié)數(shù)) :DEF:X:DEF:X 判斷是否定義了符號判斷是否定義了符號X X:如果符號:如果符號X X已經(jīng)定義則結(jié)果已經(jīng)定義則結(jié)果為真,否則為假。為真,否則為假。 BASE:X BASE:X 返回基于寄存器的表達(dá)式返回基于寄存器的表達(dá)式X X中寄存器的編號。中寄存器的編號。 INDEX:XINDEX:X 返回基于寄存器的表達(dá)式返回基于寄存器的表達(dá)式X X中相對于其基址寄存器的偏移中相對于其基址寄存器的偏移量。量。 yyyy-M-d33/52ARM匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) ARM(Thumb)ARM(Thumb)匯編語言程序中,以匯編語言程序中,以程序段(

51、代碼段和數(shù)據(jù)段)程序段(代碼段和數(shù)據(jù)段)為單位組織代碼。為單位組織代碼。 一個匯編程序至少應(yīng)該有一個代碼段。當(dāng)程序較長時,可一個匯編程序至少應(yīng)該有一個代碼段。當(dāng)程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯連接時最以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯連接時最終形成一個可執(zhí)行的映象文件。終形成一個可執(zhí)行的映象文件??蓤?zhí)行映象文件可執(zhí)行映象文件通常由以下幾部分構(gòu)成:通常由以下幾部分構(gòu)成: l l 一個一個或多個代碼段,代碼段的屬性默認(rèn)為或多個代碼段,代碼段的屬性默認(rèn)為READONLYREADONLY。 l l 零個或多個包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性默認(rèn)為零個或多個包含初

52、始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性默認(rèn)為READWRITEREADWRITE。 l l 零個或多個不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為默認(rèn)零個或多個不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為默認(rèn)為為READWRITEREADWRITE。yyyy-M-d34/52ARM匯編語言程序匯編語言程序段結(jié)構(gòu)段結(jié)構(gòu)GET option.sGET addr.s AREA Init,CODE,READONLY ENTRY LDRR0,=0 x0FMULR1,R0,R0 ENDAREAData1,DATA,READWRITE numDCD10 END引用其它源文件引用其它源文件代碼段代碼段數(shù)據(jù)段數(shù)據(jù)段ARM(Th

53、umb)匯編語句格式匯編語句格式 標(biāo)號標(biāo)號 指令或偽指令指令或偽指令; 注釋注釋 助記符可以全部用大寫字母或全部用小寫字母,助記符可以全部用大寫字母或全部用小寫字母,但不允許在一條指令中大小寫字母混用。但不允許在一條指令中大小寫字母混用。 如果一條語句太長,可將該長語句分為若干行如果一條語句太長,可將該長語句分為若干行來書寫,在行的末尾用來書寫,在行的末尾用“”表示下一行與本行為表示下一行與本行為同一條語句。同一條語句。 指令中可以出現(xiàn)常量、變量及表達(dá)式。指令中可以出現(xiàn)常量、變量及表達(dá)式。 AREA Init, CODE, READONLY ENTRYSTART LDR R0, = 0 x3F

54、F5000 LDR R1, 0 xFF STR R1, R0 LDR R0, = 0 x3FF5008 LDR R1, 0 x01 STR R1, R0 ENDAREAAREA偽指令定義一個段,偽指令定義一個段,并說明段的相關(guān)屬性并說明段的相關(guān)屬性ENTRYENTRY偽指令標(biāo)識程序的入口點(diǎn)偽指令標(biāo)識程序的入口點(diǎn)每一個匯編源文件都必須有一條每一個匯編源文件都必須有一條ENDEND偽指令,指示匯編的結(jié)束偽指令,指示匯編的結(jié)束偽指令偽指令LDR對于不能被對于不能被MOV和和MVN指令所讀指令所讀取的立即數(shù)取的立即數(shù),將其變成常量進(jìn)行讀取。將其變成常量進(jìn)行讀取。存儲單存儲單元地址元地址標(biāo)號標(biāo)號STAR

55、TSTART代表第一條指令的存放地址代表第一條指令的存放地址38/ 32 AREA Block, CODE, READONLYnum EQU 20 ; 設(shè)置將要復(fù)制的字?jǐn)?shù)設(shè)置將要復(fù)制的字?jǐn)?shù) ENTRY Start LDR R0, =src ; R0指向源數(shù)據(jù)區(qū)指向源數(shù)據(jù)區(qū)src LDR R1, =dst ; R1指向目標(biāo)數(shù)據(jù)區(qū)指向目標(biāo)數(shù)據(jù)區(qū)dst MOV R2, #num ; R2保存將要復(fù)制的字?jǐn)?shù)保存將要復(fù)制的字?jǐn)?shù) MOV SP, #0 x400 ; 設(shè)置堆棧指針設(shè)置堆棧指針(R13)Blockcopy MOVS R3, R2, LSR #3 ; 需要進(jìn)行的以需要進(jìn)行的以8個字為單位的復(fù)制次

56、數(shù)個字為單位的復(fù)制次數(shù) BEQ Copywords ; 對于剩下不足對于剩下不足8個字的數(shù)據(jù),跳轉(zhuǎn)到個字的數(shù)據(jù),跳轉(zhuǎn)到Copywords STMFD SP!, R4-R11 ; 將工作寄存器將工作寄存器R4-R11壓入堆棧保存壓入堆棧保存Octcopy LDMIA R0!, R4-R11 ; 從源數(shù)據(jù)區(qū)讀取從源數(shù)據(jù)區(qū)讀取8個字的數(shù)據(jù),放入個字的數(shù)據(jù),放入8個寄存器中個寄存器中 STMIA R1!, R4-R11 ; 將將8個寄存器中的數(shù)據(jù)寫入目標(biāo)數(shù)據(jù)區(qū)中個寄存器中的數(shù)據(jù)寫入目標(biāo)數(shù)據(jù)區(qū)中 SUBS R3, R3, #1 ; 將塊復(fù)制次數(shù)減將塊復(fù)制次數(shù)減1 BNE Octcopy ; 循環(huán)操作,直

57、到完成以循環(huán)操作,直到完成以8個字為單位的塊復(fù)制個字為單位的塊復(fù)制 LDMFD SP!, R4-R11 ; 從堆棧彈出恢復(fù)工作寄存器從堆棧彈出恢復(fù)工作寄存器R4-R11Copywords ANDS R2, R2, #7 ; 剩下不足剩下不足8個字的數(shù)據(jù)的字?jǐn)?shù)個字的數(shù)據(jù)的字?jǐn)?shù) BEQ Stop ; 如果剩下數(shù)據(jù)的字?jǐn)?shù)為如果剩下數(shù)據(jù)的字?jǐn)?shù)為0,則數(shù)據(jù)復(fù)制完成,則數(shù)據(jù)復(fù)制完成Wordcopy LDR R3, R0, #4 ; 從源數(shù)據(jù)區(qū)讀取從源數(shù)據(jù)區(qū)讀取1個字的數(shù)據(jù),放到個字的數(shù)據(jù),放到R3寄存器中寄存器中 STR R3, R1, #4 ; 將將R3寄存器中的數(shù)據(jù)寫入目標(biāo)數(shù)據(jù)區(qū)中寄存器中的數(shù)據(jù)寫入目

58、標(biāo)數(shù)據(jù)區(qū)中 SUBS R2, R2, #1 ; 將字?jǐn)?shù)減將字?jǐn)?shù)減1 BNE Wordcopy ; 循環(huán)操作,直到完成以字為單位的數(shù)據(jù)復(fù)制循環(huán)操作,直到完成以字為單位的數(shù)據(jù)復(fù)制Stop MOV R0,#0 x18 ; LDR R1, =0 x20026 ; SWI 0 x123456 ; 從應(yīng)用程序中退出從應(yīng)用程序中退出 AREA BlockData, DATA, READWRITE ; 定義數(shù)據(jù)區(qū)定義數(shù)據(jù)區(qū)BlockDatasrc DCD 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 ; 定義源數(shù)據(jù)區(qū)定義源數(shù)據(jù)區(qū)srcdst DCD 0, 0,

59、0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 定義目標(biāo)數(shù)據(jù)區(qū)定義目標(biāo)數(shù)據(jù)區(qū)dst END ; 結(jié)束匯編結(jié)束匯編數(shù)據(jù)塊復(fù)制數(shù)據(jù)塊復(fù)制; ;文件名:文件名:TEST1.S TEST1.S ; ;功能:實(shí)現(xiàn)兩個寄存器相加功能:實(shí)現(xiàn)兩個寄存器相加 ; ;說明:使用說明:使用ARMulateARMulate軟件仿真調(diào)試軟件仿真調(diào)試 AREAAREA Example1,CODE,READONLY;Example1,CODE,READONLY;聲明代碼段聲明代碼段Example1 Example1 ENTRYENTRY ; ;標(biāo)識程序入口標(biāo)識程序入口 CODE32CO

60、DE32 ; ;聲明聲明3232位位ARMARM指令指令START MOVSTART MOVR0,#0R0,#0 ; ;設(shè)置參數(shù)設(shè)置參數(shù) MOVMOVR1,#10R1,#10LOOPLOOP BL BLADD_SUBADD_SUB ; ;調(diào)用子程序調(diào)用子程序ADD_SUB ADD_SUB B BLOOPLOOP ; ;循環(huán)循環(huán)ADD_SUBADD_SUB ADDS ADDSR0,R0,R1R0,R0,R1 ;R0 = R0 + R1 ;R0 = R0 + R1 MOV MOVPC,LRPC,LR ; ;子程序返回子程序返回 ENDEND ; ;文件結(jié)束文件結(jié)束 使用使用“;”進(jìn)行注釋進(jìn)行注釋標(biāo)

溫馨提示

  • 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

提交評論