• 12 ARM汇编


    Android系统采用java作为平台软件基础开发语言,NDK使Android平台可以运行C/C++代码这些代码汇编成ARM的elf可执行文件。

    原生程序生成过程

     

    经历4步:1。预处理2。编译3。汇编4。链接

    经过第2步编译后C代码变成ARM汇编代码,NDK支持直接使用ARM汇编编写的 .s文件

    ARM使用寄存器保存值或内存地址,共有37个寄存器,31个为通用寄存器,6个为状态寄存器。ARM有7种运行模式:

    1。用户模式(usr):ARM正常运行状态

    2。快速中断模式(fiq):用于高速数据传输或通道处理

    3。外部中断模式(irq):用于通用的中断处理

    4。管理模式(svc):操作系统使用的保护模式

    5。数据访问终止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及保护

    6。系统模式(sys):运行具有特权的操作系统任务

    7。为定义指令终止模式(und):当未定义的指令执行时进入该模式

    ARM逆向只涉及用户模式(usr)。

    用户模式下:可以访问的寄存器分为:

           不分组寄存器:R0~R7

           分组寄存器:R8~R14

           程序计数器:R15

           当前程序状态寄存器:CPSR

    ARM两种运行状态:32位字对齐ARM指令,16位对齐Thumb指令

    ARM与Thumb关系:

    Thumb

    ARM

    R0~R7寄存器

    状态相同

    CPSR

    状态相同

    寄存器对应关系

    FP

    R11

    IP

    R12

    SP

    R13

    LR

    R14

    PC

    R15

    ARM汇编语言程序结构

    1。段定义:

           .data数据段:全局变量、常量等信息编译器。细分的话 常量在 .rodata 代码在 .text

           ARM使用 .section指令来定义段 格式:

           .section name [,”flags”[,%type[,flag_specific_arguments]]]

           name段名  flags段属性、type 段类型、flag_specific_arguments平台相关参数

    2。注释和标号

           注释使用 /* */ 单行注释使用@开头

           标号:程序使用跳转时使用,汇编器将标号转换成地址

                  格式:<标号>

    3。汇编指令:

           程序中以“.”开头的指令都是汇编器指令,与汇编器有关不属于ARM指令集

           .file:指定源文件名

           .align:指定代码对齐方式

           .ascii:声明字符串

           .global:声明全局符号

           .type:指定符号类型

           .word:用来存放地址值

           .size:设置指定符号大小 eg:“.size main, .-main”当前地址减去main符号的地址即为这个main函数的大小

           .ident:编译器标识 生成可执行程序后放置到“.comment”段中

           子程序与参数传递

           子程序在代码中完成一个独立功能,与函数概念相同

           声明方法:

           .global 函数名

           .type 函数名,%function

           函数名:

                  <…函数体…>

    ARM函数传参问题:规定,

           R0~R3寄存器传递第1到第4个参数,超出的参数通过栈传递。

           R0寄存器同时用来存放函数调用返回值。

           被调用的函数在返回前无需恢复这些寄存器内容

    ARM寻址方式

           立即寻址

           寄存器寻址

           寄存器移位寻址:五种移位操作

                  1。LSL:逻辑左移,移位后寄存器空出的低位补0

                  2。LSR:逻辑右移,移位后寄存器空出的高位补0

                  3。ASR:算术右移,符号为不变,正数补0负数补1

                  4。AOR:循环右移,移位后移出低位填入空出的高位

                  5。RRX:带扩展的循环右移,操作数右移一位,空出的高位用C标志的值填充

           寄存器间接寻址

           基址寻址

           多寄存器寻址

           堆栈寻址

                  LDM出,STM入

                  LDM和STM指令前缀表示多寄存器寻址,FA、EA、FD、ED指令后缀

           块拷贝寻址

                  连续地址数据从存储器某一位置拷贝到另一位置

                  LDM和STM指令前缀,IA、DA、IB、DB为指令后缀

           相对寻址

    以程序PC计数器的当前值为基地址,指令中的地址标号为偏移量,相加之后得到操作数的有效地址。

                  Eg: BL NEXT

                          …………

                          NEXT:

    …………

  • 相关阅读:
    php无法连接mongodb 3.0问题解决
    mongodb安全配置
    RedHat6/Centos6.5安装mongodb php driver
    RedHat6/Centos6.5安装mongodb
    ASP.NET Identity 2集成到MVC5项目--笔记02
    ASP.NET Identity 2集成到MVC5项目--笔记01
    C#实体类序列化为XML
    MVC4学习笔记之--身份认证过滤器
    【WPF】学习笔记(三)——这个家伙跟电子签名板有个约定
    【WPF】学习笔记(二)——依旧是一个电子签名板
  • 原文地址:https://www.cnblogs.com/heixiang/p/10964146.html
Copyright © 2020-2023  润新知