新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編程序基本知識

        ARM匯編程序基本知識

        作者: 時間:2016-11-28 來源:網絡 收藏

        1.匯編程序的基本組成

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

        ARM匯編語言程序中,程序是以程序段為單位組織代碼的。段是相對獨立的指令或者代碼序列,擁有特定的名稱。段的種類有代碼段、數據段和通用段,代碼段的內容為執行代碼,數據段存放代碼運行時需要用到的數據,通用段不包含用戶代碼和數據,所有通用段共用一個空間。段使用AREA偽操作來定義,并且說明相關屬性,如

        代碼段定義

        AREA Init, CODE, READONLY

        數據段定義

        AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3

        ……

        一個匯編程序至少應該有一個代碼段,可以有零或者多個數據段。在格式上,一個匯編程序需要至少有一個ENTRY(關于ENTRY具體內容看偽操作符ENTRY),還需要在匯編源文件結束處,寫上END表示該源文件的結束。

        如一個基本的匯編源程序

        AREA Init, CODE, READONLY ;定義一個代碼段

        ENTRY ;標記程序入口點

        StartLDR R0,0x3FF5000 ;標號Start可以要,也可以不要

        LDR R1,0Xff

        STR R1,[R0]

        LDR R0,=0x3FF5000

        LDR R1,0x01

        STR R1,[R0]

        ……

        END ;END偽操作表示本源文件結束

        當匯編程序較長時,可以分割為多個代碼段和多個數據段,多個段在程序編譯鏈接時,最終形成一個可執行的映像文件。一個可執行映像文件通常由以下幾部分組成

        一個或者多個代碼段,代碼段屬性為只讀(只讀數據也放在代碼段?RO)

        零個或者多個初始化數據的數據段,可讀寫(存放初始化了的變量數據,RW)

        零個或者多個不包含初始化數據的數據段,可讀寫(所有未初始化的變量,也就是ZI)

        鏈接器根據系統默認或者用戶設定的規則,將各段安排在存儲器中的相應位置,因此源程序中段之間的相對位置與可執行映像文件中的段的相對位置一般不會相同。

        2.匯編語句應該注意的地方

        匯編語句格式

        [LABEL] OPERATION, [OPERAND], [;COMMENT]

        LABEL必須在一行的開頭寫。

        OPERATION包括指令、偽操作、宏指令或偽指令。每一條操作助記符必須全部大寫或者全部小寫。在寫操作助記符前,必須有空格。

        OPERAND 表示操作的對象,可以使常量、變量、標號、寄存器或者表達式,不同的對象之間必須用逗號分開。

        例子:

        AREA EX2,CODE,READONLY ;操作助記符前面必須有空格

        GBLA DATA ;操作助記符前面必須有空格

        DATASETA,0x20 ;變量名DATA前面不能留空格

        ADD R0,R1,R2

        ADD R0,R1,r2

        add R0,R1,r2

        Add R0,R1,r2 ;寄存器小寫正確,指令助記符大小寫混合錯誤

        3.常用符號

        匯編語言中,經常使用各種符號表示變量、常量和地址。

        變量的定義:使用偽操作GBLA、GBLL、GBLS,分別是定義全局的數值變量、邏輯變量和字符變量;LCLA、LCLL、LCLS定義局部的數值變量、邏輯變量和字符變量。相應的變量使用SETA、SETL、SETS來進行賦值。注意字符串長度不應超過512個字節。

        例子:

        GBLA DATA

        DATASETA 0x20

        LCLS str1

        str1 SETS “PEN”

        LCLL lc

        lc SETL {TRUE}

        常量是在運行過程中不能改變的量。ARM支持數值常量、邏輯常量和字符串常量。匯編中使用EQU來定義一個數值常量,如

        Test EQU 10; 定義標號Test的值為20.

        Addr EQU 0x55,CODE32;

        關于EQU的具體使用,看偽操作EQU。

        數值常量一般為32為的整數,可以使十進制、十六進制,也可以是n進制(n=2~9)如8_247是一個八進制數。

        4.常見的偽操作符

        符號定義偽操作

        GBLA、GBLL、GBLS

        LCLA、LCLL、LCLS

        SETA、SETL、SETS

        RLIST

        其中RLIST用來定義通用寄存器列表名稱,使用該偽操作定義的名稱可以在ARM指令LDM/STM中使用。在LDM/STM中,訪問列表中的寄存器次序為寄存器編號由低到高的順序。如

        RegList RLIST {r0-r5,r8,r10}; 將寄存器列表名稱定義為RegList

        在程序中使用

        STMFD SP!, RegList ;存儲列表到堆棧

        LDMIA R5, RegList ; 加載列表

        數據定義偽操作

        DCB 分配一片連續的字節存儲單元并初始化

        DCW(DCWU) 分配一片連續的半字存儲單元并初始化

        DCD(DCDU) 分配一片連續的字存儲單元并初始化

        DCDO、DCI、DCQ(DCQU)

        DCFS(DCFSU) 為單精度浮點數分配一片連續的字存儲單元并初始化

        DCFD(DCFDU) 為雙精度浮點數分配一片連續的字存儲單元并初始化

        SPACE 分配一片連續的存儲單元

        FIELD、MAP、LTORG


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新宾| 西乌珠穆沁旗| 景东| 张掖市| 海盐县| 大悟县| 南乐县| 民县| 云霄县| 车险| 师宗县| 分宜县| 清河县| 合作市| 漳平市| 宣化县| 错那县| 建昌县| 重庆市| 古田县| 堆龙德庆县| 桂东县| 轮台县| 霸州市| 涡阳县| 金堂县| 巴里| 灵石县| 双牌县| 綦江县| 洛扎县| 会宁县| 中超| 木里| 师宗县| 阳山县| 恩平市| 扬中市| 西吉县| 南丹县| 五寨县|