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、将栈顶指针减去形参变量所占用的空间,恢复到子函数调用之前的状态!