《汇编语言》这本书在讲解汇编语言的相关知识之前先对一些基础知识进行了介绍。在正式开始学习汇编语言之前,对机器语言程序设计以及汇编语言产生的原因和硬件系统的结构进行了一些了解和学习。
1. 机器语言的了解部分
早期的程序员都是使用机器语言进行程序设计的,机器语言是机器指令的集合,机器指令由一系列二进制数码组成(比如向计算机输入1000100111011000,计算机就可以通过对这串代码的识别知道你要表达的意思是什么,你需要计算机进行什么样的运算,就好像你用计算机能够理解的语言向计算机说了一句话,让他按照你说的来做),早期的程序员将程序以机器语言的形式(1,0)打在纸带或卡片上(1打洞0不打洞),再通过纸带机或卡片机将纸带上的内容输入计算机,计算机通过对纸带的识别,将包含0和1的二进制数码转化为高低电平,以此来驱动电子器件工作,从而进行一些运算。
随着时代的发展,计算机技术日益进步,和早期计算机(能够执行机器语言并进行运算的机器)不同,现在的计算机不能单纯的称之为“计算”机了,而是应该被称为计算机系统,功能也要比早期计算机丰富得多,现在的计算机的一个芯片即可即可完成早期计算机的任务,这个芯片就是计算机的CPU(中央处理单元),它是一种微处理器,可以对计算机中的其他设备,器件,芯片进行直接或间接的控制,所以当前的计算机便可以认为是由中央处理单元和受到其直接或间接控制的芯片,器件以及设备所组成的计算机系统(比如我们现在使用的PC机就是计算机系统),而不再是只用于识别机器指令并进行一些运算的早期“计算”机。
2. 汇编语言产生的由来和一些特点
在使用机器语言编程的过程中,由于机器语言的繁琐加上难以记忆和查错,给整个产业的发展带来了障碍,由此产生了汇编语言。
就如同其他高级语言和机器语言一样,汇编语言的主体是汇编指令(但是还包括其他),尽管汇编语言听起来好像是一种新发明的陌生语言,但其实汇编指令(注意此处写的是汇编指令而非汇编语言)与机器指令并没有本质的差别,汇编指令其实就是机器指令的一种便于记忆的写法(就像给一个拥有很长名字难以记忆的人起了一个方便记忆的绰号,并且双方都认可,这样以后喊他便可以直接用便于记忆的绰号了,别人看到这个绰号就可以知道指的就是他,所以说汇编指令仅仅就是觉得机器指令太不好记忆了,所以用一种简短的写法来代替机器指令,本质上依然与机器指令无异)(注:汇编指令与机器指令就是指的同一个东西,只不过写法不一样“1000100111011000”和“mov ax,bx”这两段代码所代表的都是将寄存器bx里的值赋给ax里)。
虽然说汇编指令与机器指令没有本质的差别,仅仅是写法不一样,而且对于人来说也更加简短,便于记忆了,但是机器却只认机器指令,汇编指令对于机器它无法看懂,所以把汇编指令打在纸带上再送入计算机,计算机是不会有反应的(就好比在户口本上写上自己的绰号,派出所不会认一样),这个时候,就需要一个翻译器,将汇编指令翻译成机器指令,这样计算机便能认出经过翻译后的汇编指令,执行我们所需要的运算了。这个翻译器被称为编译器,程序员用汇编语言在编译器上写出源程序,编译器将其翻译成机器码,再由计算机执行。
小结:汇编指令是机器指令的助记符,和机器指令无本质区别,但想要计算机执行你的汇编代码,就要用到编译器将其翻译成机器码。
3. 汇编语言的组成
汇编语言的主体是汇编指令,也就是说汇编语言的主要(不是全部)组成部分是汇编指令,
汇编语言由三类指令组成:汇编指令、伪指令、其他指令。
汇编指令:是机器码的助记符,理所当然会有对应的机器码。
伪指令:由编译器指令,无对应的机器码,不由计算机执行。
其他指令:加减乘除的符号,由编译器识别,无对应机器码。
4. 硬件系统的结构部分
计算机的核心是CPU,CPU的工作是控制计算机的运行和进行运算,运算就需要数据(对什么进行操作)和命令(怎样操作),另外CPU不可能自己凭空变出来数据和命令,它需要内存向它提供指令和数据,再对所取得的指令和数据进行处理,CPU对磁盘上的信息的处理也要先用某种方法将磁盘上的数据读到内存中,然后再进行处理。
(1)指令和数据:指令和数据在人看来是不一样的,指令是对数据如何操作的描述,而数据是计算机按照指令要处理的内容,但是,在存储器(即内存)中,指令和数据的存放方式都是一样的,它们都是以二进制信息存储在存储器中的,所以在内存或磁盘看来,指令和信息没有任何区别。(如1000 1001 1101 1000在机器看来可以为mov ax,bx的机器码写法,也可以是89D8H这一个十六进制数)。
(2)存储单元:一个存储器被分为若干个存储单元,每个存储单元都有一个编号,并且第一个存储单元的编号为0,如果一个存储器被分为128个存储单元,那么按从第一个到最后一个的顺序它们的编号依次为0、1、2、3...126、127。一个存储单元可以存储八个二进制位(bit),而八个比特等于一个字节(B),所以一个存储单元可以存1B大小的数据,如果一个存储器有128个存储单元,那么这个存储器就可以存储128个字节大小,即它的容量是128字节。(还要注意计算机中常用的计量单位的换算:只有字节和位之间的关系是1Byte=8bit)
(3)CPU对存储器的读写:CPU只有从存储器中读取指令和数据才能实现运算,和对数据的处理。CPU要从存储器中读取数据,首先要明确数据在存储器中的位置,再对数据(此处的数据将指令和数据混在了一起)进行写入或者读出操作。CPU通过导线与其他器件连接,再通过导线输出高电平低电平来进行信息的交换与传递。
下面以CPU和存储器之间的关系为例:
CPU要从存储器中读取或写入数据:
① 找到数据位置(地址信息);
② 对存储器发出命令(对这个数据进行何种操作)(控制信息);
③ 对这个数据进行操作(数据信息)。
为了实现地址、命令、数据的传输,CPU和存储器之间连有三套总线:地址总线、数据总线、控制总线。
重点知识:三种线。
1) 地址总线:CPU和存储器之间的地址总线不止一条,每一根地址总线都可以输出高电平(1)和低电平(0),CPU就是使导线传送不同的电平来实现对存储器中存储单元地址的访问,如果一个CPU和存储器之间有n条地址总线,那么CPU就可以传送2^n种地址信息给存储器。(上面的访问地址的个数(寻址能力)的推导方式有两种:可以由排列组合得出,也可以由二进制数所表达的数值大小来推断)
2) 数据总线:数据总线的任务是传送读出或写入的数据,数据总线的条数决定了速度(与条数成正比),数据所占位数太多,一次传不完可以分多次,比如说,传输一个十六位二进制数,只有八根数据总线的CPU,要传输这样的数据就要分两次,一次传八位。而有十六根的CPU,就只要传一次。
3) 控制总线:CPU依靠他对存储单元发出读或写的命令。
(4)主板:主板上有计算机的核心和一些主要器件,这些器件都通过三种线相连。
(5)接口卡:虽然CPU不能对外部设备直接进行控制,但是接口卡可以对外部设备直接进行控制,接口卡插在扩展插槽上,而扩展插槽通过总线和CPU相连,从而CPU可是通过对接口卡的控制来实现对外部设备的控制。
(6)存储器芯片:一台计算机中装有多个存储器芯片,存储器芯片从读写属性上分为ROM(read only memory)和RAM(read access memory),其中RAM可读可写,但是一断电,存储内容消失,而ROM只能读,断电后数据不消失。RAM和ROM在功能和连接上分为
① 随机存储器(为CPU提供数据)
② 装有BIOS的ROM(BIOS是一个软件系统,利用它来实现某硬件设备的最基本输入 输出)
③ 接口卡上的RAM(将要输出的数据进行暂存,如显卡上的RAM(显存),RAM里有什么显示器上就输出什么)
(7)内存地址空间:虽然各类存储器在物理上都是独立的,但是它们都通过总线和CPU相连,在CPU操控他们的时候,把每一个器件的存储器都当作内存看待,整个的一个由这些存储器构成的大的存储器就是逻辑存储器(内存地址空间),每一个存储器在这个大的存储器中占有一个地址段(比如说第一大段是主RAM的地址空间,在这一大段里读写数据就是读写的主存储器里的数据,就是对主存储器进行操作,如果你想要对显卡进行操作,就要知道显存的地址空间的是首地址在哪,然后在显卡的地址段里读写数据)。
至此第一章的内容已全部总结完成大体的知识框架为:机器语言编程的特点、机器语言的缺点、汇编语言产生的原因、汇编语言和机器语言的关系以及区别、使用编译器的原因、存储结构、CPU和其他元器件的联系以及连接方式、CPU是如何与内存(存储器)进行交流的、CPU对存储器进行读写需要告诉存储器哪些信息、存储单元的概念、存储单元的个数和存储器容量的关系、计算机内计量单位的换算、各类总线、CPU寻址能力的计算和已知寻址能力要求地址线的条数(先将寻址能力化为以字节为单位)、逻辑存储器(里分为三大地址段:主RAM、显存、其他ROM)的概念、CPU对外部设备是如何控制的(通过接口卡间接控制)以及存储器的按读写属性和功能和连接的分类。
(以上仅代表个人意见表达错误和不准确之处还请指正,参考书目:王爽《汇编语言(第三版)》)