android arm 寄存器,ARM汇编
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
Android Native 进程启动流程
ARM传参,R0-R3传递前四个参数
1. Thumb 指令集特点Thumb 指令集指令长度:16或32,16为为主
Thumb-16 大部分只能访问前8个寄存器 R0-R7(少数可以访问R8-R15)
Thumb-32 可以访问所有的ARM core 寄存器 R0-R15
更小、更加灵活
2. ARM指令集特点指令长度32位,4字节对齐
功能更加完善
对比ThumbARM2字节对齐4字节对齐
占用空间少、密度高占用空间较多
功能不齐全功能齐全
ARM和Thumb指令集各有自己的优点,取长补短往往会得到最好的性能
3. Opcod 中判断指令集Opcode[15:13]== 111 && Opcode[12:11]!= 00 满足则为32bit 的ARM
bl #0x80000fbc
0xed 0xff 0xff 0xeb
4. IDA 中识别与切换指令集Edit->segments->change segment register value(快捷键ALT+G)
请看操作。
这有一段指令,判断出目前是thumb指令集的
按下ALT+G,把0x1改成0x0,就是指定为ARM指令集
然后按下P键定义函数,函数参数就都分析出来了(
5. ARM切换指令集原理处理器无论在ARM还是Thumb状态下都可以通过BX/BLX/LDR/LDM切换不同的指令集。
状态切换是由寄存器Rn的最低位来指定的,如果操作数寄存器的状态位Bit0=0,则进入ARM状态,如果Bit0=1,则进入Thumb状态。
ARM 中对于字节、字、双字的定义
注意和intel汇编的区别,一个word(字)这里是4个字节
但是注意一下,在IDA中依然延续着老的传统,一个DCW(word)代表两个字节DCB 定义1字节数据
DCW 定义2字节数据
DCD 定义4字节数据
在IDA中,在上面这些数据定义上按下D键可以切换定义的类型
Array 定义数组,右键或*号键
数组最常见的就在数组,
IDA中的自定义数据类型
Structures 窗口中可以创建一个自定义结构体。按下I或者Ins键即可创建。
创建了一个名为test的结构体
因为没有定义字段,所以现在都还是空的,结构体长度为0(相当于空结构体,没有任何内容)
所以去定义字段。
为自定义数据类型添加字段
创建完结构体后,长这样:
在ends处按下D键就可以定义一个字段了,在字段上按D可以改变长度1/2/4
其他按键:
这样就可以给一个变量转成自己的结构体类型
应用自定义数据类型
在起始数据处右键->Structure->自定义的数据类型
ARM汇编中的标志寄存器与条件代码
跳转指令b指令:跳转
bl指令:跳转且保存返回地址
blx/bx指令:带x,可以切换指令集
分支指令例子:
beq=b+eq(equal)=b指令+条件助记符(参考下面的cond)
ben
条件执行
ARM中大部分的指令都支持带条件执行。
cond:前四位保存条件码
比较指令的大用处
Compare 指令:cmp r0,#1
完成操作:减法运算(不保存结果)
根据结果更新标志位
标志寄存器
APSR 寄存器
标志寄存器是条件执行的基础。
N、Z、C、V用于条件标志位
N - 负数标志位
Z - 零标志位
C - 进位标志位
V - 溢出标志位
比如,若减法运算之后为负数,则N为1;为0,则Z=1;
一些会修改标志位的指令
1. 指令后缀带S的指令,例如(MOVS)
2. TST(and)、TEQ(or)、CMN(add)、CMP(sub)
例如MOVS之后的到的值为0,那么Z就被置位(为1)
完整一点的例子
这里if有两种可能,一种是a<=10,一种是a>10;
在汇编中先cmp a,#10
然后选择if括号内相反的选项 bgt next1 (大于则跳转出去)
然后在这中间填入if代码块中的内容
实例分析
打开程序
导出表
libcinit的第三个参数(R2)是main函数的地址
跳入main函数之后发现IDA未能把ARM指令集识别正确。需要手动(ALT+G)
随便输入一个不等于0x0的数
全部改好之后就识别出来了
程序源码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30int ()
{
int a = 0,b = 0;
printf("This is condition statements re test!nPlease input two number:");
scanf("%d%d",&a,&b);
if(a + b == 10)
{
printf("[if]a+b=10b");
}
if(a > b){
printf("[if-else-1]a > bn");
}else if(a == b){
printf("[if-else-if] a==bn");
}else{
printf("[if-else] a
}
if(a > 10)
{
if(a <= 20)
{
printf("[nest if]n");
}
printf("a > 10n");
}
return 0;
}
自己调试一下
生成thumb代码
BL的下一条指令的地址被保存在LR寄存器中
调用gcc的内建函数,R0作为参数
R1=LR=57C(待调试) R1=R1+2=57E(待调试) 地址做移位是为了对齐(如这里的R1),而数移位是为了做乘除法(如这里的R0)
LSRS: R1=R1右移两位
LSLS:R0=R0左移两位=R0*4
LSLS:R1=R1左移两位 //先右移再左移,清除R1原来的最低位,用于对齐,得到0x580(待调试)
LDR:R0=[R1+R0] =[580+原来的R04] //假设原来的R0=1,则R0=[580+原来R04]=[580+4]=[0x584]=loc_59C-0x580
ADDS: R0=R0+R1=loc_59C
MOV: LR=loc_59C
POP: 恢复寄存器R0,R1
MOV: PC=loc_59C;函数结束,跳转到case:选中的代码块
这些不是代码,是长为4字节的数据项,每一项都是偏移值,这个偏移值+0x580就能找到真正的代码
生成ARM代码
ADDLS:PC=PC+(R3*4)
PC的PC寄存器指向的不是下条指令,是下下条指令(也就是当前指令地址+8)CEMU测试bl funl //把LR设置为BL指令的下一条地址fun1:mov r0,pcmov r1,lr
差了8个字节
关于ARM中的寄存器PC
从图中可以看出,一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,紧接着就是第二条指令的取指,然后第三条…如此嵌套
其实很容易看出,第一条指令:
add r0, r1,$5
取指完成后,PC就指向了第二条指令,此时PC=PC+4
当第一条指令译码完成以后,此时PC=PC+8
所以第一条指令开始执行时,PC值已经加了8
所以必须记住这个前提,在arm中,每次该指令执行时,其实这时的PC值是PC=PC+8
而且这个前提也同样适合多级流水线,原因就不解释了
android arm 寄存器,ARM汇编相关推荐
- ARM知识扫盲-RISC架构-ARM寄存器-ARM指令集
文章目录 简介: ARM寄存器 特殊寄存器 ARM指令集 简介: ARM本身使用的是RISC精简指令集架构,除此之外还有开源的RISC指令集架构RISC-V,复杂指令集CISC(Complex Ins ...
- 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42375701 相关资源下载 : -- 三星 ARM Archit ...
- linux arm寄存器,ARM寄存器总结
ARM处理器共有37个寄存器: 1) 31个通用寄存器,包括程序计数器(PC).这些寄存器都是32位的: 2)6个状态寄存器.这些寄存器也是32位的,但是只使用了其中的12位. ARM通用寄存器 通用 ...
- ARM体系结构与汇编指令
可编程器件的特点 • CPU在固定频率的时钟控制下节奏运行. • CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行. • 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的 ...
- ARM处理器的运行模式和ARM寄存器
一.ARM处理器共有7种运行模式 处理器模式 描述 用户模式(User,usr) 正常程序执行的模式 快速中断模式(FIQ,fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ,irq) 用于 ...
- 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...
- 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )
文章目录 一.使用 IDA 打开 arm 动态库文件 二.切换 IDA 中汇编代码显示样式 一.使用 IDA 打开 arm 动态库文件 分析 Android SDK 中的 arm 架构的动态库 , 动 ...
- ARM处理器寄存器和汇编指令系统
1.ARM的处理器模式 ARM体系结构支持7种处理器模式,分别是:用户.FIQ.IRQ.管理.中止(abort).未定义和系统模式.除了用户模式外,其余都称之为特权模式.除了用户和系统模式外,其余都称 ...
- ARM 内联汇编-1
转自:(72条消息) 10. ARM 内联汇编学习笔记_天昼AI实验室的博客-CSDN博客_armv8 内联汇编 基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~ AR ...
最新文章
- java for 删除 list 中的项
- php udp发送和接收_php socket通信(tcp/udp)实例分析
- python计算出nan_python如何进行汇总统计?
- 036_jQuery Ajax全局回调函数
- MATLAB实战系列(九)-遗传算法(GA)求解旅行商问题(TSP)思路解析
- PHP artisan auth,Php artisan make:auth命令未定义
- fcfs调度算法_FCFS:先来先服务调度算法
- python bytes 改值_python3 bytes 和 string转换
- python如何把数字转化成字符_python 定义一个dictpython如何将数字转化为字符串
- 研究机构:苹果M1芯片代工订单占台积电5nm工艺25%产能
- screen 命令示例:管理多个终端会话
- pku 3533 Light Switching Game(nim 积)
- NES模拟器[H_NES]
- mysql姓名三位随机_Mysql之生成随机数,随机字符串,随机姓名
- [经验分享]大锤教你如何十倍速读一本书
- gcc -O0 -O1 -O2 -O3 -Os 编译优化等级
- 2021-2027全球与中国巡航型摩托车市场现状及未来发展趋势
- 见过的最全的iOS面试题
- 一度智信:如何提高自己的电商店铺权重
- java点赞功能的实现,类似微信点赞,用户仅能点赞一次,基于redis进行操作
热门文章
- 一招上手!这样设计扛住亿级流量活动系统
- 小困惑,关于 Serverless 函数计算的字体安装
- 【快讯】呼伦贝尔市人民医院利用Oracle APEX快速开发预检分诊系统
- 用Java开发自己的Kubernetes控制器,想试试吗?
- 边缘计算高考题!全答对就可以去华为上班!
- Cloud一分钟 |2018天猫双11结果出炉:2135亿;工信部透露:6G概念研究也在今年启动;英特尔39款至强新处理器曝光...
- 用计算机算小学题目,小学计算机入编考试考试试题.doc
- app inventor离线版_百度要哭了!今日头条出了搜索引擎了,还做了APP
- mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数
- 三角形已知边长求高公式_五年级数学:“长方形、正方形、三角形、平行四边形、梯形” 知识重点、难点全解析,附习题!...