zoukankan      html  css  js  c++  java
  • 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:

    …………

  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/heixiang/p/10964146.html
Copyright © 2011-2022 走看看