北京聯(lián)合大學(xué)計(jì)算機(jī)嵌入式實(shí)驗(yàn)報(bào)告123_第1頁(yè)
北京聯(lián)合大學(xué)計(jì)算機(jī)嵌入式實(shí)驗(yàn)報(bào)告123_第2頁(yè)
北京聯(lián)合大學(xué)計(jì)算機(jī)嵌入式實(shí)驗(yàn)報(bào)告123_第3頁(yè)
北京聯(lián)合大學(xué)計(jì)算機(jī)嵌入式實(shí)驗(yàn)報(bào)告123_第4頁(yè)
北京聯(lián)合大學(xué)計(jì)算機(jī)嵌入式實(shí)驗(yàn)報(bào)告123_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、北京聯(lián)合大學(xué)嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用實(shí)驗(yàn)報(bào)告學(xué) 院: 信息學(xué)院 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 課 程: 嵌入式系統(tǒng) 班 級(jí): 姓 名: 學(xué) 號(hào): 2015年10月14日目錄實(shí)驗(yàn)二 匯編指令實(shí)驗(yàn)1一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)1二、實(shí)驗(yàn)原理1三、程序代碼和結(jié)果分析2四、實(shí)驗(yàn)總結(jié)6實(shí)驗(yàn)三 C語(yǔ)言和ARM匯編混合編程7一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)7二、實(shí)驗(yàn)原理7三、程序代碼和結(jié)果分析7四、實(shí)驗(yàn)總結(jié)12實(shí)驗(yàn)一 ADS1.2集成開(kāi)發(fā)環(huán)境實(shí)驗(yàn)13一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)13二、 實(shí)驗(yàn)原理13三、程序代碼和分析13四、實(shí)驗(yàn)總結(jié)17實(shí)驗(yàn)二 匯編指令實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)目的:(1)了解ADS 1.2 集成開(kāi)發(fā)環(huán)境及ARMulator 軟件仿真。

2、(2)掌握ARM7TDMI 匯編指令的用法,并能編寫(xiě)簡(jiǎn)單的匯編程序。(3)掌握指令的條件執(zhí)行和使用LDR/STR 指令完成存儲(chǔ)器的訪問(wèn)。任務(wù):(1) 使用LDR 指令讀取0x40003100上的數(shù)據(jù),將數(shù)據(jù)加1,若結(jié)果小于10 則使用STR 指令把結(jié)果寫(xiě)回原地址,若結(jié)果大于等于10,則把0寫(xiě)回原地址。然后再次讀取0x40003100 上的數(shù)據(jù),將數(shù)據(jù)加1,判斷結(jié)果是否小于10周而復(fù)此循環(huán)。 (2) 求從 1 開(kāi)始連續(xù) 10 個(gè)奇數(shù)之和,并將結(jié)果存放在名字為 SUM 的字存儲(chǔ)單元中。編寫(xiě) ARM 匯編程序并加注釋,調(diào)試并記錄運(yùn)行結(jié)果。程序要定義數(shù)據(jù)段存放結(jié)果二、實(shí)驗(yàn)原理ARM指令格式<op

3、code><cond>S <Rd>, <Rn>, operand2opcode:指令助記符,如ADD, LDR, STRcond:執(zhí)行條件,如NE, EQS:是否影響CPSR的值Rd:目標(biāo)寄存器Rn:第一操作數(shù)寄存器operand2:第二操作數(shù)條件執(zhí)行當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行,當(dāng)指令的執(zhí)行條件滿足時(shí),指令被執(zhí)行,否則忽略條件碼每一條ARM指令包含4位的條件碼,位于指令碼的最高4位31:28。條件碼共有15種,每種條件碼可用兩個(gè)字符表示,這兩個(gè)字符可添加在指令助記符的后面實(shí)驗(yàn)中用到的

4、ARM指令集1.跳轉(zhuǎn)指令在ARM程序中有兩種方法可以實(shí)現(xiàn)程序的跳轉(zhuǎn),直接向程序計(jì)數(shù)器PC寫(xiě)入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn)跳轉(zhuǎn)指令包括以下4條指令B跳轉(zhuǎn)指令BL帶返回的跳轉(zhuǎn)指令BX帶狀態(tài)切換的跳轉(zhuǎn)指令 BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令2.數(shù)據(jù)處理指令數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、比較指令和算術(shù)邏輯運(yùn)算指令。數(shù)據(jù)傳送指令進(jìn)行數(shù)據(jù)的傳輸。比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯的運(yùn)算。該類(lèi)指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位。3. 加載/存儲(chǔ)指令A(yù)RM微處理器支持加載/存儲(chǔ)指令用于在寄存

5、器和存儲(chǔ)器之間傳送數(shù)據(jù)。常用的加載存儲(chǔ)指令如下:LDR字?jǐn)?shù)據(jù)加載指令LDRB字節(jié)數(shù)據(jù)加載指令LDRH半字?jǐn)?shù)據(jù)加載指令STR字?jǐn)?shù)據(jù)存儲(chǔ)指令STRB字節(jié)數(shù)據(jù)存儲(chǔ)指令STRH半字?jǐn)?shù)據(jù)存儲(chǔ)指令 LDM批量數(shù)據(jù)加載指令STM批量數(shù)據(jù)存儲(chǔ)指令4.異常指令A(yù)RM微處理器所支持的異常指令:SWI軟件中斷指令SWI 0x0 ; 調(diào)用0號(hào)軟中斷SWI 0x12 ; 調(diào)用12號(hào)軟中斷BKPT (break point)斷點(diǎn)中斷指令BKPT 0x00ff產(chǎn)生軟件斷點(diǎn)中斷,用于程序的調(diào)試三、程序代碼和結(jié)果分析任務(wù)(1)COUNT EQU 0x40003100 AREA Example2,CODE,READONLY ;定

6、義代碼段,名字為Example2,屬性為READONLY ENTRY ;程序入口 CODE32;32位ARM指令START LDR R1,=COUNT ;R1=0x40003100 MOV R0,#0 ;R0=0 STR R0,R1 ;將地址單元40003100的內(nèi)容改為0 LOOP LDR R1,=COUNT ;R1=0x40003000 LDR R0,R1 ;R1=0x40003000存儲(chǔ)單元的內(nèi)容 ADD R0,R0,#1 ;R0=R0+1 CMP R0,#10 ;比較R0和10 MOVHI R0,#0 ;若R0>10,R0=0 STR R0,R1 ;R0的內(nèi)容存儲(chǔ)到地址為0x40

7、003000的存儲(chǔ)單元 B LOOP ;跳轉(zhuǎn)指令 END程序還未運(yùn)行時(shí),地址0x40003100的存儲(chǔ)單元的內(nèi)容為10第一次循環(huán)前,R1的內(nèi)容為存儲(chǔ)單元地址,R0=0,STR RO,R1執(zhí)行后0x40003000的內(nèi)容變?yōu)?第一次循環(huán),R1=0x40003000,為存儲(chǔ)單元地址,該單元內(nèi)容加載到R0,R0=0,R0=R0+1=1,R0的內(nèi)容小于10,故R0不置零,將R0的值寫(xiě)回原地址,值為01第二次循環(huán)完后,R0的值為2,存儲(chǔ)單元內(nèi)容為02,繼續(xù)循環(huán)。直到循環(huán)次數(shù)大于10,MOVHI R0,#0,R0=0,將存儲(chǔ)單元內(nèi)容置為00,如上圖,然后在繼續(xù)無(wú)限循環(huán)上述過(guò)程。任務(wù)(2) AREA BLO

8、CKDATA,DATA,READWRITESUM DCD 0 ;分配一個(gè)連續(xù)的字存儲(chǔ)單元,名字為SUM,賦初值為0 AREA Example,CODE,READONLY ENTRY CODE32 MOV R0,#10 ;R0=10存放循環(huán)次數(shù) MOV R1,#0 ;R1=0 存放累加和 MOV R2,#1 ;第一個(gè)加數(shù)為1NEXT ADD R1,R1,R2 ;R1=R1+R2 ADD R2,R2,#2 ;加數(shù)加2 SUBS R0,R0,#1 ;執(zhí)行個(gè)數(shù)減1 BNE NEXT ;不為0跳轉(zhuǎn)NEXT LDR R4,=SUM ;獲取SUM的地址,存放在R4中 STR R1,R4 ;將R1中的結(jié)果存放

9、到 MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456 END執(zhí)行結(jié)束后,R4中存放的是結(jié)果所在的地址,根據(jù)R4中的地址查詢存儲(chǔ)單元,結(jié)果為64,正確。四、實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn)編寫(xiě)了簡(jiǎn)單的匯編程序指令,對(duì)程序進(jìn)行編譯連接,最終生成執(zhí)行文件,對(duì)程序進(jìn)行單步執(zhí)行,可看到在每一步執(zhí)行過(guò)程中,寄存器內(nèi)容的變化情況,和程序所分得的地址單元。通過(guò)本次試驗(yàn),回顧了在學(xué)習(xí)組成原理和微機(jī)原理時(shí)候使用的集成開(kāi)發(fā)軟件使用方法,并了解ADS 1.2 集成開(kāi)發(fā)環(huán)境,了解了匯編程序的開(kāi)發(fā)過(guò)程,掌握了ARM7TDMI 匯編指令的用法,并能編寫(xiě)簡(jiǎn)單的匯編程序,學(xué)會(huì)了指令的條件執(zhí)行和使用LDR/ST

10、R 指令完成存儲(chǔ)器的訪問(wèn)。能夠在ADS環(huán)境下進(jìn)行編輯、編譯、連接程序。但對(duì)于DOS環(huán)境下的匯編程序的編輯、編譯、連接使用還不是很熟悉。實(shí)驗(yàn)三 C語(yǔ)言和ARM匯編混合編程一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)目的:掌握C語(yǔ)言和ARM匯編混合編程方法。任務(wù):C語(yǔ)言和匯編混合編程,實(shí)現(xiàn)字符串拷貝。二、實(shí)驗(yàn)原理ARM體系結(jié)構(gòu)支持C與匯編語(yǔ)言的混合編程。匯編語(yǔ)言與C的混合編程通常有以下幾種方式:在C代碼中嵌入?yún)R編指令C語(yǔ)言程序調(diào)用匯編函數(shù)匯編程序調(diào)用C函數(shù)在以上的幾種混合編程技術(shù)中,必須遵守一定的調(diào)用規(guī)則:這里所指的是ATPCS規(guī)則,PCS即Procedure Call Standard(過(guò)程調(diào)用規(guī)范),ATPCS即ARM

11、-THUMB procedure call standard。PCS規(guī)定了應(yīng)用程序的函數(shù)可以如何分開(kāi)地寫(xiě),分開(kāi)地編譯,最后將它們連接在一起,所以它實(shí)際上定義了一套有關(guān)過(guò)程(函數(shù))調(diào)用者與被調(diào)用者之間的協(xié)議。各寄存器的使用規(guī)則(1)子程序通過(guò)寄存器R0R3來(lái)傳遞參數(shù)。 這時(shí)寄存器可以記作: A0A3 ,被調(diào)用的子程序在返回前無(wú)需恢復(fù)寄存器R0R3的內(nèi)容。(2)在子程序中,使用R4R11來(lái)保存局部變量,這時(shí)寄存器R4R11可以記作:V1V8。如果在子程序中使用到V1V8的某些寄存器,子程序進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值,對(duì)于子程序中沒(méi)有用到的寄存器則不必執(zhí)行這些操作。

12、(3)寄存器R13用作數(shù)據(jù)棧指針,記做SP;在子程序中寄存器R13不能用做其他用途。 寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。(4)寄存器R14用作連接寄存器,記作lr ;它用于保存子程序的返回地址。(5)寄存器R15是程序計(jì)數(shù)器,記作PC ;它不能用作其他用途。在C程序中調(diào)用匯編文件中的函數(shù),主要工作有兩個(gè):一是在C中聲明函數(shù)原型,并加extern關(guān)鍵字;二是在匯編中用EXPORT導(dǎo)出函數(shù)名,并用該函數(shù)名作為匯編代碼段的標(biāo)識(shí),匯編最后用MOV PC,LR返回。在匯編中調(diào)用C的函數(shù),需要在匯編中使用偽指令I(lǐng)MPORT 聲明將要調(diào)用的C函數(shù)。三、程序代碼和結(jié)果分析(一)調(diào)試運(yùn)行“

13、在C代碼中嵌入?yún)R編指令”程序,并記錄運(yùn)行結(jié)果:#include <stdio.h>void my_strcpy(const char *src,char *dest) char ch; _asm ;以下為匯編指令 LOOP: LDRB ch,src,#1 ;將src所指向的存儲(chǔ)單元內(nèi)容放入ch,src=src+1 STRB ch,dest,#1 ;將ch復(fù)制到dest所指向的存儲(chǔ)單元,dest=dest+1 CMP ch,#0 ;比較ch和0 BNE LOOP ;若不相等,繼續(xù)執(zhí)行循環(huán) int main() char *a="hello! " /源字符串 cha

14、r b32; /目的字符串 my_strcpy(a,b); /調(diào)用復(fù)制函數(shù) printf("copyed:%s",b); return 0;程序分析:該程序?yàn)镃代碼中嵌入?yún)R編指令。src為源字符串第一個(gè)字母在內(nèi)存中的地址,dest則指向目的字符串在內(nèi)存中的第一個(gè)存儲(chǔ)單元,調(diào)用匯編程序時(shí)將源字符串的一個(gè)字符賦給ch,字符串中每個(gè)字符占一個(gè)字節(jié)的存儲(chǔ)單元,所以將src加1,指向源字符串的第二個(gè)字符,然后將ch的值放在dest指向的存儲(chǔ)單元中,并將dest的值加1,指向下一個(gè)存儲(chǔ)單元。循環(huán)上述過(guò)程直到字符串中所有的字符都復(fù)制完成,此時(shí)src指向的單元為0,ch=0時(shí)跳出循環(huán),復(fù)制

15、完成。(二)調(diào)試運(yùn)行“匯編程序調(diào)用C函數(shù)”,程序,并記錄運(yùn)行結(jié)果:匯編文件 AREA ASMFILE,CODE,READONLY IMPORT cFun ENTRY MOV R0,#11 ;R0=11 MOV R1,#22 ;R1=22 MOV R2,#33 ;R2=33 BL cFun ;跳轉(zhuǎn)調(diào)用C文件函數(shù)cFun ENDC文件int cFun(int a,int b,int c) return a+b+c;結(jié)果截圖:?jiǎn)尾綀?zhí)行,R0=11,R1=22,R2=33,BL cFun,調(diào)用C函數(shù)文件,跳轉(zhuǎn)到執(zhí)行C程序,如下返回結(jié)果,結(jié)果R0的值為和,0x42,對(duì)應(yīng)十進(jìn)制為66(三)在現(xiàn)有字符串拷貝

16、(C 語(yǔ)言調(diào)用匯編程序)源程序的基礎(chǔ)上,實(shí)現(xiàn)int類(lèi)型數(shù)據(jù)的拷貝。編寫(xiě)ARM匯編程序并加注釋,調(diào)試并記錄運(yùn)行結(jié)果。提示:源數(shù)字可用數(shù)組定義,如int s4;并對(duì)數(shù)組元素進(jìn)行初始化,s0=1;s1=2;s2=3;s4=0,同樣定義目標(biāo)數(shù)組d4并初始化為0。注:一個(gè)int型數(shù)字占4個(gè)存儲(chǔ)單元。驗(yàn)證是否拷貝成功,利用for循環(huán)顯示目標(biāo)數(shù)組內(nèi)容。匯編文件: AREA ASMFILE1,CODE,READONLY;定義代碼段 EXPORT asm_strcpy ;導(dǎo)出匯編程序asm_strcpyLOOP LDRB R4,R0,#4 ;將以R0的內(nèi)容為地址的存儲(chǔ)空間內(nèi)容送到R4, R0=R0+4 CMP

17、R4,#0 ;比較R4和0 BEQ OVER ;若不相等則結(jié)束 STRB R4,R1,#4 ;將R4的內(nèi)容放回存儲(chǔ)單元 B LOOP ;循環(huán)OVER MOV PC,LR ;將連接寄存器的地址賦給PC,程序返回原任務(wù)執(zhí)行ENDC文件:#include<stdio.h>extern void asm_strcpy(const int *src,int *dest); /聲明外部函數(shù)int main() int i=0; const int s4=1,2,3,4; /原數(shù)組 int d4=0; /目的數(shù)組 asm_strcpy(s,d); /調(diào)用匯編函數(shù) for(i=0;i<4;i

18、+) /循環(huán)輸出目的數(shù)組d printf("%d",di); return 0;結(jié)果截圖:程序分析:該程序?yàn)镃語(yǔ)言調(diào)用匯編文件。R0的內(nèi)容為源數(shù)組第一個(gè)整數(shù)在內(nèi)存中的地址,R1則指向目的數(shù)組在內(nèi)存中的第一個(gè)存儲(chǔ)單元,調(diào)用匯編程序時(shí)將源數(shù)組的第一個(gè)整數(shù)賦給R4,整型占4個(gè)字節(jié)的存儲(chǔ)單元,所以將R0加4,指向源數(shù)組的第二個(gè)整數(shù),比較R4即源數(shù)組中取出的內(nèi)容是否為0,為0則表示所有內(nèi)容都已經(jīng)復(fù)制完成,跳出循環(huán)。若不為0則將R4的值放在R1指向的存儲(chǔ)單元中,并將R1的值加4,指向下一個(gè)存儲(chǔ)單元。循環(huán)上述過(guò)程直到數(shù)組中所有的整數(shù)都復(fù)制完成,此時(shí)R4指向的單元為0,跳出循環(huán),復(fù)制完成。

19、(四)字符串拷貝匯編文件 AREA ASMFILE1,CODE,READONLY EXPORT asm_strcpyasm_strcpyLOOP LDRB R4,R0,#1 ;將以R0的內(nèi)容為地址的存儲(chǔ)空間內(nèi)容送到R4, R0=R0+1 CMP R4,#0 ;比較R4和0 BEQ OVER ;若不相等則結(jié)束 STRB R4,R1,#1 ;將R4的內(nèi)容放回存儲(chǔ)單元 B LOOP ;循環(huán)OVER MOV PC,LR ;將連接寄存器的地址賦給PC,程序返回原任務(wù)執(zhí)行ENDC文件#include<stdio.h>extern void asm_strcpy(const char *src,

20、char *dest);int main() const char *a="hello!" /源字符串 char b10; /目的字符串 asm_strcpy(a,b); /調(diào)用函數(shù)復(fù)制 printf("copyed:%s",b); return 0;結(jié)果截圖:程序分析:該程序?yàn)镃語(yǔ)言調(diào)用匯編文件。R0的內(nèi)容為源字符串第一個(gè)字符在內(nèi)存中的地址,R1則指向目的字符串在內(nèi)存中的第一個(gè)存儲(chǔ)單元,調(diào)用匯編程序時(shí)將源字符串的第一個(gè)字符賦給R4,字符串中每個(gè)字符占1個(gè)字節(jié)的存儲(chǔ)單元,所以將R0加1,指向源字符串的第二個(gè)字符,比較R4即源字符串中取出的內(nèi)容是否為0,為

21、0則表示所有內(nèi)容都已經(jīng)復(fù)制完成,跳出循環(huán)。若不為0則將R4的值放在R1指向的存儲(chǔ)單元中,并將R1的值加1,指向下一個(gè)存儲(chǔ)單元。循環(huán)上述過(guò)程直到字符串中所有的字符都復(fù)制完成,此時(shí)R4指向的單元為0,跳出循環(huán),復(fù)制完成。四、實(shí)驗(yàn)總結(jié)通過(guò)本次實(shí)驗(yàn)學(xué)習(xí)了ARM匯編語(yǔ)言程序設(shè)計(jì)中常見(jiàn)的通用偽指令及匯編語(yǔ)言的基本語(yǔ)句格式和基本結(jié)構(gòu)等,同時(shí)掌握了C和匯編語(yǔ)言的混合編程的語(yǔ)法格式及應(yīng)用等。通過(guò)實(shí)驗(yàn),感到理論課上的不少知識(shí)所學(xué)甚淺,在實(shí)際運(yùn)用中會(huì)遇到一些意想不到的問(wèn)題。但是,通過(guò)進(jìn)一步學(xué)習(xí)與交流,我較好的完成了這次試驗(yàn)。這很好的補(bǔ)充了我在理論課上所學(xué)到的知識(shí),同時(shí)讓我有了很好的認(rèn)識(shí)。 由于我的水平有限

22、和實(shí)驗(yàn)的時(shí)間較為緊張,有些細(xì)節(jié)還是了解的十分不是十分詳細(xì),對(duì)于較為復(fù)雜的編程以及匯編的很多技巧任然知之甚少,希望能多一些這樣的實(shí)踐性的教學(xué)環(huán)節(jié),讓我們更好的了解書(shū)本中知識(shí)的應(yīng)用。實(shí)驗(yàn)一 ADS1.2集成開(kāi)發(fā)環(huán)境實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康暮腿蝿?wù)目的:(1) 了解 ADS 1.2 集成開(kāi)發(fā)環(huán)境的使用方法(2) 理解實(shí)驗(yàn)所提供的程序的匯編語(yǔ)句任務(wù):(1) 建立一個(gè)新的工程。(2) 建立一個(gè)C 源文件,并添加到工程中,讀懂程序代碼(3) 設(shè)置文本編輯器支持中文。(4) 設(shè)置編譯鏈接控制選項(xiàng)。(5) 編譯鏈接工程。(6) 調(diào)試工程并分析結(jié)果。2、 實(shí)驗(yàn)原理ARM ADS是ARM平臺(tái)集成開(kāi)發(fā)環(huán)境,它包括兩個(gè)部分,C

23、ode Warrior for ARM Developer Suit和AXD debugger,前者具有編輯,編譯,鏈接等功能并可生成二進(jìn)制文件(.bin)和可執(zhí)行的映像文件(.axf)以及各源文件的目標(biāo)代碼(.o);后者可以裝載映像文件或二進(jìn)制文件到ARM平臺(tái),并可實(shí)現(xiàn)跟蹤調(diào)試。三、程序代碼和分析Test2XEQU11; 定義X的值為11YEQU8; 定義Y的值為8BIT23EQU(1<<23); 定義BIT23的值為0x00800000AREAExample2,CODE,READONLY; 聲明代碼段Example2ENTRY; 標(biāo)識(shí)程序入口CODE32; 聲明32位ARM指令

24、START; 使用MOV、ADD指令實(shí)現(xiàn):R8 = R3 = X + YMOVR0,#X; R0 <= XMOVR1,#Y; R1 <= YADDR3,R0,R1; 即是R3 = X + YMOVR8,R3; R8 <= R3; 使用MVN、SUB指令實(shí)現(xiàn):R5 = 0x5FFFFFF8 - R8 * 8MVNR0,#0xA0000007; 0xA0000007的反碼為0x5FFFFFF8SUB R5,R0,R8,LSL #3; R8左移3位,結(jié)果即是 R8 * 8; 使用CMP指令判斷(5*Y/2)>(2*X)嗎?若大于則R5 = R5&0xFFFF0000,

25、否則R5 = R5|0x000000FFMOVR0,#YADDR0,R0,R0,LSL #2; 計(jì)算R0 = Y + 4*Y = 5*YMOVR0,R0,LSR #1; 計(jì)算R0 = 5*Y/2MOVR1,#XMOVR1,R1,LSL #1; 計(jì)算R1 = 2*XCMPR0,R1; 比較R0和R1,即(5*Y/2)和(2*X)進(jìn)行比較LDRHI R2,=0xFFFF0000; 若(5*Y/2)>(2*X),則R2 <= 0xFFFF0000ANDHIR5,R5,R2; 若(5*Y/2)>(2*X),則R5 = R5&R2ORRLSR5,R5,#0x000000FF;

26、若(5*Y/2)(2*X),則R5 = R5|0x000000FF; 使用TST指令測(cè)試R5的bit23是否為1,并將bit6位清零TST R5,#BIT23BICR5,R5,#0x00000040BSTARTENDTest3AREA TEST,CODE,READONLYENTRYCODE32;立即數(shù)尋址MOV R0,#0x1 ;立即數(shù)0x1存入寄存器R0ADD R0,R0,#0x4 ;寄存器R0中的內(nèi)容加上立即數(shù)0x4 然后存入寄存器R0;寄存器尋址MOV R1,#0x2 ;立即數(shù)0x2存入寄存器R1ADD R2,R1,R0 ;寄存器R0中的內(nèi)容和寄存器R1的內(nèi)容相加存入寄存器R2ADD R

27、2,R2,R0,LSL #1 ;寄存器R0中的內(nèi)容邏輯左移1位加上寄存器R2的內(nèi)容在存入寄存器R2;寄存器間接尋址MOV R1,#0x10 ;將立即數(shù)0x10存入寄存器R1STR R2,R1 ;將寄存器R2的內(nèi)容存入以寄存器R1的值為地址的存儲(chǔ)器中SWP R0,R0,R1 ;完成寄存器R1所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)與寄存器R0的內(nèi)容交換;基址變址尋址MOV R3,#0x14 ;將立即數(shù)0x14存入寄存器R3MOV R0,#0x3 ;將立即數(shù)0x3存入寄存器R0STR R0,R3 ;將寄存器R0的內(nèi)容存入寄存器R3所指向的存儲(chǔ)器LDR R4,R1,#4 ;將寄存器R1的內(nèi)容加上4所指向的存儲(chǔ)器的字

28、存入寄存器R4;多寄存器尋址LDMIA R1,R5,R6;相對(duì)尋址B NEXTNEXTNOPNOPNOPENDTest4:該程序完成將src為首地址的連續(xù)存儲(chǔ)空間里的10個(gè)整數(shù)復(fù)制到dst為首地址的連續(xù)20個(gè)存儲(chǔ)空間中的功能AREABlock,CODE,READONLY;定義代碼段numEQU10 ;定義num的值為10ENTRY startLDRR0,=src ;R0=src,R0存放原地址LDRR1,=dst ;R1=dst,R1存放目的地址MOVR2,#num ;R2=num=10存放循環(huán)次數(shù)blockcopyLDRR3,R0,#4 ;src指向的存儲(chǔ)單元里的整數(shù)加載到R3,src+4指

29、向下一個(gè)整數(shù)STRR3,R1,#4 ;R3里的整數(shù)復(fù)制到目的地址SUBSR2,R2,#1 ;R2=R2-1循環(huán)次數(shù)減一,并修改零志位BNEblockcopy ;R2不等于0,表示未復(fù)制完,則繼續(xù)循環(huán)B.AREABlockData,DATA,READWRITE ;數(shù)據(jù)段srcDCD 0,1,2,3,4,5,6,7,8,9 ;分配一片連續(xù)的字存儲(chǔ)單元,并初始化為0,1,2,3,4,5,6,7,8,9dstSPACE10*4 ;分配連續(xù)的10*4個(gè)存儲(chǔ)單元ENDTest5 數(shù)據(jù)塊的復(fù)制,用LDM和STM指令做塊拷貝AREABlock,CODE,READONLYnumEQU20 ;num=20,拷貝的

30、字?jǐn)?shù)ENTRYstartLDRR0,=src ;R0=srcLDRR1,=dst ;R1=dstMOVR2,#num ;R2=num=20 ,拷貝字?jǐn)?shù)MOVSP,#0x400 ;設(shè)置堆棧指針blockcopyMOVSR3,R2,LSR#3 ;求八個(gè)字的倍數(shù)BEQcopywords ;少于8個(gè)字傳送STMFDSP!,R4-R11 ;入棧,保存部分工作寄存器octcopyLDMIAR0!,R4-R11 ;從源裝入8個(gè)字STMIAR1!,R4-R11 ;存到目的塊SUBSR3,R3,#1 ;R3不為0,繼續(xù)拷貝BNEoctcopy LDMFDSP!,R4-R11 ;出棧,恢復(fù)原來(lái)的值copywordsANDSR2,R2,#7 ;少于8的字拷貝BEQstop ;沒(méi)有字需要拷貝wordcopyLDRR3,R0,#4 ;從源裝入塊STRR3,R1,#4 ;存到目的塊SUBSR2,R2,#1 ;計(jì)數(shù)器減一BNEwordcopy ;R2不為0,繼續(xù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論