不能免俗,学习汇编,首先,我们先从一个简单的事例开始,比如,我们要输出一句话“Hello,word”,那么是早期的计算机中,我们可能需要进行如下的编程:

00011110

1011100000000000000000

10000001110000000000110

110001000000000000010010

看到这样的程序,对于里面的10,你是否范糊涂了,如果敲错一个01会如何办,是否感觉太难懂了,用01表示的这段程序就是机器语言。

1.机器语言是机器指令的集合,机器指令是一台计算机能够正确执行的语言,它是由一系列的二进制数据而组成的。计算机将其转换为高低电平,以便能够控制计算机的部件,比如:cpu,内存等,从而进行计算。

但是这样的方式对于开发人员来讲,实在是太晦涩难懂了,有没有方法进行改进呢?
在这样的情况下,就产生了汇编语言。

2.汇编语言的主体是汇编指令,其实际上是对机器语言的另一种表式形式,方便开发者进行编程。例如:
1000100111011000,
如果我们用汇编指令可这样描述:
mov ax,bx
,表示将bx寄存器的内容赋给ax
寄存器:是cpu中可以存数据的玩意。Cpu包含很多寄存器,ax,bx只是其中的两个寄存器而已。

3.那么计算机是如何识别类似于mov ax,bx这样的指令呢,实际上是通过编译器,最终将汇编指令转换成机器码,由计算机最终执行的。(具体的例程我们基础篇讲完后再来看实例)。

那么计算机中的各个部件到底是如何工作的呢?

实际上,对于计算机而言,cpu和内存的关系就好比:一个好的作家一定是来源于生活中,一个才华横溢的天才大脑也是建立在充足的记忆和数据上的。这里cpu就好比天才的大脑,它是用来计算的。内存就好充足的记忆和数据。它是用来存储数据以供cpu调用并最终计算的。

那么我们平时用c#javavc++写的而存在硬盘中的程序呢,同样的道理,它们运行时也一样要被读到内存中,否则cpu是无法识别的。

想想,如果我们了解了通过cpu读取内存数据,或者熟悉了cpu向内存中写数据,那么我们能够做什么呢?
我们可以从中结取程序的中间值,并修改后再写入程序。
我们也可以制作类似于各种游戏外挂的东东。

那么cpu是如何对存储器进行读取的呢?

首先,我们来看看存储器的分布规则:

 

1.在计算机中最小的信息单位是bit,也就是一个二进制位,8bit组成一个Byte,也就是字节。一个存储单元可以存储一个字节,也就是8个二进制位。计算机的存储器容量是以字节为最小单位来计算的,对于一个有128个存储单元的存储器,可以说它的容量为128字节。

例如:如果有一个1KB的存储器,则它有1024个存储单元,它的编号为从01023

2.我们平时开发的程序中,变量和主存储器的存储单元相对应。变量的名字对应着存储单元的地址,变量内容对应着单元所存储的数据。

3.好比一条商业大街上的门店一样,存储器就是商业大街,门店就是存储单元的地址。

 

其次,我们要通过cpu从内存中读取数据,就必须要知道存储单元的地址。就像在商业街上找人,你需要知道他开的门店的具体地址。

1.另外,在一台微机中,不只有存储器这一种器件。CPU在读写数据时还要指明,它要对哪一个器件进行操作,进行哪种操作,是从中读出数据,还是向里面写入数据。

(备注:熟悉vc,java.net的朋友,一定知道我们存取数据时,有时为了高效,需要将数据放到Cach中,而Cache的存取速度与CPU的速度相当。 有了Cache后,无论是存入数据还是取出数据,都先将该数据及后面连续的一组数据先存放在Cache中,CPU在取下一组数据时,它首先看所需数据是否在Cache中,如果在就立即传给CPU;如果不在就得访问RAM
如果CPU能在高速缓存中找到要访问的数据,就能大大提高系统的速度。
Cache
有两种:内部Cache和外部Cache。内部CacheCPU内部,容量较小,外部Cache在主板上,容量较大。)

2.可见,CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3类信息的交互。

存储单元的地址(地址信息)

器件的选择,读或写的命令(控制信息)

读或写的数据(数据信息)

那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。总线从物理上来讲,就是一根根导线的集合。根据传送信息的不同,总线从逻辑上又分为3类,地址总线、控制总线和数据总线。

CPU3号单元中读取数据的过程(见图1.3)如下。

121047357.jpg

上述过程可描述如下:

(1)CPU通过地址线将地址信息3发出。

(2)CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。

(3)存储器将3号单元中的数据8通过数据线送入CPU

写操作与读操作的步骤相似。如向3号单元写入数据26

(1)CPU通过地址线将地址信息3发出。

(2)CPU通过控制线发出内存写命令,选中存储器芯片,并通知它,要向其中写入数据。

(3)CPU通过数据线将数据26送入内存的3号单元中。

从上面我们知道了CPU是如何进行数据读写的。可是,如何命令计算机进行数据的读写呢?

要让一个计算机或微处理器工作,应向它输入能够驱动它进行工作的电平信息(机器码)

机器码:        101000000000001100000000

含义:          3号单元读取数据送入寄存器AX

CPU接收这条机器码后将完成我们上面所述的读写工作。

机器码难于记忆,用汇编指令来表示,情况如下。

机器码:        10100001 00000011 00000000

对应的汇编指令:MOV AX,[3]

含义:          传送3号单元的内容入AX

 

通过上图,我们可以知道,cpu读写数据时,可以通过存储器,也可以通过Cache,并且根据传送信息的不同,总线从逻辑上又分为3类,地址总线、控制总线和数据总线。下面我们就来看看地址总线的工作原理

现在我们知道,CPU是通过地址总线来指定存储器单元的。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。

现假设,一个CPU10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机中,一根导线可以传送的稳定状态只有两种,高电平或是低电平。用二进制表示就是1010根导线可以传送10位二进制数据。而10位二进制数可以表示多少个不同的数据呢?210次方个。最小数为0,最大数为1023

为了让大家看得更加简单明了,我们来看下面的图:
222222.jpg

图二展示了一个具有10根地址线的CPU向内存发出地址信息1100000001101)时10根地址线上传送的二进制信息。考虑一下,访问地址为121314等的内存单元时,地址总线上传送的内容是什么?(12=0000001110,13=0000001111)

一个CPUN根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2N次方个内存单元。

相信通过上面的描述,大家应对地址总线的原理有了一定的了解,那么根据地址总线将地址传给了存储器的某个存储单元后,数据总线又是如何工作的呢?

CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。8根数据总线一次可传送一个8位二进制数据(即一个字节)16根数据总线一次可传送两个字节。

8088CPU的数据总线宽度为88086CPU的数据总线宽度为16。我们来分别看一下它们向内存中写入数据89D8H时,是如何通过数据总线传送数据的。图三展示了8088CPU数据总线上的数据传送情况;图四展示了8086CPU数据总线上的数据传送情况。
333333.jpg
444444.jpg

808616根数据线,可一次传送16位数据,所以可一次传送数据89D8H;而8088只有8根数据线,一次只能传8位数据,所以向内存写入数据89D8H时需要进行两次数据传送。

通过上面的描述,我们知道,当我们需要对数据进行操作时,通过地址总线可在存储器中找到相应的存储单元,通过数据总线,可取得存储单元所存储的值。那么我们如何确认对数据进行的是读还是写?是对存储器的操作还是cache等的操作呢?对了,就是控制总线,我们来看看控制总线的原理吧

  CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。

前面所讲的内存读或写命令是由几根控制线综合发出的,其中有一根称为"读信号输出"的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据;有一根称为"写信号输出"的控制线则负责传送写信号。

现在我们总结如下:

(1) 汇编指令是机器指令的助记符,同机器指令一一对应。

(2) 每一种CPU都有自己的汇编指令集。

(3) CPU可以直接使用的信息在存储器中存放。

(4) 在存储器中指令和数据没有任何区别,都是二进制信息。

(5) 存储单元从零开始顺序编号。

(6) 一个存储单元可以存储8bit,即8位二进制数。

(7) 1Byte8bit  1KB1024B  1MB1024KB  1GB1024MB

(8) 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能:

地址总线的宽度决定了CPU的寻址能力;

数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;

控制总线的宽度决定了CPU对系统中其他器件的控制能力。

 

 

 

 

 

 

 

 

 

 

 

 

 

 



 

 

 

 

posted on 2009-03-25 18:45  jasonM  阅读(2038)  评论(2编辑  收藏  举报