iOS逆向学习笔记2(CPU中的寄存器)

1 CPU的中的寄存器

  CUP除了有控制器、运算器之外,还有寄存器,寄存器的作用就是进行数据的临时存储的,如下图所示:
CPU结构图

  CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小块临时存储区域内进行。我们称这一小块临时存储区域为寄存器。
  对于ARM64系统的CPU来说,如果寄存器以x开头则表示这是一个64位的寄存器,如果以w开头则表明是一个32位寄存器,在系统中没有提过16位或8位的寄存器供访问和使用。其中32位寄存器是64位寄存器的低32位部分并不是独立存在的。

  • 对于程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制。
  • 不同的CPU,寄存器的个数、结构是不相同的。

2 寄存器的分类

  对于不同的学习目标,我们要深入了解的寄存器类型也不相同,因此对于逆向来开发来说,我们关注的重点就是通用寄存器,但也有对其他寄存器有所了解。

  1. 浮点寄存器:因为浮点数的存储以及其运算的特殊性,CPU中专门提供浮点数寄存器来处理浮点数。
  • 浮点寄存器,容量64位: D0 - D31 32位:S0 - S31
    查看方式:创建iOS项目,连接真机,设置断点并运行,执行到断点时,在调试窗口进行以下操作。


    浮点寄存器
  1. 向量寄存器:现在的CPU支持向量运算(向量运算在图形处理相关的领域用得非常的多),为了支持向量计算系统了也提供了众多的向量寄存器。
  • 浮点寄存器,容量128位:V0-V31
  1. 通用寄存器:也称为数据地址寄存器,通常用来做数据计算的临时存储、累计、计算或地址保存等用途,定义这些寄存器的作用主要是用于在CPU指令中保存操作数,在CPU中当做一些常规变量来使用。
  • ARM64拥有32个64位的通用寄存器x0到x30,以及XZR寄存器(零寄存器),这些通用寄存器有时也有特定用途。
  • w0到w28这些是32位的,因为64位CPU可以兼容32位,所以可以只使用64位寄存器的低32位,例如w0就是x0的低32位。
    查看方式:创建iOS项目,连接真机,设置断点并运行,执行到断点时,在调试窗口进行以下操作。
    通用寄存器

    注意:了解过8086汇编的同学可能知道,有一种特殊的寄存器段寄存器:CS、DS、SS、ES这四个寄存器来保存这些段的基地址,这个属于Intel架构CPU中,在ARM中并没有。

3 各个通用寄存器的用途以及如何使用汇编代码对其进行操作

3.1 从内存中读取数据到寄存器中

  通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算,例如下图:假设内存中有块红色内存空间值为3,现在想把它的值加1,并将结果存储到蓝色内存空间,如何使用汇编代码对其进行操作呢?


//1.将红色内存块中的数据放入x0寄存器中
mov x0, 红色内存地址
//2.将x0寄存器中的值加一运算结果放入x0中
add x0, 1
//3. 将x0寄存器中的值存储到蓝色内存块中
mov 蓝色内存地址, x0

3.2 pc(program counter)寄存器

pc寄存器:指令指针寄存器,它指示了CPU当前要读取指令的地址。
pc寄存器作用:因为在内存或者磁盘上,指令和数据是没有任何区别的,都是二进制信息,CPU在工作的时候将有的信息作为指令处理,有的信息当做信息处理,为同样的信息赋予了不同的意义,例如:二进制信息1110 0000 0000 0011 0000 1000 1010 1010可以当做数据0xE003008AA,也可以当做指令mov x0, x8,那么既然这样,CPU是如何区分这段二进制信息是指令或者是数据的呢?这时候,pc寄存器就要发挥它的作用了

  • CPU将pc寄存器指向的内存单元的内容当做指令执行
  • 如果内存中的某段内容曾被CPU执行过,那么它所在的内存单元必然被pc寄存器指向过。

3.2 高速缓冲区

  由上面可知,CPU每执行一条指令前都需要从内存中将指令读取到CPU内并执行,而寄存器的运行速度相比内存读写要快很多,为了性能,CPU还集成了一个高速缓存存储区域,当程序在运行时,先将要执行的指令代码以及数据复制到高速缓存中去(由操作系统完成),CPU直接从高速缓存依次读取指令来执行。

3.3 bl指令

  CPU从何处执行指令是由pc中的内容决定的,我们可以通过改变pc寄存器的内容来控制CPU执行目标指令,虽然ARM64提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如:mov x0, #10,但是mov指令不能用于设置pc的值,ARM64没有提供这样的功能,但是提供了另外一个指令来修改pc寄存器的值,这些指令统称为转移指令,最简单的就是bl指令

你可能感兴趣的:(iOS逆向学习笔记2(CPU中的寄存器))