ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器,总共33个寄存器,在特定的态下会使用其各自的特有的备份寄存器。一般用户态常用的通用寄存器为r0-r12。而r13用作堆栈指针sp,r14用作返回地址lr,r15用作程序计数器pc。

另外还有一个状态寄存器CPSR,在用户态和系统态还各自有一个用于备份的SPSR寄存器,用于在退出其它态时恢复CPSR。

ARM有两种指令集分别为arm指令和thumb指令,指令长度固定,分别是32位和16位。

arm指令不能直接对内存进行运算,没有串传输指令。

arm指令可以同时对状态标志进行判断,如addeq, movne, bcc。我猜这个指令特性可以减少许多在运算中的跳转,降低分支命中出错,或避免像x86越来越复杂的指令预取和分支预测技术。

arm和x86各有所长各有所专,系统平台也一样。

arm32 与 x86 寄存器类比:

arm32 x86
r0-r7

eax, ebx, ecx, edx, edi, esi, ebp (还少一个)

r8-r12

 
r13 esp
r14  
r15 eip
CPSR flags

常用指令类比:

arm32           x86

str r0, [r1]         mov [r1], r0         movl %r0, (%r1)

ldr r0, [r1]         mov r0, [r1]         movl (%r1), %r0

str r0, [r1, r2]        mov [r1+r2], r0

ldr r0, [r1, r2]        mov r0, [r1+r2]

str r0, [r1, #4]       mov [r1+4],  r0

ldr r0, [r1, #4]       mov r0, [r1+4]

str r0, [r1, r2, LRL #3]   mov [r1+r2*8], r0

str r0, [r1, r2, LSR #3]   mov r3, r2                       x86须借用r3作中间运算

              shr r3, 3          

              mov [r1+r3], r0

ldr r0, =0xcdcdcdcd      mov r0, [0cdcdcdcdh]

ldr r0, [r1], #4       mov r0, [r1]

              lea r1, [r1+4]

ldr r0, [r1], LRL #3     mov r0, [r1]

              shl   r1, 3

ldr r0, [r1], r2, LRL #3   mov r0, [r1+r2*8]

              lea r1, [r1+r2*8]

ldr r0, [r1, #4]!       lea r1, [r1+4]

               mov r0, [r1]

ldr r0, [r1, r2, LRL #3]!   lea r1, [r1+r2*8]

               mov r0, [r1]

ldmfd sp!, {r0-r3}      pop r0

              pop r1

              pop r2

              pop r3

stmfd sp!, {r0-r3}     push r0

              push r1

              push r2

              push r3

stmfd sp, {r0-r3}       mov [esp], r0

              mov [esp-4], r1

              mov [esp-8], r2

              mov [esp-12], r3

add r1, r1, r2, LRL #3   lea r1, [r1+r2*8]

add r0, r0, #4       add r0, 4

add r0, r0, r1        add r0, r1

sub r0, r0, r1        sub r0, r1

sbc r0, r0, r1        sub r0, r1

rsb r0, r0, r1, #4      lea r2, [r1+4]

              sub r2, r0

              mov r0, r2

smull r0, r1, r2, r3     mov eax, r2

              mul r3

              mov r0, eax

              mov r1, edx

smlal r0, r1, r2, r3     mov eax, r2

              mul r3

              add r0, eax

              adc r1, edx

and r0, r0, r1        and r0, r1

orr  r0, r0, r1        or r0, r1

eor r0, r0, r1        xor r0, r1

bic r0, r0, r1        mov r2, r1

               not r2

               and r0, r2

mvn r0, r1         mov r2, r1

               not r2

               mov r0, r2

mvn r0, r1, #-1        mov r2, r1

              neg r2

              mov r0, r2

mvn r0, r0, #-1       neg r0

tst r0, r1          test r0, r1

teq r0, r1           mov r2, r1

              xor r2, r0

              test r2, r2

bl             call          ; 自动 mov lr, pc,保存返回地址

b              jmp

bx               jmp         ; 带模式切换,自动修改cpsr寄存器的控制域。

bgt             jg          ; 根据标志位N(SF),V(OF)

blo             jb           ; 根据标志位C(CF),Z(ZF)

beq             je

bne             jne

addeq r0, r0, r1       jne $+n

              add r0, r1

ldrb r0, [r1]       movzx eax, byte ptr[ebx]

ldrsb r0, [r1]       movsx eax, byte ptr[ebx]

ldrh   r0, [r1]       movzx eax, word ptr[ebx]

ldrsh  r0, [r1]       movsx eax, word ptr[ebx]

strb r0, [r1]       mov byte ptr[ebx], al

strh  r0, [r1]       mov word ptr[ebx], ax

ldr r0, [r1. #0x4]!      lead eax, [ebx+0x4]

               mov eax, dword ptr[ebx]

arm数据传送指令方向注意事项:

arm数据传送指令分为两类,分别是ld(load Ld <-- Rs)和st(store Ls --> Rd);其它为默认方向。不同于x86指令(intel风格:左目标右源,at&t风格左源右目标)统一固定操作方向。

修改日期:2016.8.7

1.str r0, [r1, r2, LSR #3],格式修正。

2.arm数据传送指令方向注意事项。

修改日期:2015.12.25

1. 31个通用寄存器和33个通用寄存器的区别在于,后者多了一个安全监视态。

2.bgt与blo,跟x86的jb与jl类比不适当。

3. 追加对内存进行字节,字传输指令类比。

修改日期: 2017.11.10

1. 添加感叹号语句

转载于:https://www.cnblogs.com/bbqzsl/p/5070035.html

开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比相关推荐

  1. 第一课 逆向分析基础知识

    看雪软件安全论坛 > 初学者园地 > 『伴你成长』 > 『资料导航』 加密与解密 解密分析入门基础知识 欢迎您,youcou 您上次访问的时间是: 2009-09-23,23:53 ...

  2. 逆向分析基础 --- 花指令实现及清除

    一.基本概念 花指令:目的是干扰ida和od等软件对程序的静态分析.使这些软件无法正常反汇编出原始代码. 常用的两类反汇编算法: 1.线性扫描算法:逐行反汇编(无法将数据和内容进行区分) 2.递归行进 ...

  3. 下标索引必须为正整数类型或逻辑类型_python量化基础 | 变量和简单的数据类型,零基础都可以看懂...

    编辑 | Cowboy 校对 | 李明 来源 | 牛角财经 目的 | python量化基础 | 变量和简单的数据类型,零基础都可以看懂!!! python教程 从入门到高级(免费) 特点:案例基于金融 ...

  4. ArcGIS Pro 简明教程(2)基础操作和简单制图

    ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...

  5. Java数字图像处理基础-------Java Swing简单使用,图形绘画---画五角星

    Java数字图像处理基础-------Java Swing简单使用,图形绘画-画五角星 一:简介 要画出五角星出来,我们只需要在面板上产生5个点,然后把这5个点进行连接就可实现: 二:代码演示 imp ...

  6. 计算机网络应用最简单的,计算机网络的基础知识和简单应用.ppt

    文档介绍: 第8章计算机网络的基础知识和简单应用学****内容:计算机网络基本概念;因特网初步;因特网的服务功能.泊罩制藩往巍趋态拯巧郸嘘橡唤姬恍退戏付永缺彪崭嘶律旁炸雹蜡溪大相计算机网络的基础知识和 ...

  7. Java基础之泛型简单讲解(通俗易懂)

    Java基础之泛型简单讲解(通俗易懂) 1. 前言 2. 简单例子对比理解 2.1 未使用泛型例子--ArrayList 2.2 使用泛型的例子 2.2.1 ArrayList 举例 2.2.2 Ha ...

  8. Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

    Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表.地图) 目录 Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表.地图) 一.简单介绍 二.环境搭建 三.使 ...

  9. C++基础语言熟悉---简单画板绘制

    C++基础语言熟悉-简单画板绘制 *介绍 学一门语言最好的方法就是通过各种项目实战来巩固基础语法,使之烂熟于指尖! 小白第一次模仿创作,如有错误及更好的补充还请各位不吝赐教! 代码分析 1.创建窗口 ...

最新文章

  1. Java项目:医院分诊挂号住院管理系统(java+SpringBoot+FreeMarker+Mysql)
  2. 21个令程序员泪流满面的瞬间
  3. swiper超出部分出现滚动条
  4. 吴恩达家免费NLP课程上线啦!
  5. codeforces1453 D. Checkpoints
  6. emoji .png_根据我对3.5GB聊天记录的分析,Emoji开发人员使用最多
  7. Java线程的使用及共享协作
  8. 七牛云与python交互的教程
  9. python datetime to timestamp_python timestamp和datetime之间转换详解
  10. java中mvc事务_Spring MVC 事务配置
  11. NTKO控件的一些基本方法属性
  12. 各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理
  13. Linux安装 deb包命令
  14. JavaScript网页设计:用户登录页面
  15. kubernetes中显示所有命名空间中的deployment、Pod以及所有的Pod对应的命名空间
  16. 切比雪夫不等式证明及应用
  17. python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程
  18. 阿里巴巴图标库的字体图标使用方法
  19. python中删除list中某指定元素
  20. Python根据经纬度生成并调用地图

热门文章

  1. 利用抽象语法树检查Python中“未定义”的变量名
  2. HSI颜色空间及其应用
  3. 深度学习 vs. 概率图模型 vs. 逻辑学
  4. Linux下基本栈溢出攻击【转】
  5. Exact跻身全球发展最快的云企业行列
  6. 《CUDA C编程权威指南》——3.4 避免分支分化
  7. Linux局域网搭建
  8. TYAN_S8230做硬Raid
  9. Android开发各类常见错误解决方案
  10. 重温JavaScript