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:

…………

最新文章

  1. Inno Setup 如何读写文件
  2. java的字体的颜色,型号,大小的方法
  3. ural 1057Amount of Degrees ——数位DP
  4. [转]ASP.NET中的forms验证
  5. html body的属性 格式控制标签 内容容器标签 超链接标签 图片标签 表格
  6. http://blog.csdn.net/zhang_xinxiu/article/details/38655311
  7. java--map容器的hashcode和equals
  8. 【数学】Codeforces 707C Pythagorean Triples
  9. select change事件给其它元素赋值,本select的value或tex
  10. Ruby学习之动态调用
  11. mysql进阶(五)数据表中带OR的多条件查询
  12. 501. Find Mode in Binary Search Tree
  13. gcc 8.2.1 / MCF thread 简介
  14. Autowried注解和Resource注解的区别
  15. Canary机制的绕过
  16. java使用Base64编码
  17. 怎么在父窗口调用它页面的iframe里面数据,进行操作?
  18. Sql求和异常——对象不能从 DBNull 转换为其他类型
  19. ASP.NET MVC中的Session以及处理方式
  20. 【BZOJ4003】[JLOI2015]城池攻占 可并堆

热门文章

  1. ESA2GJK1DH1K基础篇: 测试APP使用SmartConfig绑定Wi-Fi 设备并控制设备
  2. 洛谷题解 P4392 【[BOI2007]Sound 静音问题】
  3. day 14
  4. 关于微信订阅号里自动回复里的a链接的问题
  5. node.js HTTP模块、URL 模块
  6. mac下编程使用字体
  7. 修改mysql存储过程或函数的定义着
  8. JavaScript 一些实用技巧
  9. ThinkPHP5 使用 JWT 进行加密
  10. Spring Cloud config之三:config-server因为server端和client端的健康检查导致服务超时阻塞问题