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:

…………

12 ARM汇编的更多相关文章

  1. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

  2. arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值

    环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...

  3. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  4. ARM 汇编的一些规范

    A.5.1  文件格式        ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码.         在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编 ...

  5. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  6. linux驱动系列之arm汇编

    在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.b ...

  7. 经常使用ARM汇编指令

    一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...

  8. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  9. ARM汇编指令格式

    一.ARM介绍 1) arm汇编中,程序下一步执行哪一条指令,是根据程序计数器(PC)的值来决定. 类比于8086的CS:IP的功能. 2) 8086属于CISC(复杂指令集),每条指令长度不等,ar ...

随机推荐

  1. 微信小程序 vscode 自动保存 保存自动编译 微信开发者工具崩溃

    修改vscode的自动保存延迟时间,将 auto save delay 选项 修改的长一点.

  2. Windbg Register(寄存器)窗口的使用

    寄存器是位于在 CPU 的小易失性内存单位. 许多寄存器专用于特定用途,并可用于用户模式应用程序使用的其他寄存器. 基于 x86 和基于 x64 的处理器在有可用的寄存器的不同集合. 如何打开寄存器窗 ...

  3. vue中异步请求渲染问题(swiper不轮播)(在开发过程中遇到过什么问题、踩过的坑)

    问题描述: 用vue封装一个swiper组件的时候,发现轮播图不能轮播了. 原因: 异步请求的时间远大于生命周期执行的时间,mounted初始化DOM时数据未返回,渲染数据是空数组,导致轮播图的容器层 ...

  4. 有这样一个url=http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段js程序提取url 中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中, 如{a:'1',b:'2',c:'',d:'xxx',e:undefined}

    第一种方法: console.log(getJson(url)); function getJson(url){ var obj={}; var arr=url.split("?" ...

  5. 图的遍历 | 1131地铁图: dfs复杂模拟题

    这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); ...

  6. 转载:EM算法的最精辟讲解

    机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么是神,因为神能做很多人做不了的事.那么EM ...

  7. python3 pathlib库中的Path类的使用

    调用库 from pathlib import Path 获取 Path 的文件名 Path.name 参考 https://blog.csdn.net/amanfromearth/article/d ...

  8. Centos开发小计

    1. 生成静态库,linux下库的规则是lib开头 g++ -c code.cpp ar cr libcode.a code.o

  9. golang gRPC(持续更新)

    如何开启 gRPC 日志 设置 GRPC_GO_LOG_SEVERITY_LEVEL 环境变量, 可选项:["info", "warning", "e ...

  10. FLASK-SQLALCHEMY如何使用or和and条件进行组合查询

    FLASK-SQLALCHEMY如何使用or和and条件进行组合查询 http://www.cherishlau.site/2018/03/29/flask-sqlalchemy-use-or-and ...