1、计算机存储体系简介:

1.1、计算机存储体系分四层:

1.1.1、外存容量最大、速度最慢、稳定性最高;

   1.1.2、内存:容量远小于外存,速度远高于外存,不稳定(断电内容消失);

                ROM和RAM:

                通常所说的内存(主存),仅指RAM;

                ROM是“固化的软件设备”;其固化的软件包括:自检程序、基本输入输出程序、自举程序;

             计算机加电启动的基本过程是:CPU从ROM中取并执行自检程序,自检成功,根据自举程序从指定“系统盘(Windows系统通常为C盘)”(外存)提取并执行OS的启动过程,然后,将计算机控制权移交OS。

    1.1.3、高速缓存:

              虽然内存是由电路组成的,其速度远高于外存;但是,比CPU速度而言,内存速度依然很慢;若CPU所执行的指令数据,每每都需要从内存中取得,或者,CPU计算结果每每都需要存储到内存,则CPU再快都没有用,因为, 最后的速度取决于内存速度!通常情况下,内存的速度比CPU慢将近一个数量级(5-10)倍。为了解决内存与CPU速度不匹配的问题,在计算机中增加了一种造价比内存昂贵,但容量远小于内存的“高速缓存”器件。

    1.1.4、寄存器:

               虽然高速缓存在一定程度上缓解了CPU与内存速度上的矛盾,但是,不能产生本质性的性能提高。因为,高速缓存速度依然比CPU慢很多。所以,早在计算机出现之初,计算机CPU中就已经设计和容量更小,速度更高(与CPU同速)的存储器件——寄存器!

1.2、寄存器

    1.2.1、寄存器分类:通用寄存器组、段寄存器组(不介绍)、辅助寄存器组(介绍部分)、两个特殊寄存器。

    1.2.2、通用寄存器组:EAX(AX)、EBX(BX)、ECX(CX)、EDX(DX)

               两种数值都可以决定CPU字长:总线(根)宽度(我们所用的计算机均为32根,故为32位计算机;64位机只是在操作系统意义上的64位,并不是CPU意义上的64位)、寄存器位数。

               AX(Add),常用于计算机计算(+、-、*、/、&、|、~、^);函数返回值,通常就是通过AX完成的,这是在编译级别实现的。

               BX(Base),除了可以计算(与AX功能类似)外,经常用来表示数组下标这样的“偏移量”。

               CX(Count),除了可以计算外,系统在硬件层面,经常将CX作为LOOP(循环)的“计数器”。

               DX(Data),通常辅助AX进行扩展位运算。

    1.2.3、辅助寄存器中的SP和BP:

               通常BP表示堆栈的栈底位置(地址);SP表示系统堆栈的栈顶位置(地址)。

    1.2.4、IP指令指针(指令寄存器)

               IP是用来存储“下一步”要执行的某个进程(线程)的代码的地址的;

               IP具有“自动增1”的功能(1指一条指令长度字节;增1过程无需CPU参与,与CPu同步执行);这可以完成程序的顺序执行;

               IP的值,可以用过类似:JMP、JE、JG、CALL等特殊执行进行修改、从而实现程序的跳转(循环)执行。MOV IP, XXX是非法的汇编指令!

                由此可见,IP是非常重要的运行时状态信息,是保护现场信息时,首要要被保护的对象!

    1.2.5、标志位寄存器:flag

                通过flag计算机才能真的可以实现逻辑判断!那么,这个寄存器的值,在保护现场时,也必须保存。

1.3、关于C源程序与上述寄存器的关系:

            所有的C程序源代码,都要进行编译,从而生成最终的机器指令代码和文件(可执行文件);那么,上述内容最终是由编译软件负责完成的;也就是说,编译软件将我们的ASCII码形式的源程序代码,根据自己的原则,使用上述寄存器完成源代码的任务!反过来说,如果在编程中需要特殊处理,那么,就需要给编译器一定的“指导”,方可达到我们的原始目的!

2、关于系统堆栈和系统堆

        操作系统将内存分成:系统数据、系统功能调用(核心代码)区域;用户代码和数据区域;系统堆栈区;系统堆区。

        系统堆栈是由OS和计算机指令体系及用户程序共同管理的!

2.1、系统堆栈最重要的功能:

        保证函数调用和返回的顺序!同时保证了,当函数返回到其主调函数时,能够让主调函数正常接续着被打断的执行过程,继续执行下去!

2.2、上述功能完成的基本机制是“现场信息”的概念!在主调函数调用子函数之前,会做如下工作:

        2.2.1、从右向左的将函数的实参表达式的值,依次计算出来,并入系统堆栈;

        2.2.2、上面实参表达式计算出来的值,在系统堆栈中所占用的空间,就是与之对应的形参变量的空间!!!这就已经完成了“参数传递”!

        2.2.3、通过CALL汇编指令,调用子函数;而这个CALL会将主调函数的现场信息保护到系统堆栈中,且紧邻形参变量的空间;

        2.3.4、子函数一开始,先将栈底指针移动到当前栈顶位置;

        2.3.5、进一步,将堆栈当前栈底向上的空间分配给子函数的局部变量!

        2.3.6、当子函数运行结束,恢复以前的栈底和栈顶指针;

        2.3.7、将栈顶指针减去形参变量所占用的空间,恢复到子函数调用之前的状态!