新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編指令學習(0) ARM 匯編語言程序格式

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

        作者: 時間:2016-11-09 來源:網絡 收藏
        ARM匯編語言程序格式

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

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

        代碼段示例:

        匯編語言源程序的基本結構:

        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體系結構3種執行流程:

        1順序執行

        2跳轉執行

        3異常中斷執行

        Arm子程序調用使用命令BL子程序名稱

        子程序調用示例:

        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集成開發環境中包含的C/C++編譯器。

        編譯器

        名稱

        編譯器

        種類

        源文件

        類型

        源文件

        后綴

        輸出目標文件類型

        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++程序中使用內嵌的匯編指令的語法格式:

        在ARM C語言程序中,使用關鍵字__asm來標識一段匯

        編指令程序。

        __asm;2個下劃線

        {

        匯編語言程序

        ~~~~~~~~

        匯編語言程序

        }

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

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

        在C/C++程序中內嵌匯編指令注意事項:

        o必須小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V標志位.因為計算匯編代碼中的C表達式時,可能會使用這些物理寄存器,并會修改N,Z,C,V標志位。

        __asm

        {

        MOV R0,x

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

        }

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

        R0就可以解決這個問題:

        __asm

        {

        MOV var,x

        ADD y,var,x/y

        }

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

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

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

        {

        __asm

        {

        ADD R0,R0,#1 //發生寄存器沖突,實際上x的值沒有變化

        }

        return(x);

        }

        盡管根據編譯器的編譯規則似乎可以確定R0對應x,但這樣的代碼會使內嵌匯編器認為

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

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

        int bad_f(intx)

        {

        __asm

        {

        ADD x,x,#1

        }

        return(x)

        }

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

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

        法如下:

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

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

        o根據該數據類型,使用相應的LDR指令讀取該全局變量的值;使用相應的STR指令修改該全局變量的值。

        AREAglobals,CODE,READONLY

        EXPORT asmsub

        IMPORTglovbvar;聲明外部變量glovbvar

        asmsub

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

        LDR R0,[R1];讀出數據

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

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

        MOV PC, LR

        END

        C程序與匯編程序互相調用規則

        寄存器的使用規則

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

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

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

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

        RO BASE:設置SDRAM內的地址,可以設置SDRAM的首地址,或者是靠近首

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

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

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

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

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

        RW BASE:一定要設置,設置的地址值在SD RAM內,值一定要按照字對齊.

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

        PLACE AT BEGINNING OF IMAGE

        Object/Symbol:填寫映象文件中,第一個要執行的源文件的目標文件.

        (異常中斷的跳轉函數)



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 闻喜县| 花莲县| 临江市| 平阳县| 邵东县| 汨罗市| 西充县| 河源市| 咸丰县| 荆州市| 枣庄市| 东丰县| 达尔| 康马县| 甘孜县| 金坛市| 涿鹿县| 保康县| 太保市| 枣阳市| 格尔木市| 彭泽县| 顺平县| 绥芬河市| 蒲城县| 台东县| 梅河口市| 紫阳县| 元朗区| 故城县| 红桥区| 固镇县| 沂水县| 肥城市| 芦山县| 四会市| 岳阳市| 青浦区| 绥化市| 富川| 丹巴县|