不多说,上图理解快点,画了个草图。先声明,只浅显的讨论计算机怎么工作的,不讨论很深入的汇编知识。《我理解中的》计算机原理模型

        你知道吗,CPU好蠢的,它只认识0和1,而且没有记忆功能,你问他现在在干嘛?它肯定回答你“不知道干嘛”,你问它,你刚才干了啥?它会回答你“”“刚才有干嘛吗?”,先让你建立一个蠢得印象。CPU蠢是蠢了点,但还是有优点的,做事速度快,做事有原则(嗯,很有原则很有个性),速度快就没啥好说了,如果速度不快的话那真是一无是处了。接下来我将讨论一下它做事很有原则的特性(如果没原则那我们还真和它没话说了)。

        CPU这货你要和它沟通你必须按照它的原则来,CPU只能够和它的寄存器和RAM直接沟通,CPU将数据从RAM取出数据,取出来的数据可以直接操作也可以,或者将数据放在CPU的通用寄存器中(那些是通用寄存器呢!来看图,就是那4个EAX,EBX,ECX,EDX,这4个寄存器都是32位的。不过历史原因他们要兼容以前16位和8位的,AX,BX,CX,DX就是16位了。AH,AL,BH,BL,CH,CL,DH,DL就是8位的了,是不是还蛮有规律的),从RAM中读取的数据可以直接存放在通用寄存器中,RAM都是以字节为单位的(也就是8位),如果一次只取出来一位,你可以选个8位寄存器装入就好,如果一次取出来2位那你就用个16位的寄存器来装就好了,如果一次取4个字节,那你用32位的装入就好了,如果一次取8位字节呢,不好意思这是32位的CPU,你得取2次才行。一次可以从内存取1个字节,2个字节,4个字节都合法,你说取8个字节装不下,那我取3个字节行吧,行!不过你得用32位寄存器来装(一个小原则体现出来了)。从内存取出来的数直接操作,操作完的结果还是要存放在寄存器中,将数据处理完成了,他的结果就会放在它那些通用寄存器中,这个时候你可以选择将它放回RAM中或者舍弃,RAM的特性普及一下,在通电的情况下,数据能正常保存,在掉电的情况下数据将全部丢失。既然会存在丢失,那我不存在RAM中了,我们想把数据直接存在硬盘中吧,让CPU直接将数据存放在硬盘中,这只是我们一厢情愿的认为,CPU才不会理你,CPU不和RAM和寄存器以外的设备打交道,CPU和硬盘存在的“语言沟通障碍”聊不到一块来。

         这样看来其实CPU能够使用的资源实在太少了,处理数据的时候就只能靠着那几个通用寄存器来帮忙,数据量太大时就得找RAM帮忙。不过想到CPU这货一次只执行一条命令,又不关心自己在干嘛,以前干过啥,对于CPU来说,通用寄存器和RAM永远是想用就用的,不想让它用的是程序员,操心的也是程序员,这么看来还是人心太复杂了,CPU可以不关心以前干过啥,但将来该干嘛是有规划的,谁帮它规划的,是CPU自己吗?当然不是,是程序员规划的,规划了它将来要怎么走。说到这里,来看看程序员是怎么一步一步操作程序的运行,以及生产CPU的厂家为CPU制定了那些规定,以及使用CPU中的寄存器和RAM怎么来忽悠CPU来帮我们完成复杂的操作。

来网上荡一波科普知识:

1) 通用寄存器

8个通用寄存器是8086寄存器的超集,它们的名称和用途分别为:

	EAX  一般用作累加器
     EBX  一般用作基址寄存器(Base)
      ECX  一般用来计数(Count)
     EDX  一般用来存放数据(Data)
     ESP  一般用作堆栈指针(Stack Pointer)
     EBP  一般用作基址指针(Base Pointer)
     ESI  一般用作源变址(Source Index)
     EDI  一般用作目标变址(Destinatin Index)

        8个通用寄存器中通常保存32位数据,但为了进行16位的操作并与16为机保持兼容,它们的低位部分被当成8个16位的寄存器,即AX、BX…DI。为了支持8位的操作,还进一步把EAX、EBX、ECX、EDX这四个寄存器低位部分的16位,再分为8位一组的高位字节和低位字节两部分,作为8个8位寄存器。这8个寄存器分别被命名为AH、BH、CH、DH和AL、BL、CL、DL。对8位或16位寄存器的操作只影响相应的寄存器。例如,在做8位加法运算时,位7的进位并不传给目的寄存器的位8,而是把标志寄存器中的进位标志(CF)置位。因此,这8个通用寄存器既可以支持1位、8位、16位和32位数据运算,也支持16位和32位存储器寻址。补充一下通用寄存器一般只会使用EAX,EBX,ECX,EDX。ESP,EBP,ESI,EDI,有其他用途,如果你一定要使用CPU才不会管你。顺便说一句,如果你不用汇编写代码,你根本没资格直接操作这些寄存器,高级语言包装的很好,这些底层分配就交给编译器去执行吧,不过毕竟是机器帮你分配的,分配的合理肯定合理,那么分配的是否最优,那就不管了(编译器管杀不管埋)过分了哈,其实没这么惨,现在的编译器做的还挺好。

        8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。在80386中, 有6个16位的段寄存器,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器无法存放32位 的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中。因此,在80386中,我们把段寄存器叫做选择符。下面给出6个段寄存 器的名称和用途:

	CS 代码段寄存器
     DS 数据段寄存器
     SS 堆栈段寄存器
     ES、FS及GS 附加数据段寄存器
未完待续:


相关文章: