在谈汇编语言的开始,我想大家可能有这样的疑问:1、在计算机这个领域内,我们最不缺的就是语言,例如:C,C++,C#,JAVA,PHP,VB,Fortran,phthon·····共256种之多。这里有这么多高级语言,我们为什么一定要学汇编语言,这个看上去并不流行而且比较古老的编程语言?2、汇编语言是一种什么样的编程语言,它存在的魅力与价值在哪?3、学习了汇编语言以后我们能干什么?当然在我们学习汇编语言之初肯定无法回答这些问题,陆游就曾有一句;“绝知此事要躬行”,在我们慢慢进入了汇编的殿堂之后,我想这些问题就早已不言而喻了。
一、计算机编程语言的演进:
计算机语言总的来说分为机器语言,汇编语言,高级语言三大类,而这三种语言也恰恰是计算机语言发展的三个阶段。
下图为计算机的发展阶段:
我们先来感受一下三个阶段语言的不同的特点:
从这张图你可能会发现,机器语言代码这是什么呀,人类根本读不懂,那到底什么是机器语言呢?
1、机器语言:
在早期,机器语言是直接对硬件进行操作,但是机器语言是0和1的字符串,这就是的早期程序员的工作十分繁杂,如果0或者1有一位出错,那么整个程序就会崩溃,那么如何解决这个问题呢?在这时,汇编语言就应运而生了。
2、汇编语言:
这样人类与计算机就通过汇编语言这一媒介第一次产生了联系:
机器指令:1000100111011000
操作:寄存器BX的内容送到AX中
汇编指令:MOV,AX,BX
计算机执行汇编语言的基本过程:
但是从图二我们也可以看到,汇编语言还是过于繁琐,只能在懂计算机的程序员之间广泛流传。而在普通人之中,他们无法理解这个比较复杂的语言,所以为了让计算机编程语言更加普及,聪明的程序员们想出了更加简洁的方式,这时高级语言横空出世。
3、高级语言:
当今比较流行的高级语言:
二、汇编语言的组成与用法:
汇编语言发展至今,有以下3类指令组成。
(1):汇编指令:这是机器码的助记符,有对应的机器码。
(2):伪指令:没有对应的机器码,由编译器执行,计算机并不执行
(3):其他符号:如 + - * / 等,由编译器识别,没有对应的机器码
汇编语言的核心是汇编指令,它决定了汇编语言的特性。
学习计算机的人肯定都认识计算机之父------冯.诺依曼,他提出的计算机的五大体系至今仍是计算机的基本结构:
从该图中我们可以发现计算机的核心是Central Contral——CPU,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向它提供指令和数据,指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都为二进制信息。指令和数据在存储器中存放,也就是Memory(内存),再好的CPU如果没有内存,就无法工作。因此,我们要了解CPU到底是怎样从内存中读取信息以及向内存中写入信息的。
存储器被划分为若干个存储单元,每个单元从0开始顺序编号,就好比一栋大楼有128个房间,各个房间有门牌号0~127。那么一个存储单元能存储多少信息呢?电子计算机的最小信息单位是bit,也就是一个二进制位。8个bit组成一个Byte,也就是一个字节。微机存储器的容量是以字节为最小单位来计算的。对于大容量的存储器一般还用以下的单位来计算容量:
1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB
1GB=230Byte 1MB=220Byte 1KB=210Byte
CPU要想进行数据的读写必须与外部器件进行3类的信息交互:
•存储单元的地址信息(地址信息) •器件的选择,读或写的命令(控制信息) •读或写的数据(数据信息)
既然CPU要读取数据,那么数据怎么传输呢?电子计算机能处理的都是电信号,电信号肯定要用导线传送。计算机中有专门连接CPU和其他芯片的导线,通常称为总线,总线从逻辑上又分为3类:地址总线,控制总线和数据总线。
CPU从3号单元读取数据的过程如下:
(1)CPU通过地址线将地址信息3发出 (2)CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据 (3)存储器将3号单元中的数据8通过数据线送入CPU
①地址总线:CPU通过地址总线来指定存储器单元,因此地址总线的数量决定了能够表示多少个地址,例如:一个CPU有10根地址总线,一根导线可以传送的稳定状态只有高电平与低电平,用二进制表达也就是0或1,10根导线可以传送10位二进制数据,也就是可以传送210个不同的数据,最小数为0,最大数为1023。
因此我们可以总结:一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2n个内存单元,编号为:0~2n-1
10根地址总线的CPU向内存发出地址信息11的二进制示意图:
②数据总线:数据总线的宽度决定了CPU和外界的数据的传送的速度,8根数据总线一次可以传送8位2进制数据(即是一个字节),16根数据总线就是两个字节,8088CPU的数据总线的宽度为8,8086CPU的数据总线宽度是16,下图展示了8086CPU数据总线的传输情况:
③控制总线:控制总线的宽度决定了CPU对外界部件的控制能力。
下面开始一个新的内容:内存地址空间,比如说,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻的内存单元就构成了这个CPU的内存地址空间,内存地址空间并不是真正存在的,是逻辑上的地址空间。内存地址空间比较抽象,若想深入了解就必须具备两个知识点:主板与接口卡。
主板:上面有核心器件,和一些主要器件,这些器件通过总线相连,器件有CPU,存储器,外围芯片组,扩展插槽(其中插有RAM内存条和各类接口卡)
接口卡:就是连接一些外部设备,可以让CPU对外部设备进行控制,比如显示器,音响,打印机·······
CPU在控制这些器件时,只是把它们当作内存来看,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所述的内存地址空间
在上图中,所有物理存储器被看做一个逻辑存储器,每个物理存储器在逻辑存储器中都有一个地址段,即是一段地址空间(注意:存储器并不是一段一段的)CPU在这段地址上读写数据,实际上就是在相应的物理存储器中读写数据。内存空间的大小受到地址总线宽度的限制,比如:8086CPU地址总线宽度为20,则寻址能力为2^20 即是1MB,80836CPU的地址总线宽度是32 则内存地址空间最大为4GB,所以我们在基于计算机硬件编程时,要知道这个系统的第一个单元地址,和最后一个单元的地址,才能保证读写操作是在预期的存储器中进行。