为什么要学习汇编语言呢?
汇编语言,是除了机器语言外的最底层的编程语言了。学习这门语言,可以帮助我们更加深入地理解CPU、内存等硬件的工作原理。用机器的思维去操作计算机。汇编语言和机器语言是一一对应的,汇编语言被编译成机器语言,这样的程序执行效率更高。
什么是汇编语言?
汇编语言是直接在硬件之上工作的编程语言,学习汇编语言之前最好先了解一下计算机硬件系统的结构和工作原理。学习汇编语言的重点是学习如何利用硬件系统的编程结构和指令集进而有效地灵活地控制系统执行工作。
什么是机器语言?
机器语言是机器指令的集合。这些机器指令本质上就是由一组0和1组成的命令,是CPU唯一能解释执行的命令。举例如下:
01010000 机器指令 (对应 PUSH AX 汇编指令)
机器指令
计算机的底层用的是二进制,0和1,0表示“不打孔”,1表示“打孔”。机器语言的劣势是,一旦程序出了bug,很难排查错误,甚至是几乎不可能排查出错误。正是因为这样的原因,才有了汇编语言的产生。
关于汇编语言的产生
汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令的助记符,汇编指令是更便于记忆的一种书写格式。它较为有效地解决了机器指令编写程序难度大的问题,汇编语言与人类语言更接近,便于阅读和记忆。使用编译器,可以把汇编程序转译成机器指令程序。举例如下:
机器指令: 1000100111011000
汇编指令: MOV AX, BX
上述的机器指令和汇编指令是一一对应的,它们操作的含义都是:把寄存器 BX 中的内容送到 AX 中。
什么是寄存器?
寄存器可以理解为CPU中的存储器或者内存,是CPU中可以存储数据的器件,一个CPU中可以有多个寄存器。上述示例中的 AX 、BX 就是寄存器的代号。
关于编译与反编译
计算机只能读懂机器指令(如 1000100111011000),那么该如何让计算机执行我们用汇编语言(如MOV AX, BX)编写的程序呢?
编译
这就需要对汇编程序进行编译,即将其翻译成由机器指令组成的机器码,如此计算机就能执行汇编程序上。本质上,计算执行的仍然是机器指令,而非汇编指令。对更多高级的编程语言(比如 C++ 等),使用高级语言编写的程序同样需要先转译成汇编程序,再编译成机器码,从而进一步地在机器上运行。这个过程,即编译过程。
把机器码程序(机器指令程序)转译成汇编指令,即反编译过程。
汇编语言的组成 汇编语言由以下3类指令组成:
1)汇编指令(与机器指令一一对应,它是机器码的助记符)
2)伪指令(由编译器识别并执行)
3)其它符号(由编译器识别并执行)
汇编语言的核心是汇编指令,汇编指令决定了汇编程序的特性。
什么是存储器?
CPU是计算机的核心部件,它控制着整个计算机的运作并进行系统运算,要想让CPU工作,就必须向它提供机器指令和数据,指令是告诉CPU怎么做,数据是CPU执行任务的原材料。这些机器指令和数据是存放在存储器中的。计算机中大多数的硬件都有存储器,除了CPU外,显卡、BIOS等也都有自己独立的存储器。
存储器的存储容量单位是字节(Byte,一个字节有8位 bit,即2的8次方),1KB=1024Byte,1MB=1024KB,1GB=1024MB,1TB=1024GB。
磁盘的容量单位和存储器的容量单位是一样的。Byte单位是微机中最最常用的计量单位。
什么是内存?
内存是计算机结构中最主要的一个存储器,仅此而已。存储器不等于内存,比如显卡中的显存也属于存储器,所以存储器包括了内存、显存等多种类型的存储器。在一台PC机中,内存的作用仅次于CPU。离开了内存,性能再好的CPU也无法工作。磁盘不同于内存,磁盘中的数据或程序如果不讲到内存中去,它就无法被CPU使用。所以,学习汇编语言基本上就是在学习CPU如何调用并使用内存中的数据。
什么是指令和数据?
指令和数据是应用上的概念,同一串二进制代码,可以是指令,也可以是数据,这决定于我们的程序设计。如下示例:
1000100111011000
当被应用为数据时,它等于 89D8H,H 表示是十六进制。当被应用为指令时,它指的是 MOV AX, BX。
不难看出,同一串二进制代码,应用不同,既可以作为指令使用,也可以作为数据来使用。
什么是存储单元?
存储器被划分为若干个存储单元,每个存储单元都从0开始顺序编号。比如一个存储器有128个存储单元,则它的编号范围是 0~127。
CPU对存储器的读写操作
CPU要想实现数据的读写操作,就必须与外部器件(芯片)进行以下三类信息的交互:
1)地址信息,即存储单元的地址
2)控制信息,即对存储器的存储器件(芯片)的选择——读或写
3)数据信息,即将要用于读或写的数据
那么CPU是通过什么将地址信息、控制信息和数据信息传递到存储器芯片中的呢?
我们知道,电子计算机能处理和传输的信息都是电信号,电信号是使用导线来传送的,所以CPU也是通常导线把地址信息、控制信息和数据信息传递至存储器的存储芯片中去的。在计算机中,专门有连接CPU和其它存储器芯片的导线,这些导线通常被称为总线。总线在物理上即一根根导线的集合,在逻辑上可以被划分为地址总线、控制总线和数据总线(这与上述CPU交互的三类信息相对应)。这里特别说明,存储器包括了内存、显存、网卡中的存储器等多种类型的存储器。
总线
读写过程基本如下:首先CPU通过地址总线把地址信息传递至存储器,对应地找到目标存储单元;CPU又通过控制总线把控制信息(读操作或写操作)传递至存储器,找到对应读或写的芯片器件;CPU最后通过数据总线把将要被读或被写的数据信息传递至目标存储单元,执行数据的读或写。
关于8086CPU
8086CPU是一款经典的CPU,它的数据总线宽度是 16位。无论当下CPU更新速度多么快,它们都与8086CPU的技术架构是一致的,变化的只是晶体管的数量多了,导线的数量多了而已。学好了8086CPU的工作原理,基本上就能举一反三地学习其它更高级的CPU了。
地址总线
CPU是通过地址总线来寻找和指定存储单元的,地址总线上能传输多少个不同的地址信息,那么CPU就可以对多少个存储单元进行寻址。如果一个CPU有 N 根地址总线,则可以说这个CPU的地址总线宽度即为N,那么这个CPU最多可以寻找到 2 的N次方个存储单元。地址总线的宽度,决定了CPU的寻址能力。
地址总线
控制总线
CPU对外部器件的控制是通过控制总线来实现的。控制总线是一些不同类型的控制线的集合。理论上讲,有多少根控制总线,就意味着CPU能提供对外器件的多少种控制。这里所说的控制,无非就是读和写两种,对一根控制线来讲,发送0表示读(低电平),发送1表示写(高电平)。有多少根控制线,就能控制多少个外部器件。控制总线的宽度,决定了CPU对外部器件的控制能力。
控制总线
数据总线
CPU与存储器之间的数据信息传输是通过数据总线来完成的。数据总线的宽度决定了CPU和外界的数据传输速度。可以把数据总线类比成高速公路,路面上的车道数越多,则通车的速度就更快。举例说明,8088CPU的数据总线宽度是8位(即有8根数据总线),如果它要把 8D99H 这个数据传递至存储器,则需要传递两次,先把低位 99 传递过去,再把高位的 8D 传递过去;如果是 8086CPU,则只需要一次传递即可把 8D99H 传递至存储器,因为 8086CPU 的数据总线宽度是 16 位(即有16根数据总线)的。数据总线的宽度,是决定CPU运算速度的因素之一(当今的CPU之所以工作速度越来越快,这不仅仅与数据总线宽度越来越宽有关,还与寄存器、二级缓存数量的增加有关,还与“打孔->继电器->电子管->晶体管”的技术发展有关)。
数据总线
什么是主板?
在每台PC机中,都有一块主板,主板上有着电脑所必须的核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相互连接在一起。
什么是接口卡?
在计算机系统中,所有可用程序控制其工作的设备,都必须受到CPU的控制。但是CPU又不能直接对外部设备进行控制。事实上,直接控制这些外部设备的硬件就是接口卡,这些接口卡是插在扩展插槽上的。这些外部设备如显示器、音箱、打印机等。CPU通过总线控制这些接口卡,从而间接地控制着这些外部设备。但凡没有连接到接口卡的外部设备,都无法被CPU控制。
显卡、网卡、声卡等等,都是接口卡。CPU控制显卡,显卡再控制显示器的显示。CPU控制网卡,网卡再与外部的网线进行通信交流。
存储器的分类(ROM / RAM)
从读写属性上划分,可以分为随机存储器(RAM)和只读存储器(ROM)。随机存储器中的数据可读可写,当电脑断电时数据会丢失,比如内存;只读存储器只能读数据,不能写入数据,电脑断电后数据不会丢失,这些数据是硬件设计者预先写入的,比如BIOS的ROM。
从功能和连接类型上划分,可以分为常用RAM,接口卡的RAM,接口卡上的ROM。
存储器的逻辑连接
上图中,显卡上的ROM是为电脑开机显示器显示时所需要的基本输入输出数据,显卡上的RAM可以动态地写入数据并显示在显示器上。
什么是BIOS?
BIOS即Basic Input/Output System,基本输入输出系统。BIOS是由主板和各类接口卡(网卡、显示等)厂商提供的软件系统,通过BIOS可以利用硬件设备实现最基本的输入输出。不仅是主板有BIOS,一些接口卡上也有BIOS。BIOS中的ROM就是只读存储器,专为相应硬件提供最基本的输入输出。
什么是逻辑存储器(内存地址空间)?
对CPU来讲,系统中所有物理存储器中的存储单元都处在一个统一的逻辑存储器中,这个逻辑存储器的容量大小受到CPU寻址能力的限制。如果一个CPU的地址总线宽度为10 ,则该CPU可以寻址的存储单元为1024个,这1024个可寻到的存储单元就构成了这个CPU的内存地址空间,也叫做逻辑存储器。
逻辑存储器
从CPU的视角来看,它将各类物理存储器看作是一个逻辑存储器。所有的物理存储器都被看作是一个由若干存储单元组成的逻辑存储器;每个物理存储器在这个逻辑存储中都会占有一个地址段,即一段地址空间;CPU在这段地址空间中进行数据读写,实际上就是在其相对应的物理存储器中进行数据读写。
计算机系统结构中的各个物理存储器,在物理上是独立存在的器件,它们都和CPU的总线相连。CPU对它们进行读或写,是通过控制总线发出读写命令的。
对CPU来讲,它看到的只是这个逻辑存储器。逻辑存储器中地址段是由各个物理存储器报上来的。举例说明,比如某个CPU的逻辑存储器地址段分配如下,地址0~7FFFH 这32KB空间是主RAM,地址8000H9FFFH这8KB空间是显存RAM,地址A000HFFFFH这24KB空间是其它器件ROM。
不同的计算机系统,其内存地址空间的分配情况也是不尽相同的。比如8086CPU的PC机,其逻辑存储器的地址空间分配如下图示:
逻辑存储器的地址空间分配
最终运行程序的器件是CPU。我们用汇编语言编程的时候,必须要从CPU的角度去考虑问题。即使是用高级编程语言去编写程序,经过编译后还是会变成汇编程序,再由汇编程序转译成机器码,进一步交给CPU去执行。因此,学会从CPU的角度去思考问题并编程,是我们学习汇编语言的核心目的。
本章小结
1)汇编指令是机器指令的助记符,它们是一一对应的关系。基于这种一一对应的关系,汇编程序通过编译可以转译成机器指令程序;.exe程序通过反编译可以将其转化成汇编程序。
2)每种型号的CPU,都有自己特有的汇编指令集。
3)CPU能够直接使用的信息都存放在存储中,并且CPU有且只能直接使用存储器中的数据。
4)在存储器中,指令和数据是没有任何区别的,它们都是二进制信息。唯一区分它们的方式就是,这些信息是通过哪种类型的总线来传输的,使用地址总线传输的信息是地址信息,使用数据总线传输的信息是数据信息,使用控制总线传输的信息是控制信息。
5)存储器中的存储单元都是从0开始顺序编号的。
6)一个存储单元可以存储8位bit,所以一个存储单元的存储容量即为一个字节 Byte(2的8次方),1Byte = 8bit。
7)CPU芯片有很多管脚,这些管脚分别和每一条总线相连接。正是这些管理,从CPU端引出了三种类型的总线,总线的数量(宽度)标志着CPU各个方面的性能。其中地址总线的宽度决定了CPU的寻址能力;数据总线的宽度决定着CPU与其它器件交换数据时的单次数据传送量;控制总线决定了CPU对系统中其它器件的控制能力。
=======================================================================
转载自网络
原作者:夏海峰
链接:https://www.jianshu.com/p/90cae6902c00
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。