iOS逆向之汇编基础知识(一)

先看一下计算机运行过程的示意图:
iOS逆向之汇编基础知识(一)_第1张图片
计算机运行过程的示意图

就拿我们写的App来说, 它是躺在我们手机磁盘里的, 当我们点击App的时候, 程序启动, 我们写的那些代码就会被读进内存里, 然后CPU会读取内存中的数据, 并控制终端设备, 相反, 终端设备的一些交互会由CPU转换成数据写进内存里. (你可以大致这么理解).

那么, 汇编就是研究内存与CPU交互的关键所在, 计算机不懂什么高级语言, 汇编语言, 它知道的就是0, 1, 0, 1这些高频低频的电信号, 那么我们的高级语言是怎么转换成0, 1, 0, 1这些的呢? 汇编可以说起到了承上启下的作用:
iOS逆向之汇编基础知识(一)_第2张图片
汇编

汇编语言经过编译得到机器语言, 这样计算机就能够读懂了, 机器语言经过反编译会得到汇编语言. 因为一条汇编指令就对应一条机器指令, 所以我们可以通过一系列机器指令来推断出汇编的指令.

好了, 既然硬件中最为重要的就是内存和CPU, 汇编指令大部分也是与内存和CPU相关的, 那么内存与CPU之间是怎么交互的呢?

这里就要提到总线的概念:
iOS逆向之汇编基础知识(一)_第3张图片
苹果A10处理器

每一个CPU芯片都有许多管脚, 这些管脚和总线相连, CPU通过总线跟外部器件进行交互, 总线就是一根根导线的集合. 那么总线的宽度就决定了数据传输的能力.

就像一根水管, 越粗, 流通的水量就越大. 我们可以理解为通量
总线的宽度越宽, 数据传输的通量就越大
总线分为以下三种:
iOS逆向之汇编基础知识(一)_第4张图片
总线的分类
  • 地址总线的宽度决定了CPU的寻址能力, 这是什么意思呢?

我们可以把内存理解为一个蜂巢快递的柜子, 你要找到快递的柜子, 就必须给柜子编号, 那么寻址能力就是给柜子编号的能力, 编了号, 你才能找到对应的柜子.

如果地址总线为1根, 那么寻址能力就是2^1, 要么0 , 要么1.寻址能力即为2.
如果地址总线为10根, 那么寻址能力就是2^10, 就是1024, 意思就是可以给柜子编号从0~1023.

那么8086CPU的地址总线为20根, 那么寻址能力就是2^20, 即(210)2, 即1024* 1024, 就是1M的寻址能力.

  • 那么, 数据总线的宽度决定了什么呢? 就是我刚才说的, 数据传输的通量

8086CPU的数据总线宽度是16, 可以传输的数据的长度是多少呢?
内存的最小但愿就是字节(byte), 一个字节是用8个比特位(bit)来表示的, 那么数据总线宽度为16, 就是8个bit位的2倍, 可以传输2个字节的数据.

假设现在有89D8H这一个16进制数据, 我想从内存中读取出来, 或者写到内存中去, 如果是8088的CPU, 将放电几次呢? 如果是8086的CPU, 又将放电几次呢?

首先, 1个16进制的数相当于2^4, 那么就是4个bit位, 那么两位16进制数, 对于二进制来说, 就是(2^4) * (2^4), 就是16个比特位, 8个比特位是1个字节, 那么2位的16进制数就相当于两个字节,

8088的数据总线宽度是8 , 相当于一次放电传输8个bit位的数据, 就是一个字节,
如果传输2个字节的数据, 需要放电2次

而8086的数据总线宽度是16, 所以, 它只需一次放电就可以传输2个字节的数据.

我要开始盗图来说明问题啦:

iOS逆向之汇编基础知识(一)_第5张图片
8088CPU传输2字节数据
iOS逆向之汇编基础知识(一)_第6张图片
8086CPU传输2字节数据
  • 最后一种, 控制总线的宽度决定了CPU对其他器件的控制能力, 可以有多少种控制

未完待续...

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

你可能感兴趣的:(iOS逆向之汇编基础知识(一))