1、汇编基础

一、汇编基础

1.1 汇编概述

  • 借助助记符代替机器指令的一种编程语言.
  • 汇编和机器指令是一一对应的关系, 拿到二进制就可以反汇编.
  • 由于汇编和CPU的指令集是对应的,所以汇编不具备移植性.

1.2 总线

总线: 是有一堆导线的集合

  • 地址总线: 它的宽度决定了寻址能力
  • 数据总线: 它的宽度决定了CPU数据的吞吐量

1.3 汇编基础用法

ENTRY  			用于指定汇编程序的入口。一个程序至少有一个入口点,也可有多个入口点,但是在一个源文件中,最多只能有一个ENTRY。
END    			在源文件结束处写上,表示源程序的结尾。
mov a,b  		数据传输指令: a = b
ldr r1,= 0x123456789 大范围的地址读取指令,r1 = 0x123456789
ldr r1,[r2,#4]  内存访问指令,当ldr后面没有=号时为内存读取指令:将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作
ldr r1,[r2],#4  将内存地址为r2的数据读取到r1中,再将地址加4,r2 = r2+4
str r1,[r2,#4]  存储指令:将r1的值存入地址为r2+4的内存中
str r1,[r2],#4  将r1的值存入地址为r2的内存中,再将地址加4,r2=r2+4
add r1,r2,#1    加指令:r1=r2+1
sub r1,r2,#1    减指令:r1=r2-1
mul r1,r2,#4    乘法指令:r1=r2*4
b,bl            相对跳转指令,区别在于bl除了跳转以外,还将返回地址(bl的下一条指令地址)保存在lr寄存器中
cmp        		比较指令
ret         	返回主程序
call        	调用子程序,子程序以ret结尾
jmp        		跳转
jz/je        	相等则跳转
jnz/jne         不相等则跳转
OR        		或运算/按位或
XOR         	异或运算
NOT        		取反
SHL         	逻辑左移
SHR        		逻辑右移
CBZ        		比较Compare,如果结果为零(Zero)就转移(只能跳到后面的指令)
CBNZ       	    比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)

二、进制:

  • 任意进制,都是由对应个数的符号组成的,符号可以自定义
  • 2/8/16是相对完美的进制, 他们之间的关系
    • 3个二进制位 使用一个8进制标识
    • 4个二进制位 使用一个16进制标识
    • 2个十六进制可以标识一个字节
      数量单位
    • 1024 = 1K; 1024K = 1M; 1024M = 1G
    • B: byte(字节) 1B = 8bit
    • bit(比特): 一个二进制位
      数据的宽度
    • 计算机中的数据是有宽度的,超过了就会溢出

三、寄存器

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

3.1 高速缓存

  • iPhoneX上搭载的ARM处理器A11 ,它的一级缓存的容量是64KB, 二级缓存的容量8M.
  • CPU每执行一条指令前都需要从内存中将指令读取到CPU内并执行.而寄存器的运行速度相比内存读写要快很多,为了性能,CPU还继承了一个高速缓存存储区域.当程序在运行时,先将要执行的指令代码以及数据复制到高速缓存中去(由操作系统完成),CPU直接从高速缓存依次读取指令来执行.

3.2 ARM64中

  • 64位: x0-x30, XZR(零寄存器)
  • 32位: w0-w30,WZR(零寄存器)
    注意
  • 8086汇编中有一种特殊的寄存器: 段寄存器:CS,DS,SS,ES四个寄存器来保存这些段的基地址,这个属于Intel架构CPU中,在ARM中并没有

3.3 常用寄存器

  • 浮点向量寄存器
    • 因为浮点数的存储以及其运算的特殊性,CPU中专门提供浮点数寄存器来处理浮点数.
    • 浮点寄存器64位: D0-D31; 32位: S0-S31
    • 现在的CPU支持向量运算(向量运算在图形处理相关的领域用得非常的多),为了支持向量计算,系统提供了众多的向量寄存器.
    • 向量寄存器 128位: V0-V31
  • 异常状态寄存器
    • ARM64中CPSR寄存器(32位)为状态寄存器
    • 最高4位(28、29、30、31)为标志位
    • N标志(负标记位)
      • 执行结果负数N = 1, 非负数N = 0
    • Z标识(0标记位)
      • 结果为0,Z = 1 ;结果非0, Z =0
    • C标志(无符号数溢出)
      • 加法: 进位C = 1;否则C = 0
      • 减法: 借位C = 0,否则C = 1
    • V标志(有符号数溢出)
      • 正数 + 正数 = 负数 V = 1
      • 负数 + 负数 = 正数 V = 1
  • 通用寄存器: 除了存放数据有时候也有特殊的用途
    • ARM64拥有32个64位的通用寄存器x0-x30以及XZR(零寄存器)
    • 为了兼容32位,所以ARM64用于W0-W28\ WZR 30个32位寄存器
    • 32位寄存器并不是独立存在的,比如w0是x0的低32位.
  • PC寄存器: 指令指针寄存器
    • PC寄存器里面的值保存的就是CPU接下来需要执行的指令地址
    • 改变PC的值可以改变程序的执行流程
  • 数据地址寄存器
    • 数据地址寄存器通常用作数据计算的临时存储、做累加、计数、地址保存等功能.定义这些寄存器的作用主要是用于在CPU指令中保存操作数,在CPU中当做一些常规变量来使用.

你可能感兴趣的:(iOS逆向,汇编,汇编指令,常用寄存器)