• Android ARM汇编语言


    简介

    ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集。

    原生程序与ARM汇编语言

    对于使用ARM处理器的Android手机来说,它最终会生成相应的ARM elf可执行文件,分析软件的核心功能只能从这个elf文件入手。

    一个ARM原生程序如下:

    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}  //堆栈寻址指令

    对应的代码:

    int main(int argc, char* argv[]){
    	printf("Hello ARM!
    ");
    	return 0;
    }
    
    原生程序的生成过程

    1、预处理

    2、编译

    3、汇编

    4、链接


    必须了解的ARM知识

    1、ARM汇编语言是一门低级语言,它能够与系统的底层打交道,直接访问底层硬件资源。

    2、ARM汇编语言与C语言共用同一套原生程序开发的API接口。

    3、寄存器是处理器特有的高速存贮部件,它们可用来暂存指令、数据和地址。ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,

    6个为状态寄存器。ARM处理器支持七种运行模式,它们分别为:用户模式、快速中断模式、外部中断模式、管理模式、数据访问终止模式、

    系统模式、未定义指令中止模式。


    指令格式

    ARM指令的基本格式如下:

    <opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}
    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,label
    LDRD{cond} Rd,Rd2,label


    STR用于存储数据到指定地址的存储单元中。它的格式如下:

    STR{type}{cond} Rd,label
    STRD{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


    UMULL 64 位无符号乘法指令。指令将Rm 和Rs 中的值作无符号数相乘,结果的低32 位保存到RsLo 中,而高32 位保存到RdHi 中。指令格式如下:

    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 中。

    指令格式如下:

    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 中。指令格式如下:

     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 中。

    指令格式如下:

    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寄存器。它的格式如下:

    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处理器完整的指令集,为进一步破解Android又打下了一个基础。

    下载

    相关实例源码以及工具下载

  • 相关阅读:
    linux 时间同步
    sublime3 install python3
    Postfix的工作原理
    MySQL启动报错
    Socket server
    自定义静态网卡配置
    Nginx 404 500
    Pymysql
    Gitlab smtp 设置
    Windows 文件自动同步共享工具
  • 原文地址:https://www.cnblogs.com/pangblog/p/3304002.html
Copyright © 2020-2023  润新知