新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android ARM匯編語言

        Android ARM匯編語言

        作者: 時間:2016-11-09 來源:網絡 收藏
        簡介

        ARM是Advanced RISC Machine的首字母縮寫,它可以稱之為一家嵌入式處理器的提供商,也可以理解為一種處理器的架構,還可以將它作為一套完整的處理器指令集。

        本文引用地址:http://www.104case.com/article/201611/317689.htm
        原生程序與ARM匯編語言

        對于使用ARM處理器的Android手機來說,它最終會生成相應的ARM elf可執行文件,分析軟件的核心功能只能從這個elf文件入手。

        一個ARM原生程序如下:

        EXPORT main  //main函數mainvar_C= -0xc     //識別出的棧變量var_8 = -8STMFD SP!,{R11,LR}   //指令  壓入堆棧ADD R11,SP,#4SUB SP,SP,#8STR R0,[R11,#var_8]STR R1,[R11,#var_C]LDR R3,=(aHelloArm - 0x8300)ADD R3,PC,R3MOV R0,R3BL putsMOV R3,#0MOV R0,R3SUB SP,R11,#4LDMFD SP!,{R11,PC}  //堆棧尋址指令

        對應的代碼:

        int main(int argc, char* argv[]){printf("Hello ARM!n");return 0;}

        原生程序的生成過程

        1、預處理

        2、編譯

        3、匯編

        4、鏈接

        必須了解的ARM知識

        1、ARM匯編語言是一門低級語言,它能夠與系統的底層打交道,直接訪問底層硬件資源。

        2、ARM匯編語言與C語言共用同一套原生程序開發的API接口。

        3、寄存器是處理器特有的高速存貯部件,它們可用來暫存指令、數據和地址。ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,

        6個為狀態寄存器。ARM處理器支持七種運行模式,它們分別為:用戶模式、快速中斷模式、外部中斷模式、管理模式、數據訪問終止模式、

        系統模式、未定義指令中止模式。

        指令格式

        ARM指令的基本格式如下:

        {}{S}{.W|.N},{,}opcode為指令助記符,cond為執行條件。


        跳轉指令

        1、B跳轉指令

        B{cond} label   簡單的分支指令

        2、BL帶鏈接的跳轉指令

        BL{cond} label 

        3、BX帶狀態切換的跳轉指令

        BX{cond} Rm

        4、BLX帶鏈接和狀態切換的跳轉指令

        BLX{cond} Rm

        存儲器訪問指令

        LDR 用于從存儲器中加載數據到寄存器中。它的格式如下:

        LDR{type}{cond} Rd,labelLDRD{cond} Rd,Rd2,label

        STR用于存儲數據到指定地址的存儲單元中。它的格式如下:

        STR{type}{cond} Rd,labelSTRD{cond} Rd,Rd2,label

        LDM 從指定的存儲單元加載多個數據到一個寄存器列表。它的格式如下:

        LDM{addr_mode}{cond} Rn{!} reglist

        STM 將一個寄存器列表的數據存儲到指定的存儲單元。它的格式如下:

        STM{addr_mode}{cond} Rn{!} reglist

        PUSH 將寄存器推入滿遞減堆棧。它的格式如下:

        PUSH {cond} reglist

        POP 從滿遞減堆棧中彈出數據到寄存器。它的格式如下:

        POP {cond} reglist

        SWP 用于寄存器與存儲器之間的數據交換。它的格式如下:

        SWP{B}{cond} Rd,Rm,[Rn]

        數據處理指令

        MOV 將8位的立即數或寄存器的內容傳送到目標寄存器中。它的格式如下:

        MOV {cond}{S}Rd,operand2

        MVN 數據非傳送指令。它的格式如下:

        MVN {cond}{S}Rd,operand2

        ADD 加法指令。它的格式如下:

        ADD{cond}{S}Rd,Rn,operand2

        ADC 帶進位加法指令。它的格式如下:

        ADC{cond}{S}Rd,Rn,operand2

        SUB 減法指令。它的格式如下:

        SUB{cond}{S}Rd,Rn,operand2

        RSB 逆向減法指令。它的格式如下:

        RSB{cond}{S}Rd,Rn,operand2

        SBC 帶進位減法指令。它的格式如下:

        SBC{cond}{S}Rd,Rn,operand2


        RSC 帶進位逆向減法指令。它的格式如下:

        RSC {cond}{S}Rd,Rn,operand2


        MUL 32位乘法指令。它的格式如下:

        MUL {cond}{S}Rd,Rm,Rn

        MLS 將Rm寄存器和Rn寄存器中的值相乘,然后再從Ra寄存器的值中減去乘積,最后將所得結果的低32位存入Rd寄存器中。它的格式如下:

        MLS {cond}{S} Rd,Rm,Rn,Ra

        MLA 將Rm寄存器和Rn寄存器中的值相乘,然后再將乘積與Ra寄存器中的值想家,最后將所得結果的低32位存入Rd寄存器中。它的格式如下:

        MLA {cond}{S} Rd,Rm,Rn,Ra

        UMULL64 位無符號乘法指令。指令將Rm 和Rs 中的值作無符號數相乘,結果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:

        UMULL{cond}{S} RdLo,RdHi,Rm,RsUMULL 指令舉例如下:UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8

        UMLAL 64 位無符號乘加指令。指令將Rm 和Rs 中的值作無符號數相乘,64 位乘積與RdHi、RdLo 相加,結果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。

        指令格式如下:

        UMLAL{cond}{S} RdLo,RdHi,Rm,RsUMLAL 指令舉例如下:UMLAL R0,R1,R5,R8 ;(R1,R0)=R5×R8+(R1,R0)

        SMULL 64 位有符號乘法指令。指令將Rm 和Rs 中的值作有符號數相乘,結果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:

        SMULL{cond}{S} RdLo,RdHi,Rm,RsSMULL 指令舉例如下:SMULL R2,R3,R7,R6 ;(R3,R2)=R7×R6

        SMLAL 64 位有符號乘加指令。指令將Rm 和Rs 中的值作有符號數相乘,64 位乘積與RdHi、RdLo,相加,結果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。

        指令格式如下:

        SMLAL{cond}{S} RdLo,RdHi,Rm,RsSMLAL 指令舉例如下:SMLAL R2,R3,R7,R6 ;(R3,R2)=R7×R6+(R3,R2)

        SMLAD 將Rm寄存器的低半字和Rn寄存器的低半字相乘,然后將Rm寄存器的高半字和Rn的高半字相乘,最后將兩個乘積與Ra寄存器的值相加并存入Rd寄存器。它的格式如下:

        SMLAD{cond}{S}Rd,Rm,Rn,Ra

        SDIV 有符號數除法指令。它的格式如下:

        SDIV{cond} Rd,Rm,Rn

        UDIV 無符號數除法指令。它的格式如下:

        UDIV{cond} Rd,Rm,Rn

        ASR 算術右移指令。它的格式如下:

        ASR{cond} Rd,Rm,operader2

        AND 邏輯與指令。它的格式如下:

        AND{cond} Rd,Rm,operader2

        ORR 邏輯或指令。它的格式如下:

        ORR{cond} Rd,Rm,operader2

        EOR 異或指令。它的格式如下:

        EOR{cond} Rd,Rm,operader2

        BIC 位清除指令。它的格式如下:

        BIC{cond} Rd,Rm,operader2


        LSL 邏輯左移指令。它的格式如下:

        LSL{cond} Rd,Rm,operader2
        ……

        小結
        了解了ARM處理器完整的指令集,為進一步破(po)解(jie)Android又打下了一個基礎。


        關鍵詞: AndroidARM匯編語

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 商水县| 龙江县| 乐业县| 高邑县| 左云县| 那坡县| 阆中市| 昌吉市| 科技| 长垣县| 福贡县| 垫江县| 垣曲县| 江都市| 延津县| 岳西县| 句容市| 锡林郭勒盟| 永州市| 休宁县| 澜沧| 岫岩| 黄陵县| 松滋市| 巨鹿县| 普格县| 虎林市| 宾川县| 泰宁县| 平谷区| 贡觉县| 澄江县| 秭归县| 密山市| 岫岩| 库伦旗| 锦州市| 台州市| 永城市| 翁源县| 湖南省|