日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android arm

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android arm 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/banketree/article/details/10995205

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

原生程序與ARM匯編語言

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

一個ARM原生程序如下:

[java]?view plaincopy
  • EXPORT?main??//main函數??
  • main??
  • var_C=?-0xc?????//識別出的棧變量??
  • var_8?=?-8??
  • STMFD?SP!,{R11,LR}???//指令??壓入堆棧??
  • ADD?R11,SP,#4??
  • SUB?SP,SP,#8??
  • STR?R0,[R11,#var_8]??
  • STR?R1,[R11,#var_C]??
  • LDR?R3,=(aHelloArm?-?0x8300)??
  • ADD?R3,PC,R3??
  • MOV?R0,R3??
  • BL?puts??
  • MOV?R3,#0??
  • MOV?R0,R3??
  • SUB?SP,R11,#4??
  • LDMFD?SP!,{R11,PC}??//<span?style="font-family:?Arial,?Helvetica,?sans-serif;">堆棧尋址指令</span>??

  • 對應的代碼:

    [java]?view plaincopy
  • 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指令的基本格式如下:

    [java]?view plaincopy
  • <opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}??
  • opcode為指令助記符,cond為執行條件。??


  • 跳轉指令

    1、B跳轉指令

    [java]?view plaincopy
  • B{cond}?label???簡單的分支指令??

  • 2、BL帶鏈接的跳轉指令

    [java]?view plaincopy
  • BL{cond}?label???

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

    [java]?view plaincopy
  • BX{cond}?Rm??

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

    [java]?view plaincopy
  • BLX{cond}?Rm??

  • 存儲器訪問指令

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

    [java]?view plaincopy
  • LDR{type}{cond}?Rd,label??
  • LDRD{cond}?Rd,Rd2,label??

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

    [java]?view plaincopy
  • STR{type}{cond}?Rd,label??
  • STRD{cond}?Rd,Rd2,label??

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

    [java]?view plaincopy
  • LDM{addr_mode}{cond}?Rn{!}?reglist??

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

    [java]?view plaincopy
  • STM{addr_mode}{cond}?Rn{!}?reglist??
  • PUSH 將寄存器推入滿遞減堆棧。它的格式如下:

    [java]?view plaincopy
  • PUSH?{cond}?reglist??

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

    [java]?view plaincopy
  • POP?{cond}?reglist??
  • SWP 用于寄存器與存儲器之間的數據交換。它的格式如下:

    [java]?view plaincopy
  • SWP{B}{cond}?Rd,Rm,[Rn]??
  • 數據處理指令

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

    [java]?view plaincopy
  • MOV?{cond}{S}Rd,operand2??

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

    [java]?view plaincopy
  • MVN?{cond}{S}Rd,operand2??

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

    [java]?view plaincopy
  • ADD{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • ADC{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • SUB{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • RSB{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • SBC{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • RSC?{cond}{S}Rd,Rn,operand2??

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

    [java]?view plaincopy
  • MUL?{cond}{S}Rd,Rm,Rn??

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

    [java]?view plaincopy
  • MLS?{cond}{S}?Rd,Rm,Rn,Ra??

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

    [java]?view plaincopy
  • MLA?{cond}{S}?Rd,Rm,Rn,Ra??

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

    [java]?view plaincopy
  • UMULL{cond}{S}?RdLo,RdHi,Rm,Rs??
  • ??
  • UMULL?指令舉例如下:??
  • UMULL?R0,R1,R5,R8?;(R1、R0)=R5×R8??

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

    指令格式如下:

    [java]?view plaincopy
  • UMLAL{cond}{S}?RdLo,RdHi,Rm,Rs??
  • ??
  • UMLAL?指令舉例如下:??
  • UMLAL?R0,R1,R5,R8?;(R1,R0)=R5×R8+(R1,R0)??

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

    [java]?view plaincopy
  • ?SMULL{cond}{S}?RdLo,RdHi,Rm,Rs??
  • ??
  • SMULL?指令舉例如下:??
  • SMULL?R2,R3,R7,R6?;(R3,R2)=R7×R6??

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

    指令格式如下:

    [java]?view plaincopy
  • SMLAL{cond}{S}?RdLo,RdHi,Rm,Rs??
  • SMLAL?指令舉例如下:??
  • SMLAL?R2,R3,R7,R6?;(R3,R2)=R7×R6+(R3,R2)??

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

    [java]?view plaincopy
  • SMLAD{cond}{S}Rd,Rm,Rn,Ra??

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

    [java]?view plaincopy
  • SDIV{cond}?Rd,Rm,Rn??

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

    [java]?view plaincopy
  • UDIV{cond}?Rd,Rm,Rn??
  • ASR 算術右移指令。它的格式如下:

    [java]?view plaincopy
  • ASR{cond}?Rd,Rm,operader2??

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

    [java]?view plaincopy
  • AND{cond}?Rd,Rm,operader2??

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

    [java]?view plaincopy
  • ORR{cond}?Rd,Rm,operader2??
  • EOR 異或指令。它的格式如下:

    [java]?view plaincopy
  • EOR?{cond}?Rd,Rm,operader2??

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

    [java]?view plaincopy
  • BIC?{cond}?Rd,Rm,operader2??


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

    [java]?view plaincopy
  • LSL?{cond}?Rd,Rm,operader2??
  • [java]?view plaincopy
  • <span?style="font-family:?Arial,?Helvetica,?sans-serif;?font-size:?12px;">……</span> ?
  • 總結

    以上是生活随笔為你收集整理的android arm的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。