在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM程序設(shè)計(jì)基礎(chǔ)

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

            作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò) 收藏

            RSB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            RSB指令稱(chēng)為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。

            RSC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。

            AND{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            OR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            EOR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            EOR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。

            BIC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2

            BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。

            nMUL 32位乘法指令

            nMLA 32位乘加指令

            nSMULL 64位有符號(hào)數(shù)乘法指令

            nSMLAL 64位有符號(hào)數(shù)乘加指令

            nUMULL 64位無(wú)符號(hào)數(shù)乘法指令

            nUMLAL 64位無(wú)符號(hào)數(shù)乘加指令

            ASR n 算術(shù)右移n位(1<=n<=32)

            LSL n 邏輯左移n位(1<=n<=32)

            LSR n 邏輯右移n位(1<=n<=32)

            ROR n 循環(huán)右移n位(1<=n<=32)

            RRX 帶擴(kuò)展的循環(huán)右移1位

            3程序狀態(tài)寄存器處理指令

            ARM微處理器支持程序狀態(tài)寄存器訪問(wèn)指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。

            nMRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令

            nMSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令

            4程序狀態(tài)寄存器處理指令

            加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則完成相反的操作。

            nLDR 字?jǐn)?shù)據(jù)加載指令

            nLDRB 字節(jié)數(shù)據(jù)加載指令

            nLDRH 半字?jǐn)?shù)據(jù)加載指令

            nSTR 字?jǐn)?shù)據(jù)存儲(chǔ)指令

            nSTRB 字節(jié)數(shù)據(jù)存儲(chǔ)指令

            nSTRH 半字?jǐn)?shù)據(jù)存儲(chǔ)指令

            nLDM 批量數(shù)據(jù)加載指令

            nSTM 批量數(shù)據(jù)存儲(chǔ)指令

            4批量數(shù)據(jù)加載/存儲(chǔ)指令

            ARM微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。

            nLDM 批量數(shù)據(jù)加載指令

            nSTM 批量數(shù)據(jù)存儲(chǔ)指令

            ARM微處理器所支持的數(shù)據(jù)交換指令能在存儲(chǔ)器和寄存器之間交換數(shù)據(jù)。

            nSWP 字?jǐn)?shù)據(jù)交換指令

            nSWPB 字節(jié)數(shù)據(jù)交換指令

            5協(xié)處理器指令

            nCDP 協(xié)處理器數(shù)操作指令

            nLDC 協(xié)處理器數(shù)據(jù)加載指令

            nSTC 協(xié)處理器數(shù)據(jù)存儲(chǔ)指令

            nMCR 寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令

            nMRC 協(xié)處理器寄存器到寄存器的數(shù)據(jù)傳送指令

            異常產(chǎn)生指令

            nSWI 軟件中斷指令

            nBKPT 斷點(diǎn)中斷指令

            3匯編語(yǔ)言的語(yǔ)句格式

            ARM(Thumb)匯編語(yǔ)言的語(yǔ)句格式為:

            {標(biāo)號(hào)} {指令或偽指令} {;注釋}

            在匯編語(yǔ)言程序設(shè)計(jì)中,每一條指令的助記符可以全部用大寫(xiě)、或全部用小寫(xiě),但不用許在一條指令中大、小寫(xiě)混用。

            同時(shí),如果一條語(yǔ)句太長(zhǎng),可將該長(zhǎng)語(yǔ)句分為若干行來(lái)書(shū)寫(xiě),在行的末尾用“”表示下一行與本行為同一條語(yǔ)句。

            3.1 在匯編語(yǔ)言程序中常用的符號(hào)

            在匯編語(yǔ)言程序設(shè)計(jì)中,經(jīng)常使用各種符號(hào)代替地址、變量和常量等,以增加程序的可讀性。盡管符號(hào)的命名由編程者決定,但并不是任意的,必須遵循以下的約定:

            — 符號(hào)區(qū)分大小寫(xiě),同名的大、小寫(xiě)符號(hào)會(huì)被編譯器認(rèn)為是兩個(gè)不同的符號(hào)。

            — 符號(hào)在其作用范圍內(nèi)必須唯一。

            — 自定義的符號(hào)名不能與系統(tǒng)的保留字相同。

            — 符號(hào)名不應(yīng)與指令或偽指令同名。

            1、 程序中的變量

            程序中的變量是指其值在程序的運(yùn)行過(guò)程中可以改變的量。ARM(Thumb)匯編程序所支持的變量有數(shù)字變量、邏輯變量和字符串變量。

            數(shù)字變量用于在程序的運(yùn)行中保存數(shù)字值,但注意數(shù)字值的大小不應(yīng)超出數(shù)字變量所能表示的范圍。

            邏輯變量用于在程序的運(yùn)行中保存邏輯值,邏輯值只有兩種取值情況:真或假。

            字符串變量用于在程序的運(yùn)行中保存一個(gè)字符串,但注意字符串的長(zhǎng)度不應(yīng)超出字符串變量所能表示的范圍。

            在ARM(Thumb)匯編語(yǔ)言程序設(shè)計(jì)中,可使用GBLA、GBLL、GBLS偽指令聲明全局變量,使用LCLA、LCLL、LCLS偽指令聲明局部變量,并可使用SETA、SETL和SETS對(duì)其進(jìn)行初始化。

            2、 程序中的常量

            程序中的常量是指其值在程序的運(yùn)行過(guò)程中不能被改變的量。ARM(Thumb)匯編程序所支持的常量有數(shù)字常量、邏輯常量和字符串常量。

            數(shù)字常量一般為32位的整數(shù),當(dāng)作為無(wú)符號(hào)數(shù)時(shí),其取值范圍為0~232-1,當(dāng)作為有符號(hào)數(shù)時(shí),其取值范圍為-231~231-1。

            邏輯常量只有兩種取值情況:真或假。

            字符串常量為一個(gè)固定的字符串,一般用于程序運(yùn)行時(shí)的信息提示。

            3、 程序中的變量代換

            程序中的變量可通過(guò)代換操作取得一個(gè)常量。代換操作符為“$”。

            如果在數(shù)字變量前面有一個(gè)代換操作符“$”,編譯器會(huì)將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符串,并將該十六進(jìn)制的字符串代換“$”后的數(shù)字變量。

            如果在邏輯變量前面有一個(gè)代換操作符“$”,編譯器會(huì)將該邏輯變量代換為它的取值(真或假)。

            如果在字符串變量前面有一個(gè)代換操作符“$”,編譯器會(huì)將該字符串變量的值代換“$”后的字符串變量。

            使用示例:

            LCLS S1 ;定義局部字符串變量S1和S2

            LCLS S2

            S1 SETS “Test!”

            S2 SETS “This is a $S1” ;字符串變量S2的值為“This is a Test!”

            3.2 匯編語(yǔ)言程序中的表達(dá)式和運(yùn)算符

            在匯編語(yǔ)言程序設(shè)計(jì)中,也經(jīng)常使用各種表達(dá)式,表達(dá)式一般由變量、常量、運(yùn)算符和括號(hào)構(gòu)成。常用的表達(dá)式有數(shù)字表達(dá)式、邏輯表達(dá)式和字符串表達(dá)式,其運(yùn)算次序遵循如下的優(yōu)先級(jí):

            — 優(yōu)先級(jí)相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接摇?p>— 相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,且單目運(yùn)算符的優(yōu)先級(jí)高于其他運(yùn)算符。

            — 括號(hào)運(yùn)算符的優(yōu)先級(jí)最高。

            1、 數(shù)字表達(dá)式及運(yùn)算符

            數(shù)字表達(dá)式一般由數(shù)字常量、數(shù)字變量、數(shù)字運(yùn)算符和括號(hào)構(gòu)成。與數(shù)字表達(dá)式相關(guān)的運(yùn)算符如下:

            — “+”、“-”、“×”、“/” 及“MOD”算術(shù)運(yùn)算符

            以上的算術(shù)運(yùn)算符分別代表加、減、乘、除和取余數(shù)運(yùn)算。例如,以X和Y表示兩個(gè)數(shù)字表達(dá)式,則:

            X+Y 表示X與Y的和。

            X-Y 表示X與Y的差。

            X×Y 表示X與Y的乘積。

            X/Y 表示X除以Y的商。

            X:MOD:Y 表示X除以Y的余數(shù)。

            — “ROL”、“ROR”、“SHL”及“SHR”移位運(yùn)算符

            以X和Y表示兩個(gè)數(shù)字表達(dá)式,以上的移位運(yùn)算符代表的運(yùn)算如下:

            X:ROL:Y 表示將X循環(huán)左移Y位。

            X:ROR:Y 表示將X循環(huán)右移Y位。

            X:SHL:Y 表示將X左移Y位。

            X:SHR:Y 表示將X右移Y位。

            — “AND”、“OR”、“NOT”及“EOR”按位邏輯運(yùn)算符

            以X和Y表示兩個(gè)數(shù)字表達(dá)式,以上的按位邏輯運(yùn)算符代表的運(yùn)算如下:

            X:AND:Y 表示將X和Y按位作邏輯與的操作。

            X:OR:Y 表示將X和Y按位作邏輯或的操作。

            :NOT:Y 表示將Y按位作邏輯非的操作。

            X:EOR:Y 表示將X和Y按位作邏輯異或的操作。

            2、 邏輯表達(dá)式及運(yùn)算符

            邏輯表達(dá)式一般由邏輯量、邏輯運(yùn)算符和括號(hào)構(gòu)成,其表達(dá)式的運(yùn)算結(jié)果為真或假。與邏輯表達(dá)式相關(guān)的運(yùn)算符如下:

            — “=”、“>”、“<”、“>=”、“<= ”、“/=”、“ <>” 運(yùn)算符

            以X和Y表示兩個(gè)邏輯表達(dá)式,以上的運(yùn)算符代表的運(yùn)算如下:

            X = Y 表示X等于Y。

            X > Y 表示X大于Y。

            X < Y 表示X小于Y。

            X >= Y 表示X大于等于Y。

            X <= Y 表示X小于等于Y。

            X /= Y 表示X不等于Y。

            X <> Y 表示X不等于Y。

            — “LAND”、“LOR”、“LNOT”及“LEOR”運(yùn)算符

            以X和Y表示兩個(gè)邏輯表達(dá)式,以上的邏輯運(yùn)算符代表的運(yùn)算如下:

            X:LAND:Y 表示將X和Y 作邏輯與的操作。

            X:LOR:Y 表示將X和Y作邏輯或的操作。

            :LNOT:Y 表示將Y作邏輯非的操作。

            X:LEOR:Y 表示將X和Y作邏輯異或的操作。

            3、 字符串表達(dá)式及運(yùn)算符

            字符串表達(dá)式一般由字符串常量、字符串變量、運(yùn)算符和括號(hào)構(gòu)成。編譯器所支持的字符串最大長(zhǎng)度為512字節(jié)。常用的與字符串表達(dá)式相關(guān)的運(yùn)算符如下:

            — LEN運(yùn)算符

            LEN運(yùn)算符返回字符串的長(zhǎng)度(字符數(shù)),以X表示字符串表達(dá)式,其語(yǔ)法格式如下:

            :LEN:X

            — CHR運(yùn)算符

            CHR運(yùn)算符將0~255之間的整數(shù)轉(zhuǎn)換為一個(gè)字符,以M表示某一個(gè)整數(shù),其語(yǔ)法格式如下:

            :CHR:M

            — STR運(yùn)算符

            STR運(yùn)算符將將一個(gè)數(shù)字表達(dá)式或邏輯表達(dá)式轉(zhuǎn)換為一個(gè)字符串。對(duì)于數(shù)字表達(dá)式,STR運(yùn)算符將其轉(zhuǎn)換為一個(gè)以十六進(jìn)制組成的字符串;對(duì)于邏輯表達(dá)式,STR運(yùn)算符將其轉(zhuǎn)換為字符串T或F,其語(yǔ)法格式如下:

            :STR:X

            其中,X為一個(gè)數(shù)字表達(dá)式或邏輯表達(dá)式。

            — LEFT運(yùn)算符

            LEFT運(yùn)算符返回某個(gè)字符串左端的一個(gè)子串,其語(yǔ)法格式如下:

            X:LEFT:Y

            其中:X為源字符串,Y為一個(gè)整數(shù),表示要返回的字符個(gè)數(shù)。

            — RIGHT運(yùn)算符

            與LEFT運(yùn)算符相對(duì)應(yīng),RIGHT運(yùn)算符返回某個(gè)字符串右端的一個(gè)子串,其語(yǔ)法格式如下:

            X:RIGHT:Y

            其中:X為源字符串,Y為一個(gè)整數(shù),表示要返回的字符個(gè)數(shù)。

            — CC運(yùn)算符

            CC運(yùn)算符用于將兩個(gè)字符串連接成一個(gè)字符串,其語(yǔ)法格式如下:

            X:CC:Y

            其中:X為源字符串1,Y為源字符串2,CC運(yùn)算符將Y連接到X的后面。

            4、 與寄存器和程序計(jì)數(shù)器(PC)相關(guān)的表達(dá)式及運(yùn)算符

            常用的與寄存器和程序計(jì)數(shù)器(PC)相關(guān)的表達(dá)式及運(yùn)算符如下:

            — BASE運(yùn)算符

            BASE運(yùn)算符返回基于寄存器的表達(dá)式中寄存器的編號(hào),其語(yǔ)法格式如下:

            :BASE:X

            其中,X為與寄存器相關(guān)的表達(dá)式。

            — INDEX運(yùn)算符

            INDEX運(yùn)算符返回基于寄存器的表達(dá)式中相對(duì)于其基址寄存器的偏移量,其語(yǔ)法格式如下:

            :INDEX:X

            其中,X為與寄存器相關(guān)的表達(dá)式。

            5、 其他常用運(yùn)算符

            — ?運(yùn)算符

            ?運(yùn)算符返回某代碼行所生成的可執(zhí)行代碼的長(zhǎng)度,例如:

            ?X

            返回定義符號(hào)X的代碼行所生成的可執(zhí)行代碼的字節(jié)數(shù)。

            — DEF運(yùn)算符

            DEF運(yùn)算符判斷是否定義某個(gè)符號(hào),例如:

            :DEF:X

            如果符號(hào)X已經(jīng)定義,則結(jié)果為真,否則為假。

            4匯編語(yǔ)言的程序結(jié)構(gòu)

            4.1 匯編語(yǔ)言的程序結(jié)構(gòu)

            在ARM(Thumb)匯編語(yǔ)言程序中,以程序段為單位組織代碼。段是相對(duì)獨(dú)立的指令或數(shù)據(jù)序列,具有特定的名稱(chēng)。段可以分為代碼段和數(shù)據(jù)段,代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,當(dāng)程序較長(zhǎng)時(shí),可以分割為多個(gè)代碼段和數(shù)據(jù)段,多個(gè)段在程序編譯鏈接時(shí)最終形成一個(gè)可執(zhí)行的映象文件。

            可執(zhí)行映象文件通常由以下幾部分構(gòu)成:

            — 一個(gè)或多個(gè)代碼段,代碼段的屬性為只讀。

            — 零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫(xiě)。

            — 零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫(xiě)。

            鏈接器根據(jù)系統(tǒng)默認(rèn)或用戶(hù)設(shè)定的規(guī)則,將各個(gè)段安排在存儲(chǔ)器中的相應(yīng)位置。因此源程序中段之間的相對(duì)位置與可執(zhí)行的映象文件中段的相對(duì)位置一般不會(huì)相同。

            以下是一個(gè)匯編語(yǔ)言源程序的基本結(jié)構(gòu):

            AREA Init,CODE,READONLY

            ENTRY

            Start

            LDR R0,=0x3FF5000

            LDR R1,0xFF

            STR R1,[R0]

            LDR R0,=0x3FF5008

            LDR R1,0x01

            STR R1,[R0]

            ┉┉

            END

            在匯編語(yǔ)言程序中,用AREA偽指令定義一個(gè)段,并說(shuō)明所定義段的相關(guān)屬性,本例定義一個(gè)名為Init的代碼段,屬性為只讀。ENTRY偽指令標(biāo)識(shí)程序的入口點(diǎn),接下來(lái)為指令序列,程序的末尾為END偽指令,該偽指令告訴編譯器源文件的結(jié)束,每一個(gè)匯編程序段都必須有一條END偽指令,指示代碼段的結(jié)束。

            4.2 匯編語(yǔ)言的子程序調(diào)用

            在ARM匯編語(yǔ)言程序中,子程序的調(diào)用一般是通過(guò)BL指令來(lái)實(shí)現(xiàn)的。在程序中,使用指令:BL 子程序名

            即可完成子程序的調(diào)用。

            該指令在執(zhí)行時(shí)完成如下操作:將子程序的返回地址存放在連接寄存器LR中,同時(shí)將程序計(jì)數(shù)器PC指向子程序的入口點(diǎn),當(dāng)子程序執(zhí)行完畢需要返回調(diào)用處時(shí),只需要將存放在LR中的返回地址重新拷貝給程序計(jì)數(shù)器PC即可。在調(diào)用子程序的同時(shí),也可以完成參數(shù)的傳遞和從子程序返回運(yùn)算的結(jié)果,通常可以使用寄存器R0~R3完成。

            以下是使用BL指令調(diào)用子程序的匯編語(yǔ)言源程序的基本結(jié)構(gòu):

            AREA Init,CODE,READONLY

            ENTRY

            Start

            LDR R0,=0x3FF5000

            LDR R1,0xFF

            STR R1,[R0]

            LDR R0,=0x3FF5008

            LDR R1,0x01

            STR R1,[R0]

            BL PRINT_TEXT

            ┉┉

            PRINT_TEXT

            ┉┉

            MOV PC,BL

            ┉┉

            END

            4.3 匯編語(yǔ)言程序示例

            以下是一個(gè)基于S3C4510B的串行通訊程序,關(guān)于S3C4510B的串行通訊的工作原理,可以參考第六章的相關(guān)內(nèi)容,在此僅向讀者說(shuō)明一個(gè)完整匯編語(yǔ)言程序的基本結(jié)構(gòu):

            ;********************************************************************************

            ; Instituteof Automation,Chinese Academyof Sciences

            ;Description: This example shows the UART communication!

            ;Author: JuGuang,Lee

            ;Date:

            ;********************************************************************************

            UARTLCON0 EQU 0x3FFD000

            UARTCONT0 EQU 0x3FFD004

            UARTSTAT0 EQU 0x3FFD008

            UTXBUF0 EQU 0x3FFD00C

            UARTBRD0 EQU 0x3FFD014

            AREAInit,CODE,READONLY

            ENTRY

            ;**************************************************

            ;LED Display

            ;**************************************************

            LDR R1,=0x3FF5000

            LDR R0,=&ff

            STR R0,[R1]

            LDR R1,=0x3FF5008

            LDR R0,=&ff

            STR R0,[R1]

            ;*************************************************

            ;UART0 line controlregister

            ;*************************************************

            LDR R1,=UARTLCON0

            LDR R0,=0x03

            STR R0,[R1]

            ;**************************************************

            ;UART0 control regiser

            ;**************************************************

            LDR R1,=UARTCONT0

            LDR R0,=0x9

            STR R0,[R1]

            ;**************************************************

            ;UART0 baud rate divisorregiser

            ;Baudrate=19200,對(duì)應(yīng)于50MHz的系統(tǒng)工作頻率

            ;***************************************************

            LDR R1,=UARTBRD0

            LDR R0,=0x500

            STR R0,[R1]

            ;***************************************************

            ;Print the messages!

            ;***************************************************

            LOOP

            LDR R0,=Line1

            BL PrintLine

            LDR R0,=Line2

            BL PrintLine

            LDR R0,=Line3

            BL PrintLine

            LDR R0,=Line4

            BL PrintLine

            LDR R1,=0x7FFFFF

            LOOP1

            SUBS R1,R1,#1

            BNE LOOP1

            B LOOP

            ;***************************************************

            ;Print line

            ;***************************************************

            PrintLine

            MOV R4,LR

            MOV R5,R0

            Line

            LDRB R1,[R5],#1

            AND R0,R1,#&FF

            TST R0,#&FF

            MOVEQ PC,R4

            BL PutByte

            B Line

            PutByte

            LDR R3,=UARTSTAT0

            LDR R2,[R3]

            TST R2,#&40

            BEQ PutByte

            LDR R3,=UTXBUF0

            STR R0,[R3]

            MOV PC,LR

            Line1 DCB &A,&D,"******************************************************************",0

            Line2 DCB &A,&D,"ChineseAcademy of Sciences,Institute of Automation,Complex System Lab.",0

            Line3 DCB &A,&D," ARM Development Board Based on SamsungARM S3C4510B.",0

            Line4 DCB &A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,&A,&D,0

            END

            4.4 匯編語(yǔ)言與C/C++的混合編程

            在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均用匯編語(yǔ)言來(lái)完成,其工作量是可想而知的,同時(shí),不利于系統(tǒng)升級(jí)或應(yīng)用軟件移植,事實(shí)上,ARM體系結(jié)構(gòu)支持C/C+以及與匯編語(yǔ)言的混合編程,在一個(gè)完整的程序設(shè)計(jì)的中,除了初始化部分用匯編語(yǔ)言完成以外,其主要的編程任務(wù)一般都用C/C++ 完成。

            匯編語(yǔ)言與C/C++的混合編程通常有以下幾種方式:

            - 在C/C++代碼中嵌入?yún)R編指令。

            - 在匯編程序和C/C++的程序之間進(jìn)行變量的互訪。

            - 匯編程序、C/C++程序間的相互調(diào)用。

            在以上的幾種混合編程技術(shù)中,必須遵守一定的調(diào)用規(guī)則,如物理寄存器的使用、參數(shù)的傳遞等,這對(duì)于初學(xué)者來(lái)說(shuō),無(wú)疑顯得過(guò)于煩瑣。在實(shí)際的編程應(yīng)用中,使用較多的方式是:程序的初始化部分用匯編語(yǔ)言完成,然后用C/C++完成主要的編程任務(wù),程序在執(zhí)行時(shí)首先完成初始化過(guò)程,然后跳轉(zhuǎn)到C/C++程序代碼中,匯編程序和C/C++程序之間一般沒(méi)有參數(shù)的傳遞,也沒(méi)有頻繁的相互調(diào)用,因此,整個(gè)程序的結(jié)構(gòu)顯得相對(duì)簡(jiǎn)單,容易理解。以下是一個(gè)這種結(jié)構(gòu)程序的基本示例,該程序基于第五、六章所描述的硬件平臺(tái):

            ;*************************************************************************

            ; Instituteof Automation, Chinese Academyof Sciences

            ;File Name: Init.s

            ;Description:

            ;Author: JuGuang,Lee

            ;Date:

            ;************************************************************************

            IMPORTMain ;通知編譯器該標(biāo)號(hào)為一個(gè)外部標(biāo)號(hào)

            AREA Init,CODE,READONLY ;定義一個(gè)代碼段

            ENTRY ;定義程序的入口點(diǎn)

            LDR R0,=0x3FF0000 ;初始化系統(tǒng)配置寄存器,具體內(nèi)容可參考第五、六章

            LDR R1,=0xE7FFFF80

            STR R1,[R0]

            LDR SP,=0x3FE1000 ;初始化用戶(hù)堆棧,具體內(nèi)容可參考第五、六章

            BL Main ;跳轉(zhuǎn)到Main()函數(shù)處的C/C++代碼執(zhí)行

            END ;標(biāo)識(shí)匯編程序的結(jié)束

            以上的程序段完成一些簡(jiǎn)單的初始化,然后跳轉(zhuǎn)到Main()函數(shù)所標(biāo)識(shí)的C/C++代碼處執(zhí)行主要的任務(wù),此處的Main僅為一個(gè)標(biāo)號(hào),也可使用其他名稱(chēng),與C語(yǔ)言程序中的main()函數(shù)沒(méi)有關(guān)系。

            /*******************************************************************************

            * Instituteof Automation, Chinese Academyof Sciences

            * File Name: main.c

            * Description: P0,P1LED flash.

            * Author: JuGuang,Lee

            * Date:

            ******************************************************************************/

            void Main(void)

            {

            inti;

            *((volatile unsigned long *) 0x3ff5000) = 0x0000000f;

            while(1)

            {

            *((volatile unsignedlong *) 0x3ff5008) = 0x00000001;

            for(i=0;i<0x7fFFF; i++);

            *((volatileunsigned long *) 0x3ff5008) = 0x00000002;

            for(i=0;i<0x7FFFF; i++);

            }

            }


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: ARM程序設(shè)計(jì)基

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉