技術(shù)arm教程第4章程序設(shè)計(jì)基礎(chǔ)_第1頁
技術(shù)arm教程第4章程序設(shè)計(jì)基礎(chǔ)_第2頁
技術(shù)arm教程第4章程序設(shè)計(jì)基礎(chǔ)_第3頁
技術(shù)arm教程第4章程序設(shè)計(jì)基礎(chǔ)_第4頁
技術(shù)arm教程第4章程序設(shè)計(jì)基礎(chǔ)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

4ARMARMC/C++語言的程序設(shè)計(jì),以及兩者的混合編程。C/C++和匯編語言的混合編程等問題。ARMARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒ARM的匯編程序中,有如下幾種偽指令:符號定義偽指令、數(shù)據(jù)定義偽指令、匯編控制偽GBLA、GBLLGBLSLCLA、LCLLLCLS1GBLA、GBLLGBLA(GBLLGBLS)全局變量名GBLA、GBLLGBLSARMGBLA0;GBLLF(假);GBLS偽指令用于定義一個全局的字符串變量,并初始化為空; 2LCLA、LCLLLCLA(LCLLLCLS)LCLA0;LCLLF(假);LCLS偽指令用于定義一個局部的字符串變量,并初始化為空; ;一個局部的數(shù)字變量,變量名為 ;一個局部的邏輯變量,變量名為 3SETA、SETL變量 SETA(SETL或 表達(dá)SETA、SETL、SETSSETA偽指令用于給一個數(shù)學(xué)變量賦值;SETL偽指令用于給一個邏輯變量賦值;SETS偽指令用于給一個字符串變量賦值; ;一個局部的數(shù)字變量,變量名為;一個局部的邏輯變量,變量名為4名稱RLIST{寄存器列表RLISTARM指 中通過該名稱寄存器列表 用于分配一片連續(xù)的字節(jié)單元并用指定的數(shù)據(jù)初始化DCW(DCWU)用于分配一片連續(xù)的半字單元并用指定的數(shù)據(jù)初始化DCD(DCDU)用于分配一片連續(xù)的字單元并用指定的數(shù)據(jù)初始化DCFS(DCFSU)用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字單元并用指定的數(shù)據(jù)初DCQ(DCQU)用于分配一片以8字節(jié)為單位的連續(xù)的單元并用指定的數(shù)據(jù)初始 1標(biāo) 表達(dá)DCB偽指令用于分配一片連續(xù)的字節(jié)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)0~255的數(shù)字或字符串。DCB也可用“=”代替。StrDCB“Thisisatest!”;分配一片連續(xù)的字節(jié)單元并初始化2DCW(標(biāo) 表達(dá)用DCW分配的字單元是半字對齊的,而用DCWU分配的字單元并不嚴(yán)格半字對齊。 1,2,3;分配一片連續(xù)的半字單元并初始化3DCD(標(biāo) 表達(dá)其中,表達(dá)式可以為程序標(biāo)號或數(shù)字表達(dá)式。DCD也可用“&”代替。用DCD分配的字單元是字對齊的,而用DCDU分配的字單元并不嚴(yán)格字對齊。 4,5,6;分配一片連續(xù)的字單元并初始化4DCFD(標(biāo) DCFD(或DCFDU)表達(dá)用DCFD分配的字單元是字對齊的,而用DCFDU分配的字單元并不嚴(yán)格字對齊。 2E115,-5E7;分配一片連續(xù)的字單元并初始化為指定的雙精度數(shù)5DCFS(標(biāo) DCFS(或DCFSU)表達(dá)DCFS(或DCFSU)偽指令用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字單元并用偽指令中指用DCFS分配的字單元是字對齊的,而用DCFSU分配的字單元并不嚴(yán)格字對齊。 2E5,-5E-7;分配一片連續(xù)的字單元并初始化為指定的單精度數(shù)6DCQ標(biāo) 表達(dá)DCQ(或DCQU)偽指令用于分配一片以8個字節(jié)為單位的連續(xù)區(qū)域并用偽指令中指定的用DCQ分配的單元是字對齊的,而用DCQU分配的單元并不嚴(yán)格字對齊。 100;分配一片連續(xù)的單元并初始化為指定的值7標(biāo) SPACE表達(dá)SPACE偽指令用于分配一片連續(xù)的區(qū)域并初始化為0。其中,表達(dá)式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。 100;分配連續(xù)100字節(jié)的單元并初始化為08 表達(dá)式{,基址寄存器MAP偽指令用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用“^”MAPFIELD偽指令配合使用來定義結(jié)構(gòu)化的內(nèi)存表。 9標(biāo) 表達(dá)FIELD偽指令用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FILED也可用“#”代替。FIELDMAP偽指令配合使用來定義結(jié)構(gòu)化的內(nèi)存表。MAP偽指令定義內(nèi)存表的首。注意MAP和FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配單元。A;定義A16B;定義B32S;定義S256 IF、ELSE、ENDIFIF后面的邏IF1,否則繼續(xù)執(zhí)行后面的指令。IF、ELSE、ENDIF偽指令可以嵌套使用。GBLL ;一個全局的邏輯變量,變量名為 Test=2WHILE、 WHILE、WENDWHILE后WHILE、WEND偽指令可以嵌套使用。GBLA ;一個全局的數(shù)學(xué)變量,變量名為 CounterWHILECounter<3MACRO、 MACRO、MEND偽指令可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中包含在MACRO和MEND之間的指令序列稱為宏定義體,在宏定義體的第一行應(yīng)宏的原4MEXITCODE16、GET(1 段 AREA偽指令用于定義一個代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用“|”括屬性字段表示該代碼段(或數(shù)據(jù)段)DATAREADWRITEREADWRITEREADWRITEALIGNALIGN表達(dá)式。在默認(rèn)時,ELF(可執(zhí)行連接文件)的代碼段0~312表達(dá)式次方。COMMON屬性:該屬性定義一個通用的段,不包含任何的用戶代碼和數(shù)據(jù)。各源文件中同名的COMMON段共享同一段單元。AREA2 {表達(dá)式{,偏移量21、2、4、8、16等。若未指定表達(dá)式,則將當(dāng)前為:2的表達(dá)式次冪+偏移量。AREAInit,CODE,READONLY,ALIEN=38字節(jié)對齊。AREA 32ARM LDR 4可以有多個,當(dāng)有多個ENTRY時,程序的真正點(diǎn)由器指定),但在一個源文件里最多只ENTRY(可以沒有)。AREA ;指定應(yīng)用程序的5END偽指令用于通知編譯器已經(jīng)到了源程序的結(jié)尾。AREA 6名 表達(dá)式{,類型EQU可用“*”代替。 EQU EQU 7EXPORT( 標(biāo)號EXPORT偽指令用于在程序中一個全局的標(biāo)號,該標(biāo)號可在其他的文件中。EXPORT。AREA ;一個可全局的標(biāo)號8 標(biāo)號IMPORT偽指令用于通知編譯器要使用的標(biāo)號在其他的源文件中定義,但要在當(dāng)前源文件中引NOP操作。AREA 9 EXTERN偽指令用于通知編譯器要使用的標(biāo)號在其他的源文件中定義,但要在當(dāng)前源文件中引NOP操作。AREA 10 GET(或 GET偽指令用于將一個源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯INCLUDEGET。FIELDGET偽指令將這個源文件包含到其他的源文件中。使用C語言中的“include”相似。AREA ;通知編譯器當(dāng)前源文件包含源文件C:\11 INCBINAREA ;通知編譯器當(dāng)前源文件包含文件a1.dat ;通知編譯器當(dāng)前源文件包含文件C:\a2.txt12 名 表達(dá)RN偽指令用于給一個寄存器定義一個別名。采用這種方式可以方便程序員該寄存器的功 R013 {名稱 ROUT偽指令用于給一個局部變量定義作用范圍。在程序中未使用該偽指令時,局部變量的作AREAROUTROUTROUT之{標(biāo)號 {指令或偽指令 {;注釋在匯編語言程序設(shè)計(jì)中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不用一盡管符號名由編程者決定,但并不是任意的,必須遵循以下的約定:123程序中的變量可通過代換操作取得一個常量。代換操作符為“$ “Thisisa S2“Thisisa1“+”、“-”、“×”、“/MOD XY XY XY XY XYXY 表示將X循環(huán)左移Y位。 表示將X循環(huán)右移Y位。 表示將X左移Y位。 表示將X右移Y位。XY XY XY Y XY2“=”、“>”、“<”、“>=”、“<=”、“/=<>XYX XYX XYX XYX XYX XYX XYX XYXY XY XY Y XY3512字節(jié)。常用的與字符串表達(dá)式相關(guān)的運(yùn)算符如下:LENCHRSTRSTR運(yùn)算符將將一個數(shù)字表達(dá)式或邏輯表達(dá)式轉(zhuǎn)換為一個字符串。對于數(shù)字表達(dá)式,STR運(yùn)算其中,XLEFT其中:X為源字符串,YRIGHTLEFT運(yùn)算符相對應(yīng),RIGHT其中:X為源字符串,YCCCC其中:X1,Y2,CCYXBASEBASE其中,XINDEXINDEX其中,X5XDEFDEFXAREAInit,CODE,READONLY LR中,同時將程序計(jì)數(shù)器PC指向子程序的點(diǎn),當(dāng)子程序執(zhí)行完畢需要返回調(diào)用處時,只需要將存放在LR中的返PC即可。在調(diào)用子程序的同時,也可以完成參數(shù)的傳遞和從子程序R0~R3完成。BLAREAInit,CODE,READONLY S3C4510BS3C4510B的串行通訊的工作原理,可以參;Instituteof Academyof ThisexampleshowstheUART EQU0x3FFD000UARTCONT0EQU0x3FFD004UARTSTAT0EQU0x3FFD008UTXBUF0EQU0x3FFD00CUARTBRD0EQUAREAInit,CODE,READONLY;LED LDRR1,=0x3FF5000LDRR0,=&ffSTRLDRR1,=0x3FF5008LDRR0,=&ffSTR;UART0linecontrolLDRR1,=UARTLCON0LDRR0,=0x03STRR0,[R1];UART0controlLDRR1,=UARTCONT0LDRR0,=0x9STR;UART0baudratedivisorLDRR1,=UARTBRD0LDRR0,=0x500STRR0,[R1];PrinttheLDRBLPrintLineLDRBLPrintLineLDRBLPrintLineLDRBLPrintLineLDRR1,=0x7FFFFF BNELOOP1 ;PrintMOVR4,LRMOV ANDR0,R1,#&FFTSTR0,#&FF BLPutByte LDRR3,=UARTSTAT0LDRR2,[R3]TSTBEQLDRR3,=UTXBUF0STRR0,[R3]MOV DCB&A,&D," AcademyofSciences,Instituteof plexSystem DCB&A,&D," ARMDevelopmentBoardBasedonSamsungARMS3C4510B.",0 C/C++完成。匯編程序、C/C++程序間的相用頻繁的相用,因此,整個程序的結(jié)構(gòu)顯得相對簡單,容易理解。以下是一個這種結(jié)構(gòu)程序的基;Instituteof Academyof;File IMPORTMain ;定義程序的LDR LDRR1,=0xE7FFFF80STRR1,[R0]LDR BL Instituteof AcademyofFile

溫馨提示

  • 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

提交評論