android arm 寄存器,ARM汇编

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Android Native 进程启动流程

8ek7b9Jk2K.png?imageslim

mJkdiFL95I.png?imageslim

ARM传参,R0-R3传递前四个参数

1. Thumb 指令集特点Thumb 指令集指令长度:16或32,16为为主

Thumb-16 大部分只能访问前8个寄存器 R0-R7(少数可以访问R8-R15)

Thumb-32 可以访问所有的ARM core 寄存器 R0-R15

更小、更加灵活

3F7Kh72CcJ.png?imageslim

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

HefgcabdgD.png?imageslim

4. IDA 中识别与切换指令集Edit->segments->change segment register value(快捷键ALT+G)

请看操作。

这有一段指令,判断出目前是thumb指令集的

bDfa164Gm2.png?imageslim

L44GbeBb0g.png?imageslim

按下ALT+G,把0x1改成0x0,就是指定为ARM指令集

m6cmAKf7f1.png?imageslim

然后按下P键定义函数,函数参数就都分析出来了(

5. ARM切换指令集原理处理器无论在ARM还是Thumb状态下都可以通过BX/BLX/LDR/LDM切换不同的指令集。

状态切换是由寄存器Rn的最低位来指定的,如果操作数寄存器的状态位Bit0=0,则进入ARM状态,如果Bit0=1,则进入Thumb状态。

ARM 中对于字节、字、双字的定义

42LgAImG8C.png?imageslim

注意和intel汇编的区别,一个word(字)这里是4个字节

k6BCjcgdHD.png?imageslim

但是注意一下,在IDA中依然延续着老的传统,一个DCW(word)代表两个字节DCB 定义1字节数据

DCW 定义2字节数据

DCD 定义4字节数据

在IDA中,在上面这些数据定义上按下D键可以切换定义的类型

Array 定义数组,右键或*号键

数组最常见的就在数组,

IDA中的自定义数据类型

Structures 窗口中可以创建一个自定义结构体。按下I或者Ins键即可创建。

JGdKAA9LFK.png?imageslim

6BhFchfIi3.png?imageslim

创建了一个名为test的结构体

dK8d27jgfb.png?imageslim

因为没有定义字段,所以现在都还是空的,结构体长度为0(相当于空结构体,没有任何内容)

所以去定义字段。

为自定义数据类型添加字段

创建完结构体后,长这样:

GmCIi75chL.png?imageslim

在ends处按下D键就可以定义一个字段了,在字段上按D可以改变长度1/2/4

其他按键:

fJeKmkHmL6.png?imageslim

Hl91i5EjJE.png?imageslim

F9JfJKKKBG.png?imageslim

这样就可以给一个变量转成自己的结构体类型

6llGaFG7k6.png?imageslim

应用自定义数据类型

在起始数据处右键->Structure->自定义的数据类型

e5bagIfbfD.png?imageslim

ARM汇编中的标志寄存器与条件代码

跳转指令b指令:跳转

bl指令:跳转且保存返回地址

blx/bx指令:带x,可以切换指令集

分支指令例子:

beq=b+eq(equal)=b指令+条件助记符(参考下面的cond)

ben

条件执行

ARM中大部分的指令都支持带条件执行。

aFcH160afA.png?imageslim

cond:前四位保存条件码

8ecida68KH.png?imageslim

比较指令的大用处

Compare 指令:cmp r0,#1

完成操作:减法运算(不保存结果)

根据结果更新标志位

标志寄存器

APSR 寄存器

I6IjBIEGhG.png?imageslim

标志寄存器是条件执行的基础。

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)

完整一点的例子

debffk3A60.png?imageslim这里if有两种可能,一种是a<=10,一种是a>10;

在汇编中先cmp a,#10

然后选择if括号内相反的选项 bgt next1 (大于则跳转出去)

然后在这中间填入if代码块中的内容

实例分析

打开程序

eAf963eelJ.png?imageslim

导出表

65Ab19GkKH.png?imageslim

ijeK017DDJ.png?imageslim

libcinit的第三个参数(R2)是main函数的地址

kljAI65kFj.png?imageslim

跳入main函数之后发现IDA未能把ARM指令集识别正确。需要手动(ALT+G)

DLeG0i8IIb.png?imageslim

dmfLIFbgC6.png?imageslim

随便输入一个不等于0x0的数

全部改好之后就识别出来了

2JFelgFi6a.png?imageslim

程序源码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;

}

自己调试一下

I58CbF6A6C.png?imageslim

生成thumb代码

jkcGKL7fbH.png?imageslim

BL的下一条指令的地址被保存在LR寄存器中

调用gcc的内建函数,R0作为参数

7EilLlHJfE.png?imageslim 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:选中的代码块

7dha4ei960.png?imageslim

这些不是代码,是长为4字节的数据项,每一项都是偏移值,这个偏移值+0x580就能找到真正的代码

生成ARM代码

e64JgLd8gc.png?imageslim

ADDLS:PC=PC+(R3*4)

PC的PC寄存器指向的不是下条指令,是下下条指令(也就是当前指令地址+8)CEMU测试bl funl //把LR设置为BL指令的下一条地址fun1:mov r0,pcmov r1,lr

KKmHecaK8C.png?imageslim

D69cGmkeCF.png?imageslim

G319AEKc61.png?imageslim

k7eHK6CLmf.png?imageslim

4FgIA8aDcm.png?imageslim

差了8个字节

关于ARM中的寄存器PC

8Fg5394hJj.png?imageslim

从图中可以看出,一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,紧接着就是第二条指令的取指,然后第三条…如此嵌套

其实很容易看出,第一条指令:

add r0, r1,$5

取指完成后,PC就指向了第二条指令,此时PC=PC+4

当第一条指令译码完成以后,此时PC=PC+8

所以第一条指令开始执行时,PC值已经加了8

所以必须记住这个前提,在arm中,每次该指令执行时,其实这时的PC值是PC=PC+8

而且这个前提也同样适合多级流水线,原因就不解释了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何制作印章_用Word也能做出逼真的电子印章!简单3步!1分钟搞定

我们在办公的时候经常需要用到印章&#xff0c;以前可能是在纸上盖章&#xff0c;现在电子文档比较多&#xff0c;电子印章也开始流行使用&#xff0c;那么我们如何制作一个逼真的印章呢&#xff1f;很简单&#xff0c;用Word就可以搞定啦&#xff01;一、印章制作1、圆圈制作首…

鸿蒙唯独没有手机,想用鸿蒙OS,却没有华为手机?华为高层:还有1亿台设备可体验...

不再是PTT系统&#xff01;鸿蒙OS真的要来了&#xff0c;年内初步实现全场景交互从2019年开始&#xff0c;有关 鸿蒙OS 的消息越来越多&#xff0c;不仅公布了发展规划&#xff0c;也确定将适配多款机型&#xff0c;期待度直接拉满。可惜以目前的情况来看&#xff0c;鸿蒙OS 适…

@kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1)

控制反转 IOC&#xff1a;控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff…

keras优化算法_目标检测算法 - CenterNet - 代码分析

代码出处吃水不忘打井人&#xff0c;分析github上的基于keras的实现&#xff1a;xuannianz/keras-CenterNet​github.com代码主体结构模型训练的主函数流程如下所示&#xff0c;该流程也是使用keras的较为标准的流程。其中代码篇幅较大的是数据准备的部分&#xff0c;通常的代码…

c语言中创建一个整数数组_VBA中动态数组的创建及利用方法

大家好&#xff0c;后疫情时代一定会到来&#xff0c;各行各业&#xff0c;都将是一场战胜萧条的无声的战役。无论怎样&#xff0c;我们一定要坚信&#xff0c;疫情终将会过去&#xff0c;曙光一定会到来。后疫情时代将会是一个全新的世界&#xff0c;很多理念都将被打破&#…

用计算机求函数公式,计算机常用的函数公式有哪些?

01计算机常用的函数公式包括RANK函数、COUNTIF函数、IF函数、ABS函数、AND函数、AVERAGE函数、COLUMN 函数等。RANK函数是Excel计算序数的主要工具&#xff0c;它的语法为&#xff1a;RANK(number&#xff0c;ref&#xff0c;order)&#xff0c;其中number为参与计算的数字或含…

golang 读取文件最后一行_python3从零学习-5.4.3、文件输入流fileinput

源代码: Lib/fileinput.py此模块实现了一个辅助类和一些函数用来快速编写访问标准输入或文件列表的循环。 如果你只想要读写一个文件请参阅 open().典型用法为:import fileinputfor line in fileinput.input(): process(line)这将遍历sys中列出的所有文件的行。argv[1:]如果…

云计算机具体应用场景,云计算的定义、类型及应用场景

云计算是20年来IT行业出现的最激动人心且最具颠覆性的技术&#xff0c;甚至比大型主机向客户端/服务器架构的迁移还更具颠覆性。无论是IT服务的交付方式&#xff0c;还是企业消费这些IT服务的方式&#xff0c;都因云计算而改变。用户也正在快速应对新架构带来的变革&#xff0c…

dataframe for循环 筛选_Python循环12种超强写法,又快又省内存

0 前言说到处理循环&#xff0c;我们习惯使用for, while等&#xff0c;比如依次打印每个列表中的字符&#xff1a;在打印内容字节数较小时&#xff0c;全部载入内存后&#xff0c;再打印&#xff0c;没有问题。可是&#xff0c;如果现在有成千上百万条车辆行驶轨迹&#xff0c;…

html5文字飞入插件,jquery使用CSS3实现文字动画效果插件Textillate.js

jquery使用CSS3实现文字动画效果插件Textillate.jsTextillate是一款基于CSS3动画效果的 JavaScript 库&#xff0c;您可非常轻轻松地把这些动画效果应该于网页中的任何文字。使用方法引入核心文件构建html标签My Title写入JS&#xff0c;初始化$(function () {$(.tlt).textilla…

工业机器人导轨 百度文库_工业机器人或许开创一个全新的PLC时代

自机器人诞生之日起人们就不断地尝试着说明到底什么是机器人。但随着机器人技术的飞速发展和信息时代的到来&#xff0c;机器人所涵盖的内容越来越丰富&#xff0c;机器人的定义也不断充实和创新。机器人技术作为20世纪人类最伟大的发明之一&#xff0c;自20世纪60年代初问世以…

银联分账与银联代付_第三方分账系统到底有哪些作用?

随着监管越来越严&#xff0c;业务越来越复杂&#xff0c;所有平台电商企业都需要通过第三方分账系统解决支付清算及二清等问题。作为第三方分账系统行业从业者&#xff0c;整理了部分关于系统的相关问题及解答&#xff0c;希望对大家有所帮助。问题一&#xff1a;第三方分账系…

计算机更改桌面,2010年职称计算机考试:更改桌面背景和颜色

Windows XP提供了各种桌面的颜色和背景方案,用户可以根据自己的爱好进行选择。颜 色充当桌面的最底层,背景覆盖于颜色之上。(l)桌面背景的更改在"显示属性"对话框中,选择"桌面"选项卡。在"桌面"选项卡上有一个"背景"列表框,选择列表框…

dell t40 固态系统盘_笔记本怎么安装固态硬盘 笔记本安装固态硬盘教程【详解】...

首先我不得不介绍一下我这古董级别的笔记本 硬件升级&#xff0c;然后给大家介绍一下笔记本安装固态硬盘的教程。dell戴尔1320&#xff0c;cpu t6500 主频2.1ghz 。内存运用了淘汰的ddr2 分别是两条1g&#xff0c;共2g 800频率。这样的古董用的着用固态么?SATA2.0接口完全成为…

如何进入zabbix的wab界面_如何不用光盘重装系统呢?

如果身边没有系统光盘如何重装系统呢&#xff1f;小鱼系统可以帮助你一键重装系统和U盘重装系统的方法&#xff0c;下面一起看下小鱼系统教你的如何不用光盘重装系统吧。一键重装系统方法1、首先请备份好电脑C盘重要资料&#xff0c;然后打开【小鱼系统】&#xff0c;进入电脑环…

全国高中计算机大赛,2019年含金量最大的中小学全国性竞赛活动——五大学科竞赛...

五大学科竞赛历史是我国含金量最高的中小学全国性竞赛活动&#xff0c;在各高校自主招生过程中&#xff0c;具有较高的参考价值。对相关方面有一定兴趣的同学&#xff0c;也可以积极参与。五大赛面向的对象都是高中学生。一、全国中学生数学奥林匹克竞赛此项竞赛的主办单位是中…

单片机红绿灯电路灯有几种_新农村建设的太阳能路灯如何选择?

随着我国城乡一体化发展进程&#xff0c;城乡道路照明已成为新农村建设必不可少的一部分。目前市面通用的道路照明有两种&#xff1a;即市电路灯照明&#xff08;市电220V&#xff09;和太阳能路灯照明。安装简便且不需要布线的太阳能路灯在新农村建设中应用广泛&#xff0c;下…

lr不能直接转ps编辑_摄影后期调色软件,Lr软件包

摄影后期调色除了用到PS软件还有一款与之媲美的就是LR软件了&#xff0c;全名是Adobe Lightroom&#xff0c;喜欢拍照的人&#xff1b;总会希望自己拍下来的照片更好看&#xff0c;不管是多好的器材直出的 jpg 本身总会多多少少有一些限制&#xff0c;而利用后期软件可以很好的…

hive中如何把13位转化为时间_重要知识点收藏 | Hive常用函数大全

关系运算1、等值比较: 语法&#xff1a;AB操作类型&#xff1a;所有基本类型描述: 如果表达式A与表达式B相等&#xff0c;则为TRUE&#xff1b;否则为FALSE举例&#xff1a;hive>select 1 from lxw_dual where 11;12、不等值比较: <>语法: A <> B操作类型: 所有…

一加6html查看程序,一加6T评测:极速屏下指纹,解锁你想要的轻快顺滑

【PConline 评测】作为年末旗舰机阵营的新成员&#xff0c;一加6T选在11月5日正式在国内市场亮相。这款充满极客味道的手机早期已经获得了许多海外用户的好评和关注&#xff0c;全新加入的光感屏幕指纹&#xff0c;历来以轻快流畅著称的系统体验&#xff0c;让一加6T再一次成为…