先看一下计算机运行过程的示意图:
就拿我们写的App来说, 它是躺在我们手机磁盘里的, 当我们点击App的时候, 程序启动, 我们写的那些代码就会被读进内存里, 然后CPU会读取内存中的数据, 并控制终端设备, 相反, 终端设备的一些交互会由CPU转换成数据写进内存里. (你可以大致这么理解).
那么, 汇编就是研究内存与CPU交互的关键所在, 计算机不懂什么高级语言, 汇编语言, 它知道的就是0, 1, 0, 1这些高频低频的电信号, 那么我们的高级语言是怎么转换成0, 1, 0, 1这些的呢? 汇编可以说起到了承上启下的作用:
汇编语言经过编译得到机器语言, 这样计算机就能够读懂了, 机器语言经过反编译会得到汇编语言. 因为一条汇编指令就对应一条机器指令, 所以我们可以通过一系列机器指令来推断出汇编的指令.
好了, 既然硬件中最为重要的就是内存和CPU, 汇编指令大部分也是与内存和CPU相关的, 那么内存与CPU之间是怎么交互的呢?
这里就要提到总线的概念:
每一个CPU芯片都有许多管脚, 这些管脚和总线相连, CPU通过总线跟外部器件进行交互, 总线就是一根根导线的集合. 那么总线的宽度就决定了数据传输的能力.
就像一根水管, 越粗, 流通的水量就越大. 我们可以理解为通量
总线的宽度越宽, 数据传输的通量就越大
总线分为以下三种:
-
地址总线的宽度决定了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个字节的数据.
我要开始盗图来说明问题啦:
-
最后一种, 控制总线的宽度决定了CPU对其他器件的控制能力, 可以有多少种控制
未完待续...