计算机程序中的bug,千奇百怪。要想能够顺利解决疑难杂症,就必须非常熟悉计算机的底层原理。比如在实际生产中,不仅我们的应用会出问题,操作系统也可能有bug,硬件也可能有bug。因此,只有对原理有更深的理解,才能更方便我们解决问题。本文简要介绍了计算机体系结构的基本原理。这些知识对于帮助我们解决难题会有很大的帮助。做程序开发,要深入原理,不仅要知其然,更要知其所以然。86处理器内部有8个16位的通用寄存器。CPU内部的数据单位有AX、BX、CX、DX、SP、BP、SI、DI。AX、BX、CX、DX可分为两个8位寄存器。这样也可以暂存较长的数据,也可以暂存比较短的数据。控制单元IP寄存器(InstructionPointerRegister)是指令指针寄存器——指向代码段下一条指令的位置——CPU会根据需要不断从内存的代码段加载指令到CPU的指令队列中到IP寄存器,然后交给运算单元执行切换过程——每个过程分为代码段和数据段——为了指向不同进程的地址空间,有4个16位的段寄存器,即CS、DS、SS和ESCS(CodeSegmentRegister)是代码段寄存器,通过它可以找到代码在内存中的位置DS(DataSegmentRegister)是数据段寄存器,通过它找到数据在内存中的位置SS(StackSegmentRegister)是栈寄存器,但是所有函数调用相关的操作都与栈息息相关——A调用B,B调用C——当A调用B时,logB函数的ic必须执行,所以A的操作的相关信息会被压栈——当B调用C时,类似的,B的操作的相关信息也会被压栈,然后运行逻辑C函数的运行——当C运行完毕,先pop为B,B再调用C函数之后的指令运行——B运行完毕后,再pop为A,A继续运行,直到加载内存结束data如果需要加载内存中的数据,可以通过DS在内存中找到数据,加载到一个通用寄存器中对于一个段,有一个起始地址,段中的具体位置称为偏移量CS和DS都存放段的起始地址,代码段的偏移量放在IP寄存器中,数据段的偏移量放在通用寄存器中CS和DS都是16位(起始地址),而IP寄存器和通用寄存器也是16位(偏移量),但是8086的地址总线是20位,20位:起始地址<<4+偏移量无论实际内存有多大,对于只有20位地址总线的8086来说,可以区分的地址是2^20=1M(寻址单位为Byte)如果要访问1M+X的地方,总线上20多位一部分根本发不出去,1M以内的X位置偏移只有16位,所以一个段的最大大小是2^16=64K。所以,对于一个8086的CPU来说,它只能访问1M的内存空间,需要分成多个段。每个段最多有64K个32位处理器。在一个32位的CPU中,有32条地址总线,可以访问2^32=4G的内存。x86架构是开放的,所以32位CPU需要兼容原来的架构兼容性1.通用寄存器——将8个16位通用寄存器扩展为8个32位通用寄存器,但仍然保留16位和8位的用法——高16位不能分成两个8位,因为这样是不兼容的2.IP寄存器——指向下一条指令的指令指针寄存器IP,会被扩充为32位,也兼容16位3、段寄存器(SegmentRegister)——CS、DS、SS、ES仍然是16位,但不再是段的起始地址。段的起始地址放在内存(表)的某处——表中的一项是段描述符(SegmentDescriptor),它是段的真正起始地址——而段寄存器存储了这张表中的一项,称为选择器(Selector)——获取段起始地址的过程:首先间接从段寄存器中查找表中的一项,然后从表中的项中获取段的真正起始地址——顺序为了快速得到段的起始地址,段寄存器会从内存中取到CPU的描述符缓存中——这种方式与8086方式不兼容,但是非常灵活,可以保持以后的兼容性。RealModeVSProtectedMode在32位架构下,前者的模式称为实模式,后者称为保护模式(ProtectedPattern)。系统刚启动时,CPU处于实模式。此时兼容原模式,即32位CPU也支持原模式运行,需要更新时速度会更快。当内存多了,就可以按照一定的规则,进行一系列的操作,然后切换到保护模式,以发挥32位CPU更强大的能力。如果不是无缝兼容,通过切换模式也是可以接受的系统。交互式通用汇编指令mov、call、jmp、int、ret、add、or、xor、shl、shr、push、pop、inc、dec、sub、cmp
