预备知识
1,汇编语言其实是和具体的微处理器(也就是CPU)相联系的,因为每一种微处理器内部的硬件结构和设计不同,所以需要不同的电平脉冲控制。因此每一种微处理器对应的机器指令集并不不同,汇编语言也都不一样。因此我们学习汇编语言,学习的其实是一种通用的、常用的微处理器的汇编语言。比如典型的intel8086处理器,和80386的汇编语言不一定完全一样,但是很多逻辑和语法是类似的。
学习目标: 获得底层的编程体验,和理解机器运行程序的机理。
多数教程都是以intel的8086处理器来作为学习对象(因为这个芯片非常典型),来了解汇编语言,所以此文也是如此。
第一章:基础知识
1.1硬件知识的重要性
因为汇编语言是一种直接在硬件之上工作的编程语言,所以我们欲了解汇编语言,就必须对它工作的基础,也就是硬件系统有一定的了解。(需同步学习《微机原理与接口》,《计算机组成原理》等课程)
1.2汇编语言的发展
机器语言:机器指令的集合。同理:
汇编语言:汇编指令的集合,而汇编指令是机器指令便于记忆的书写格式。
机器语言其实就是一系列二进制数字,计算机将之转变为一列高低电平,来驱使计算机的电子器件。所以机器语言其实才是真正意义上最“底层”的语言。
但是因为机器语言不利于记忆和使用,为了解决这个问题,早期程序员们用一些助记符来表示一串0,1代码,于是汇编语言应运而生。
推理:编程语言就是这样一步一步发展出来的,从机器语言到汇编语言,再到高级语言,如BASIC,C,然后再到JAVA,Python这种高级编程语言。其实都是对指令的进一步抽象,使其更符合人的语言记忆和表达习惯,越接近人的自然语言,都是为了让人类更好使用罢了。
(所以你会发现,如果对于一个英语好或以英语为母语的人来说,即使他没学过任何编程语言,但是给他一段简单的Python代码,他都能把意思猜个八九不离十。我个人感觉Python代码就是用英语白话文写的句子。在编程世界里,他们直接写日常用语就可以指挥计算机运算和输出,简直就是“言出法随”。)
汇编语言的编译器,作用:将 汇编语言 编译成 机器码(0,1代码) ,因为计算机只看得懂0,1代码。所以对于不管是什么语言,我们最终都得翻译成机器语言,计算机才能理解,这就是为什么写代码需要编译器了。
1.3指令和数据,存储器
要想让一个CUP工作,我们只需要给它两样东西。指令 和 数据,这些都在存储器(内存)中存放。CUP通过三根线和【内存】相连接。
这里有两点需要注意:
1,在内存或磁盘(也是存储东西的)上,指令和数据没有任何区别,都是二进制信息。它到底是指令还是数据,看你自己给它赋予的意义。
2,内存,也就是存储器的一种。一般来说,一个存储器被划分成若干个存储单元,一个存储单元存放1个字节(Byte),也就是说一个存储单元有8位(bit)。如果一个存储器有128个存储单元,也就是有128B的存储空间。
3,三根线的来源:地址总线,数据总线,控制总线。
1.4三根线的介绍:地址总线、数据总线和控制总线
地址总线:
地址总线的位数确定了CPU可以寻址的内存单元的数量。比如8根线,可以有2的8次方的组合情况。00000000到11111111,可以访问256个内存单元,也就是说,通过这八根线,可以对256个内存单元(每个内存单位可以存放一个字节的信息)编号和访问,从0~255。
数据总线:
数据总线的宽度决定了CPU和外界(比如内存或其他器件)传输信息的速度,也是一次能处理的二进制数的位数。例如8086CUP的数据总线的宽度为16位,即一次可以传输16个二进制数。所以8086CPU是16位字长的。8088只有8根数据线,所以一次只能传输8位数据,是8位的CPU。多少位的CPU,数据总线就有多少根,一次性能处理的数据就有多少位。
控制总线:
控制总线只是一个总称,它是一些不同控制线的集合。多少根控制总线就意味着CPU对外界有多少种控制,因此控制总线决定了CPU对外界的控制能力。
8086CPU的数据总线是16根,所以它是16位的。但是它的地址总线是20根,所以可寻址(或者说 定位)2的20次方B的内存单元(一个内存单元的大小 是 1B),所以装载了8086CPU的PC机的内存大小为1MB。80386CPU的地址总线宽度为32,则内存地址空间最大为4GB。
内存地址空间:对主板上各个物理存储器(ROM、RAM)整体的抽象映射,一一对应的关系。比如,如果我们想向显示器上输出一段信息,这一定要把这个信息写到显存对应的内存地址空间中。
练习题: