汇编语言,没想到有一天我也要将重心放在汇编上进行学习.以前,都是进行调侃,说用汇编写”Hello World”
*不过,作为一门语言来讲,汇编还是很有意思的,在这里可以清楚的明白pointer到底为何物 ? *
先从基础知识开始积累
1.1 机器语言
计算机的发展仅仅只有不到一百年的历史,发展十分迅速.但是,在最初的阶段,计算机的发展也是步履维艰的
计算机是电子设备,所以其中进行信息的表示都是使用高低电平的.
那么表示高低电平这两种状态最简单的就是使用0,1两种状态.
常用的机器指令,就是一列二进制数,而计算机就将这一列二进制数转换成为高低电平来表示指令
Tips: 计算机与PC机
来区分一个容易混淆的概念,计算机与PC机.从广义的角度上来讲,这两者是一致的.
但是,实际上计算机指的是可以执行机器指令,进行运算的机器,这是早期的计算机的概念
而PC机则是现代意义上的计算机,有一个芯片就可以完成上面所有的任务,即CPU
那么,PC机是什么?,CPU与其他直接或者间接受CPU控制的芯片,器件,设备组成的计算机系统,即是PC机
而每一种微处理器,由于硬件设计,内部结构的不同.造成其需要不同的电平脉冲进行指令操作
每一种微处理器都有其自身的机器指令集,即机器语言,这也是造成汇编语言基本没有可移植性的原因
早期的程序员,真的是十分辛苦的,因为机器语言的缘故,使得要使用纸带以及卡片机进行编程
这样有两个致命缺点:
1.编程时难度大,极易出错
2.后期的维护很不方便,出错后,进行Debug也是十分的麻烦
所以,才有了汇编语言的诞生,以至于之后还衍生出了许多更高级的语言
1.2 汇编语言
由以上可知,机器语言,晦涩,难懂,不便于维护,所以就出现了汇编语言
什么是汇编语言呢?
汇编语言,主体是汇编指令,汇编指令就是机器语言(机器指令)的助记符,实质是相同的
汇编指令仅仅只是机器指令便于记忆的格式
来举个例子:
操作:寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:mov ax,bx
由上面的这个例子,可以很清楚的看出汇编指令的作用了吧,
对,没错,使用汇编指令可以大幅提高程序开发的效率和后期维护的方便
所以,程序员的开发模式由:
程序员 -> 机器语言 -> 计算机
程序员 -> 汇编语言 -> 编译器 ->机器语言 -> 计算机
大大得体高了程序设计的效率
Tips: 汇编代码大小写的问题
汇编代码的大小写并无差异,对于汇编指令而言
但是,对于程序员所定义的变量之类而言,是要严格区分大小写的
即{MOV,PUSH,ADD,LOOP…} == {mov,push,add,loop}
1.3 汇编语言的组成
汇编语言主要由三种内容组成:
序号 | 指令 | 作用 |
---|---|---|
1 | 汇编指令 | 机器码的助记符,有对应的机器码 |
2 | 伪指令 | 由编译器执行,计算机不执行,没有机器码 |
3 | 其他符号 | 如+,-,/,*等,由编译器识别,没有对应的机器码 |
1.4 存储器
存储器是在计算机科学中常提到的一个词,实际上,就是我们平时所说到的内存
内存有什么用呢?
内存可以暂时存储CPU需要进行处理的数据,需要操作的指令
所以说,性能再强的CPU脱离了内存也是无法工作的
内存不同于硬盘,硬盘的数据需要读入内存中才能被CPU使用
我们想要学好汇编语言,就必须对计算机的内从优一定程度上的了解与熟悉
1.5 指令和数据
在计算机中,对于指令和数据是不加区分的(在内存中)
在内存中,指令和数据都是以二进制的形式存储的,系统不会区分是指令还是数据
如:
1000100111011000 -> 89D8H (数据)
1000100111011000 -> mov ax,bx (指令)
同样的二进制数字,可以是数据,也可以是指令,具体作为指令还是数据处理,在从内存中取出时进行区分
1.6 存储单元
前面说了很多,汇编语言是直接操控硬件,主要的是进行计算机内存的处理.
那么,关于存储单元的知识就需要好好理解了
之前提到过,存储器指的是内存,我们使用内存总不可能一次直接将它都使用了,对吧
所以,为了更好地利用内存,才会有存储单元的概念.
所谓,存储单元,指的是将存储器进行划分,一个存储单元所能存储的信息为1byte
所以如果一个存储器有128个存储单元,那么他所能存储的信息就有128byte
对于微机存储器来讲,我们可以说他的容量就是128字节
Tips: 关于存储单位
字:word=2Byte=16Bit
字节:1 Byte= 8 Bit
位:计算机中最小的存储单位
B=Byte=byte
b=bit=Bit
1.7 CPU对于存储器的读写
存储器在计算机中被分成了多个存储单元,那么计算机(PC机中的CPU)如何对其进行访问,操作呢?
CPU(计算机)对存储器的读写是依靠总线的,
Tips: 总线
由导线组成的传输线束,是计算机的内部结构.
CPU,内存,输入/出设备的公用通道,主机部件由总线连接
外部设备通过相应的接口电路与总线连接
系统总线,包括,数据总线,地址总线,控制总线,这三种即为通常意义上的总线
另外还有,扩展总线,局部总线.注意在某些硬件上,Data,Address总线是可以进行复用的
CPU要对存储器进行操作,分析可得,它需要三种总线:
1.地址总线:用来对存储单元进行寻址,要知道操作的存储单元的地址
2.控制总线:对存储单元那个进行操作,进行何种操作,即对存储单元的控制
3.数据总线:获取到地址以及操作后,就需要数据总线来进行数据的传输
CPU对存储器进行操作,总共有一下的三种信息交互:
-
存储单元的地址(地址信息)
-
器件的选择,读或写命令(控制信息)
-
读或写的数据(数据信息)
下面来看一张图,明白CPU如何进行操作
上图中的过程是这样的:
1.CPU通过地址线将寻址信息发出
2.CPU通过控制总线发出内存读命令,选中存储器芯片,并且通知它,将要从中读取数据
3.使用数据总线,将数据8送入CPU
地址总线
地址总线决定了CPU的寻址能力
地址总线是用来寻址的,那么地址的寻址范围有多少呢?
每一根导线上由高低电平之分,即一根导线可以表示两种状态,我们来抽象一下
一根导线可以表示,0,1两种信息,设地址总线共有N根导线组成,
**地址总线的寻址单元有, 2 ^ N ,范围为 0 ~ 2^N - 1 **
数据总线
CPU与内存或者其他器件之间的数据传送是通过数据总线来进行的.
数据总线的宽度决定了CPU和外界数据的传送速度
8根数据总线一次可以传送一个字节的数据,16根总线一次可以传送两个字节的数据
8086CPU以及8088CPU的数据总线宽度分别为16和8
所以对于两个字节的数据,8086CPU一次即可传输完毕,而8088CPU需要两次才能将数据输送完毕
控制总线
控制总线决定了CPU对系统中其他器件的控制能力
控制总线,并不是一条总线,实际上是很多控制线的集合.比如上面进行从内存中进行数据读写的操作
既有”读输出信号”的控制总线,用来从CPU中输出信号
又有”写输出信号”的控制总线,负责传送写信号
Tips:关于总线能力的描述
地址总线: 依靠所能访问到的存储单元总量来描述,比如,有13根地址总线的CPU,
它的寻址能力就是2^13 = 8KB,即我们用该CPU的寻址能力是8KB来描述它
数据总线: 便可以通数据总线的宽度来描述,总线越宽,一次能传输的数据越多
控制总线: 所集成的控制总线越多,所能控制的CPU器件就越多,控制能就越强
1.8 内存地址空间
我们使用汇编语言,而汇编语言更多的操作基本上是集中在内存,寄存器这些存储空间中的.
所以认识内存地址空间是很有必要的
首先来看两个概念:主板与接口卡
主板
每一台PC机上面都是存在主板的,随着计算机的发展,计算机已经不仅仅是计算机(指CPU)
主板上有着各种各样的器件,这些器件通过总线相连
举一个例子,如果说计算机是一座城市,那么主板便是城市中川流不息的汽车
CPU,存储器,外围芯片组,扩展插槽等,扩展插槽上一般插有RAM内存条,以及各种各样的接口卡
接口卡
为什么会有接口卡?
CPU对于计算机所有的部件都要有绝对的控制,但是对于一些外部设备
比如,鼠标,键盘,音响设备这些,都不能进行直接的控制,这些设备是平时接在接口卡上的
接口之后再通过总线CPU相连,即CPU通过直接控制接口卡,实现间接控制外部设备
各类存储器芯片
PC机中有许多的存储器芯片,根据读写属性来分,为RAM(随机存储器)与ROM(只读存储器)
RAM,随机存储器:
此类存储器,可读可写,但是必须带电存储,没电的时候,一切GG
ROM,只读存储器:
此类存储器,可读不可写,及时断电之后也可以保存数据
从连接与功能上来分:
- 随机存储器
用于存放供CPU上绝大部分的程序和数据,主随机存储器一般由两个位置上的RAM组成
装在主板上的RAM以及插在扩展插槽上的RAM
- 装有BIOS的ROM
BIOS,即为(Basic Input/Output System),BIOS不单指在主板上的BIOS,其实BIOS指的是主板
以及各类接口卡厂商提供的软件系统,可以通过这样使硬件进行基本的输入输出
在主板即各类接口卡上插有存储BIOS的ROM
TIps: 联系日常
通常,我们说的BIOS指的是主板BIOS,即系统BIOS
而且,RAM,ROM并不是单指其中一个存储器,它指的是一类存储器,在PC机的各个位置都会有其存在
另外有关RAM,ROM的概念,详情参考<计算机科学导论>计算机科学导论>
- 接口卡上的RAM
对于接口卡,在处理大批量数据时,也是需要进行暂时存储的,就需要用到RAM
典型的是,插在显卡上的RAM,俗称显存,我们只要将想要显示的内容写在显存中,屏幕上就会出现内容
内存地址空间
现在有了知识积累后,在来看看内存地址空间的内容
CPU在进行计算机控制时,将上面这么多的存储器都作为内存对待,不仔细的进行区分.
把它们看成总的一个由多个存储单元组成的逻辑存储器,而这个逻辑存储器就是我们说的内存地址空间
在汇编中,我们操控的便是内存地址空间
上面的逻辑存储器占有一个地址段,这个地址段即为CPU的地址总线所能访问到的所有存储单元
内存地址空间的大小受CPU总线宽度的限制
我们在基于计算机硬件进行编程的时候必须知道其第一个单元的地址和最后一个单元的地址
即我们必须知道内存得分配情况
至于为什么要了解内存地址空间,因为我们汇编程序的代码最后都是由CPU执行
所以我们就要从CPU的角度考虑问题,对CPU来讲所有存储器单元都是处于一个统一的逻辑存储器中
他的容量受到CPU地址总线(寻址能力)的限制
Tips: 内存地址空间相关
首先,来谈一些总线的事,
1.地址总线,数据总线之间并无必然的相等关系,可以不相等
2.常常谈到的CPU位数指的是数据通路的位数,即数据总线的宽度
3.而操作系统的位数指的便是操作系统寻址能力,所以才有XP支持到4G的说法
而上面说到的,也只是以前的理论知识,到了现在,随着计算机的发展,已经大变样了
XP只支持到4G,也不是绝对的,还可以使用虚拟内存,扩展的…之类的
另外有一点,便是理论值也并不是实际的情况,因为实际上就没有那么大的需求
理论上操作系统的支持内存XXXXXGB,实际上目前支持到约192GB(Win10)
64位处理器的总线基本上也就在39左右浮动,比如我的机子
39物理总线,48虚拟总线
最后,说一点学习的感受吧:
学习汇编,感觉一般都是学习硬件知识,与之前的高级语言学习完全不一样
知识在不断更新,而且网上鱼龙混杂,很麻烦
好累,果然学习内核方向需要耐得住寂寞…
November 8, 2017 5:32 PM