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:

…………

 

posted on 2019-06-02 20:09  黑箱  阅读(238)  评论(0编辑  收藏  举报