新聞中心

        常用ARM匯編指令

        作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        嵌入式開發(fā)中,匯編程序常常用于非常關(guān)鍵的地方,比如系統(tǒng)啟動時初始化,進出中斷時的環(huán)境保護,恢復(fù)等對性能有要求的地方。

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

        ARM指令集可以分為六大類,分別為數(shù)據(jù)處理指令、Load/Store指令、跳轉(zhuǎn)指令、程序狀態(tài)寄存器處理指令、協(xié)處理器指令和異常產(chǎn)生指令。
        ARM指令使用的基本格式如下:
        〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}
        opcode 操作碼;指令助記符,如LDR、STR等。
        cond 可選的條件碼;執(zhí)行條件,如EQ、NE等。
        S 可選后綴;若指定“S”,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中的條件碼。
        Rd 目標寄存器。
        Rn 存放第1操作數(shù)的寄存器。
        operand2 第2個操作數(shù)

        arm的尋址方式如下:
        立即尋址
        寄存器尋址
        寄存器間接尋址
        基址加偏址尋址
        堆棧尋址
        塊拷貝尋址
        相對尋址
        這里不作詳細描述,可以查閱相關(guān)文檔。

        數(shù)據(jù)處理指令
        Load/Store指令
        程序狀態(tài)寄存器與通用寄存器之間的傳送指令
        轉(zhuǎn)移指令
        異常中斷指令
        協(xié)處理器指令


        在S3C2410、S3C2440的數(shù)據(jù)手冊中對各種匯編指令有詳細的描述;這里只對較常見的作寫介紹。
        1、相對跳轉(zhuǎn)指令:b、bl
        這兩條指令的不同之處在于bl指令除了跳轉(zhuǎn)之外,還將返回地址(bl的下一條指令的地址)保存在lr寄存器中。
        這兩條指令的可跳轉(zhuǎn)范圍是當(dāng)前指令前后32M。

        b funa
        ....
        funa:
        b funb
        ....
        funb:
        ....

        2、數(shù)據(jù)傳送指令mov,地址讀取偽指令ldr
        mov指令可以把一個寄存器的值賦給另外一個寄存器,或者把一個常數(shù)賦給寄存器。
        mov r1, r2

        mov r1,#1024

        mov傳送的常數(shù)必須能用立即數(shù)來表示。當(dāng)不能用立即數(shù)表示時,可以用ldr命令來賦值。
        ldr是偽命令,不是真實存在的指令,編譯器會把它擴展成真正的指令;如果該常數(shù)能用“立即數(shù)”來表示,則使用mov指令,否則編譯時將該常數(shù)保存在某個位置,使用內(nèi)存讀取指令把它讀出來。
        ldr r1, = 1024


        3、內(nèi)存訪問指令 ldr、str、ldm、stm
        ldr既可以指低至讀取偽指令,也可以是內(nèi)存訪問指令。當(dāng)他的第二個參數(shù)前面有=時標偽指令,否則表內(nèi)存訪問指令。
        ldr指令從內(nèi)存中讀取數(shù)據(jù)到寄存器,str指令把寄存器的指存儲到內(nèi)存中,他們的操作數(shù)都是32位的。

        ldr r1, [r2, #4]
        ldr r1,[r2]
        ldr r1,[r2], #4
        str r1 ,[r2, #4]
        str r1, [r2]
        str r1, [r2],#4
        寄存器傳送指令可以用一條指令將16個可見寄存器(R0~R15)的任意子集合(或全部)存儲到存儲器或從存儲器中讀取數(shù)據(jù)到該寄存器集合中。與單寄存器存取指令相比,多寄存器數(shù)據(jù)存取可用的尋址模式更加有限。多寄存器存取指令的匯編格式如下:

        LDM/STM{}Rn{!},


        4、加減指令 add、sub

        add r1, r2, #1
        sub r1, r2, #1

        5、程序狀態(tài)寄存器的訪問指令msr,mrs

        ARM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過“讀取-修改-寫回”三個步驟的操作來實現(xiàn)的。 這兩條指令分別是:
        狀態(tài)寄存器到通用寄存器的傳送指令(MRS)
        通用寄存器到狀態(tài)寄存器的傳送指令(MSR)

        其匯編格式如下:
        MRS{} Rd,CPSR|SPSR
        其匯編格式如下:
        MSR{} CPSR_f | SPSR_f,#<32-bit immediate>
        MSR{} CPSR_ | SPSR_,Rm

        msr cpsr, r0
        mrs r0, cpsr

        6、異常中斷指令
        異常中斷指令可以分為一下兩種:
        軟件中斷指令(SWI)
        斷點指令(BKPT—僅用于v5T體系)
        軟件中斷指令SWI用于產(chǎn)生SWI異常中斷,用來實現(xiàn)在用戶模式下對操作系統(tǒng)中特權(quán)模式的程序的調(diào)用;斷點中斷指令BKPT主要用于產(chǎn)生軟件斷點,供調(diào)試程序用。

        7、其他偽指令

        .extern main
        .text
        .global _start
        _start:

        .extern 定義一個外部符號(可以是變量也可以是函數(shù)),上面的代碼表示表文本文件中引用的main是一個外部函數(shù)。

        .text表示下面的語句都屬于代碼段

        .global將本文件中的某個程序標號定義為全局的,如‘_start’就是個全局函數(shù)



        關(guān)鍵詞: ARM匯編指

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 夏河县| 江西省| 福泉市| 大庆市| 土默特右旗| 桐乡市| 邵武市| 长春市| 大田县| 宝山区| 康定县| 平昌县| 获嘉县| 芮城县| 观塘区| 澄迈县| 洪洞县| 文山县| 小金县| 达州市| 南充市| 新丰县| 富民县| 乐山市| 桃源县| 那坡县| 屯昌县| 盱眙县| 台南县| 且末县| 山东省| 砀山县| 贡山| 长沙县| 石台县| 大竹县| 廊坊市| 德兴市| 张家口市| 屯昌县| 孝义市|