汇编学习教程:来,认识一下CPU

引言

CPU估计是我们既熟悉又陌生的一个东西了,熟悉是大家都知道CPU就是计算机的大脑,由它控制着计算机,它处理各种数据,没有了CPU计算机就无法工作。陌生是,大家都知道它是大脑,但是这个“大脑”到底是怎么运行的,它是怎么就控制了计算机呢?它是如何和其他硬件进行交互呢?数据是如何处理呢?它的内部到底是怎么构成呢?那么今天,我们就来好好认识一下CPU,这个熟悉又陌生的家伙。

CPU

我们在课本上都学过计算机的发展历史,在计算机刚刚被发明出来的时候,占地有两间屋子那么大,使用打孔机进行编程。为什么计算机会那么的大?主要是CPU那里面有几千根的二极管占地方,没办法就需要两间屋子那么大才能放得下。那么为什么现如今我们的CPU又变的如此的小?这主要得益于人类材料学和工艺学的进步,有能力把二极管做的很小(即晶体管),现在指甲盖大小的CPU上能集成几十亿甚至上百亿根的晶体管。

纵然人类工艺再为先进,能把CPU缩的更小,实际上我们回头看看,现在的CPU和最初的CPU原理构造上基本还是相同的,变得只是工艺,CPU本身并没有颠覆性变化,最初是0和1,现在还是0和1。 现在各大芯片厂商想破脑袋拼命的把CPU制程缩小,甚至到了4纳米,这么做的目的无一例外就是为了放更多的晶体管,这样CPU单位时间内能处理的数据就越大,性能就越强劲。

从最初的二极管到如今的晶体管,无一例外就是用来表示0和1的两种电路状态,1表示通路,0表示断路,这样CPU依靠这些晶体管一个个的电路状态,便具备了数据处理能力。这也就是为什么机器(CPU)只能认识二进制的原因。

与CPU的沟通:汇编

汇编的产生

上面说到CPU只认识且只能处理二进制数据,也就是说,CPU内执行的机器码也是一串二进制数,所以在最早期的时候,程序员使用机器码进行编程,代码也就是一堆的01,打孔机的作用就好比是咱们现在的编译器,充当人类和机器进行交流的媒介。

但是很快,程序员们就发现直接用机器码编程那是非常的痛苦,往往一个很简单的指令可能就需要一长串的01才能实现。长还不是重点,关键人是很容易犯错误的,尤其是面对一大堆01这样枯燥的数字,极其容易或者不小心中间某一个0写成1,结果就会导致程序运行失败。运行失败还不是最令人糟心的,糟心的是你该如何在几十上百个01中找出某一处错误的01,这想想就会让人非常痛苦。

给出一个例子大家感受一下:

比如现在有这样一串机器码:011100110001100101011110110110001111001010101011110011,表示进行数字1+数字2的加法运算,你如果是最早期的程序员,你在卡片上写上如下的机器码:011100110001101101011110110110001111001010101011110011,然后你把卡片交给了打孔机,然后计算机运行你写的这个机器码,结果程序错误了。你费劲巴拉的就开始找到底是哪一个0和1写错了,最终看瞎了眼睛才终于发现了错误处。

这就是汇编产生的原因,本质上是为了方便程序员程序开发,降低编程难度。

汇编的组成

目前为止,汇编主要有以下三类组成:

1:汇编指令:对应固定的机器码,与机器码进行了关系绑定,也可以理解为机器码的助记符。在编译汇编程序的时候,编译器会自动将汇编指令转化为对应的机器码,以便机器执行。

例:mov ax,0,在编译时,编译器会把对应的mov指令转为机器码:1011100000000000

2:伪指令:没有对应的机器码,仅供编译器识别执行。可参考c程序中的#include。

3:其他符号,比如+、-、*、/,也是仅供编译器识别执行。例如程序中2+3,那么编译器就会先行计算好2+3的值,然后将结果转成机器码。

其中核心是汇编指令,也就是我们本系列课程所注重学习的部分。

CPU的小伙伴:存储器

通俗来说,就是运行内存。小伙伴估计都有给自己电脑加内存条扩容的经历,这个内存条就是存储器。CPU如果想进行运算和工作,那么就必须给它提供指令和数据,指令和数据都在我们的存储器中存放。

CPU数据交互

CPU眼中的内存:

从CPU的角度来审视内存空间,就是一条从下标0开始的直线,你可以想象成这是一条数组,数组中每一个单元称为“bit”,bit的内容就是0或1,每8个bit组成一个字节Byte。

在这条数组上塞着指令数据和数值数据,不管是一条指令还是一个数值,在CPU眼中中都是以二进制的形式存在。也就是说:

例:101110000000000000000000,它既可以看成指令:mov ax,0,也能看成数据B8000H。

至于什么时候看成指令,什么时候看成数据,取决于CPU的角度看法。

CPU的三大总线

CPU在运行中势必要对存储器进行读写操作,那么就涉及到以下三类信息交互:

1:地址信息:存储单元地址,你可以理解为上述‘数组’的下标

2:控制信息:读或者写的指令

3:数据信息:读或者写的数据

那么CPU如何做到和存储器(外部器件)进行交互呢?CPU也是一个电子元件,自然是要通过电路进行交互。如果是硬件工程师可能就会明白,CPU都是有好多突出的针脚,CPU通过针脚与主板接通,你可以把一个针脚看成是一个二进制位,针脚有电流输出就表示该位为“1”,没有电流输出就表示该位为“0”,这样,CPU就能对外发出01的二进制数据。与此同时,存储器上面也是会有一堆针脚,针脚与主板相连通,这样从CPU发出的二进制数据就会顺着主板上的电路传输到存储器中,存储器就知道CPU这个时候来话了。

我们把CPU上面的针脚,称之为“总线”。

存储器收到CPU的信息,不管是地址信息还是控制信息、数据信息,这些信息统统都是电信号,都是01,那么存储器该怎么知道某一时刻CPU发来的信息是地址还是控制、数据呢?所以人们为了做出区分,就对CPU的总线进行了划分,划分为三块:

1:地址总线,凡是从地址总线中发出的信息都是表示地址。

2:控制总线,凡是从控制总线发出的信息都是表示读或者写的指令。

3:数据总线,顾名思义,所有的待操作的数据都由数据总线发出,或者由数据总线送入CPU。

这样就能解释上面那个什么时候是指令是什么时候是数据的问题:从控制总线过来的,那么地址对应的数据就是指令;从数据总线来的,那么地址对应的数据就是数值或者数字。

举个例子,CPU要读取内存单元1地址的数据,首先通过地址总线发出地址信息1,然后通过控制总线告诉存储器要进行读取操作,待读取的数据地址是1,于是存储器便会把1单元下的数据通过数据总线送入CPU内。这样泾渭分明,就不会搞混啦。

地址计算

我们以8086CPU为例,8086CPU的地址总线有二十根,也就是二十位地址。那么对于8086CPU来说,它的最大寻址范围为0~FFFFFH。8086CPU的寻址方式为“基地址+偏移地址”,格式为“基地址:偏移地址”,基地址就是一个选定的某一地址,偏移地址就是基于基地址的基础上乘16的偏移大小。

例如:地址:2000H:1000H,基地址为2000H,偏移1000H,就是在2000H的基础上×16,再加上1000的偏移,最终实际地址为21000H,表示为2000H×16+1000H。

这里先说一下H,H表示该数字为16进制数,如果数字后面出现B,则表示该数字为2进制数字。

好现在开始解释疑问,为什么基地址×16加偏移是最终的实际地址?这是由于8086CPU的地址总线是20位的,但是它却是一个16位的CPU,也就说地址总线比CPU位数多出一个4个bit。如果8086CPU还是按照16位的地址信息发出,那么有4个bit就被浪费掉了,这样CPU寻址范围也会缩小,为:0~FFFFH。

为了不浪费地址总线资源,并且提高CPU的寻址范围,那么就势必要将16位的地址转化为20位的地址,于是人们还在CPU内部设计了一个地址加法器,由它通过计算,将两个16位的地址转变为一个20位的地址,这个计算的规则就是我们上面讲述的地址计算。

那么,为什么是✖16呢?地址2000H:1000H,我们如果想得到21000H,会发现需要2000H整体向前进一位变成20000H,然后20000H+1000H,就变成了21000H。那么如何将2000H变成20000H?如果这是10进制,2000如何变成20000呢,你不假思索就会说出当然是2000×10呗!那么现在2000变成十六进制20000H,需要乘多少呢?答案当然是✖16了!所以这就是基地址✖16的原因,因为基地址是一个十六进制数。

内存地址空间

我们都知道一台电脑上,可不单单只有CPU,内存条这两个电子器件,还有显示屏、音响、无线网卡、键盘、鼠标等多个电子器件。CPU与这么多的电子器件之间还存在一个物理连接桥梁,那就是主板,CPU控制和访问其他电子器件都是通过上述三大总线来完成,可以理解为三大总线是神经中枢,CPU就是大脑,其他器件就好比是身体里的各个器官。

不管是显示屏还是音响,CPU统统都是将他们看成一个个的内存地址,上面为我们也讲到,在CPU眼中内存就是一条从0开始的数组,在这个数组上就分布着显示屏、音响、无线网卡等等其他电子器件的内存地址,所谓的内存地址空间就是说规定了一段范围空间,来表示为某个电子器件的内存地址。

比如,以8086CPU为例,这条数组的总长度就是FFFFH,范围为0~FFFFFH(也就是寻址范围),那么规定0800H~9FFFH这段范围为显存地址空间,向该段空间内写入数据会被显示在显示屏上。

下图展示了8086CPU中大致的内存分配

 本片结束语

本篇博文主要介绍了CPU的大致运行原理和其他电子器件的交互逻辑,讲解了CPU的三大总线和8086CPU寻址计算,希望能给小伙伴们带来深刻的认识。下篇博文将会继续深入CPU,讲解它的内部构造,重点讲述寄存器。

感谢围观,转发分享请标明出处,谢谢!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值