在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM匯編指令學(xué)習(xí)(0) ARM 匯編語言程序格式

            ARM匯編指令學(xué)習(xí)(0) ARM 匯編語言程序格式

            作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            ARM匯編語言程序格式

            可執(zhí)行映象文件的格式:*.axm *.bin *.elf *.hex

            本文引用地址:http://www.biyoush.com/article/201611/317789.htm

            代碼段示例:

            匯編語言源程序的基本結(jié)構(gòu):

            AREA Init,CODE,READONLY

            ENTRY

            Start

            LDR R0,=0x3FF50000

            LDR R1,0xFF

            STR R1,[R0]

            LDR R0,=0x3FF5008

            LDR R1,0x01

            STR R1,[R0]

            END

            Arm體系結(jié)構(gòu)3種執(zhí)行流程:

            1順序執(zhí)行

            2跳轉(zhuǎn)執(zhí)行

            3異常中斷執(zhí)行

            Arm子程序調(diào)用使用命令BL子程序名稱

            子程序調(diào)用示例:

            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,LR

            ┉┉

            END

            C/C++及匯編語言的混合編程

            ARM集成開發(fā)環(huán)境中包含的C/C++編譯器。

            編譯器

            名稱

            編譯器

            種類

            源文件

            類型

            源文件

            后綴

            輸出目標(biāo)文件類型

            armcc

            C

            C

            *.C

            32位ARM代碼

            tcc

            C

            C

            *.C

            16位Thumb代碼

            armcpp

            C++

            C/C++

            *.C/*.C++

            32位ARM代碼

            tcpp

            C++

            C/C++

            *.C/*.C++

            16位Thumb代碼

            在CC++程序中使用內(nèi)嵌的匯編指令的語法格式:

            在ARM C語言程序中,使用關(guān)鍵字__asm來標(biāo)識一段匯

            編指令程序。

            __asm;2個下劃線

            {

            匯編語言程序

            ~~~~~~~~

            匯編語言程序

            }

            其中:如果一行中有多個匯編指令,指令之間使用分號(;)分開。

            在一條指令占多行,要使用續(xù)行符號().

            在C/C++程序中內(nèi)嵌匯編指令注意事項(xiàng):

            o必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標(biāo)志位.因?yàn)橛嬎銋R編代碼中的C表達(dá)式時,可能會使用這些物理寄存器,并會修改N,Z,C,V標(biāo)志位。

            __asm

            {

            MOV R0,x

            ADD y,R0,x/y //計算x/y時R0會被修改

            }

            在計算x/y時R0會被修改,從而影響R0+x/y的結(jié)果.用一個C程序的變量代替

            R0就可以解決這個問題:

            __asm

            {

            MOV var,x

            ADD y,var,x/y

            }

            內(nèi)嵌匯編器探測到隱含的寄存器沖突就會報錯.

            o不要使用寄存器代替變量.盡管有時寄存器明顯對應(yīng)某個變量,但也不能直接使用寄存器代替變量.

            int bad_f(int x) //x存放在R0中

            {

            __asm

            {

            ADD R0,R0,#1 //發(fā)生寄存器沖突,實(shí)際上x的值沒有變化

            }

            return(x);

            }

            盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對應(yīng)x,但這樣的代碼會使內(nèi)嵌匯編器認(rèn)為

            發(fā)生了寄存器沖突.用其他寄存器代替R0存放參數(shù)x,使得該函數(shù)將x原封不動地返回.

            這段代碼的正確寫法如下:

            int bad_f(intx)

            {

            __asm

            {

            ADD x,x,#1

            }

            return(x)

            }

            從匯編程序中訪問C程序變量

            在C程序中聲明的全局變量可以被匯編程序通過地址間接訪問。具體訪問方

            法如下:

            o使用IMPORT偽指令聲明這個全局變量。

            o使用LDR指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址存放在程序的數(shù)據(jù)緩沖池中。

            o根據(jù)該數(shù)據(jù)類型,使用相應(yīng)的LDR指令讀取該全局變量的值;使用相應(yīng)的STR指令修改該全局變量的值。

            AREAglobals,CODE,READONLY

            EXPORT asmsub

            IMPORTglovbvar;聲明外部變量glovbvar

            asmsub

            LDR R1,=glovbvar;裝載變量地址

            LDR R0,[R1];讀出數(shù)據(jù)

            ADD R0,R0,#1;加1操作

            STR R0,[R1];保存變量值

            MOV PC, LR

            END

            C程序與匯編程序互相調(diào)用規(guī)則

            寄存器的使用規(guī)則

            1. 子程序間通過寄存器R0~R3來傳遞參數(shù)。
            2. 在子程序中,使用寄存器R4~R11來保存局部變量。
            3. 寄存器R12用于子程序間scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出桟),記作IP。
            4. 寄存器R13用于數(shù)據(jù)棧指針,記作SP。寄存器SP在進(jìn)入子程序時的值和退出子程序時的值必須相等。
            5. 寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。
            6. 寄存器R15是程序計數(shù)器,記作PC

            *.axf(下載到sdram里面調(diào)試(AXD))

            ARM fromelf(轉(zhuǎn)化)---->*.bin*.elf*.hex*.i32燒寫到flash里面保存

            1.將映象文件(*.axf)下載到SDRAM內(nèi)調(diào)試,工具為JTAG板或者仿真器.

            RO BASE:設(shè)置SDRAM內(nèi)的地址,可以設(shè)置SDRAM的首地址,或者是靠近首

            地址值的地址值,RO BASE的值一定要按照字對齊.

            RW BASE:也可以不設(shè)置,如果要設(shè)置,RW BASE –RO BASE >映象文件的大下

            最好不設(shè)置,值一定要按照字對齊.

            2.將映象文件(*.bin *.hex)燒寫到nor flash內(nèi)

            RO BASE:設(shè)置flash首地址(0x00000000),值一定要按照字對齊.

            RW BASE:一定要設(shè)置,設(shè)置的地址值在SD RAM內(nèi),值一定要按照字對齊.

            IMAGE ENTRY POINT:可以不設(shè)置,如果設(shè)置就和RO BASE的值.

            PLACE AT BEGINNING OF IMAGE

            Object/Symbol:填寫映象文件中,第一個要執(zhí)行的源文件的目標(biāo)文件.

            (異常中斷的跳轉(zhuǎn)函數(shù))



            評論


            技術(shù)專區(qū)

            關(guān)閉