在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            Android ARM匯編語言

            作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            簡介

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

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

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

            一個ARM原生程序如下:

            EXPORT main  //main函數(shù)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}  //堆棧尋址指令

            對應(yīng)的代碼:

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

            原生程序的生成過程

            1、預處理

            2、編譯

            3、匯編

            4、鏈接

            必須了解的ARM知識

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

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

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

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

            系統(tǒng)模式、未定義指令中止模式。

            指令格式

            ARM指令的基本格式如下:

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


            跳轉(zhuǎn)指令

            1、B跳轉(zhuǎn)指令

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

            2、BL帶鏈接的跳轉(zhuǎn)指令

            BL{cond} label 

            3、BX帶狀態(tài)切換的跳轉(zhuǎn)指令

            BX{cond} Rm

            4、BLX帶鏈接和狀態(tài)切換的跳轉(zhuǎn)指令

            BLX{cond} Rm

            存儲器訪問指令

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

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

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

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

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

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

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

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

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

            PUSH {cond} reglist

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

            POP {cond} reglist

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

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

            數(shù)據(jù)處理指令

            MOV 將8位的立即數(shù)或寄存器的內(nèi)容傳送到目標寄存器中。它的格式如下:

            MOV {cond}{S}Rd,operand2

            MVN 數(shù)據(jù)非傳送指令。它的格式如下:

            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寄存器的值中減去乘積,最后將所得結(jié)果的低32位存入Rd寄存器中。它的格式如下:

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

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

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

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

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

            UMLAL 64 位無符號乘加指令。指令將Rm 和Rs 中的值作無符號數(shù)相乘,64 位乘積與RdHi、RdLo 相加,結(jié)果的低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 中的值作有符號數(shù)相乘,結(jié)果的低32 位保存到RdLo 中,而高32 位保存到RdHi 中。指令格式如下:

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

            SMLAL 64 位有符號乘加指令。指令將Rm 和Rs 中的值作有符號數(shù)相乘,64 位乘積與RdHi、RdLo,相加,結(jié)果的低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 有符號數(shù)除法指令。它的格式如下:

            SDIV{cond} Rd,Rm,Rn

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

            UDIV{cond} Rd,Rm,Rn

            ASR 算術(shù)右移指令。它的格式如下:

            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
            ……

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


            關(guān)鍵詞: AndroidARM匯編語

            評論


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

            關(guān)閉