计算机控制系统之CPU组成及原理(内存寄存器)

124 篇文章 11 订阅
29 篇文章 2 订阅

CPU、内存、寄存器相关基础知识

计算机内部是由IC(Intergrated circuit,集成电路,其由很多晶体管组成)这种电子部件构成的。CPU和内存就是IC的一种。IC的一个引脚只能表示两个状态,因此计算机的信息只能用二进制来处理。

CPU是什么
从功能来看,CPU内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。

寄存器可以暂存指令、数据等处理对象,可以将其看成内存 的一种。
控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整台计算机。
运算器负责从内存读入寄存器的数据。
时钟负责发出CPU开始计时的时钟信号。不过有些CPU的时钟处于CPU的外部。

通常说的内存指的是计算机的主存储器,简称主存,主存通过控制芯片等与CPU相连,主要负责存储指令和数据。


CPU的四个构成部分中,程序员只需要了解寄存器即可,其余三个都不用太过关注。因为程序是把寄存器作为对象来描述的。

例如下面汇编代码中,eax和ebp表示的都是寄存器。

mov eax,dword ptr [ebp-8]    把数值从内存复制到eax
Add eax,dword ptr [ebp-0ch]  eax的数指和内存的数值相加
mov dword ptr [ebp-4],eax    把eax的数指储存在主存中


再对CPU有了一个大体的映像后,我们来看一下程序是如何按照流程来进行的。

用户发出启动程序的指令后,windows等操作系统会把硬盘中保存的程序复制到内存后,会将程序计数器(CPU寄存器的一种)置值,然后程序开始运行,每次CPU执行一个指令后,程序计数器就会自动加一。然后,CPU的控制器就会参照程序计数器的数值,从内存中读取命令执行。也就是说,程序计数器决定着程序的流程。


如果存在条件分支或循环机制,将使用跳转指令

CPU执行比较的机制比较有意思。例如,假设要比较累加寄存器中存储的XXX的值和通用寄存器中存储的YYY值,执行比较的指令后,CPU的运算装置就会在内部(暗中)进行XXX-YYY 的减法运算。而且会将结果保存在标志寄存器中。


通过基址寄存器与变址寄存器,我们可以对主内存上的特定内存区域进行划分,从而实现类似数组的操作。

内存是什么
图4-1是内存IC的引脚配置示例。这个IC中能存储多少数据呢?数据信号引脚由D0~D7共8个,表示一次可以输入输出8位(1字节)的数据。此外,地址信号引脚有A0~A9共10个,表示可以指定0000000000~1111111111共1024个地址。而地址用来表示数据的存储场所,因此我们可以得出这个内存IC中可以存储1024个1字节的数据。因为1024 = 1 K 1024=1K1024=1K,所以这个内存IC的容量就是1KB。假设计算机的内存是512M,这就相当于512000个1KB的内存IC。


计算机的主要存储设备就是内存和磁盘。磁盘中存储的程序,必须要加载到内存后才能运行。因为CPU需要通过内部程序计数器来指定内存地址,然后才能读出程序。

磁盘缓存指的是从磁盘中读出的数据储存到内存空间的方式(缓解硬盘访问速度过慢)。这种将低速设备的数据保存在高速设备中,需要时可以直接从高速设备中读出。(在网络web中有缓存到磁盘的机制,每次加载网页速度可以提高)

虚拟内存则是把磁盘的一部分作为假想的内存使用(缓解内存不足)。虚拟内存虽说是把磁盘作为内存的一部分使用,但实际上正在运行的程序部分,在这个时间点上必须存在在内存中的。也就是说,为了实现虚拟内存,就必须把实际内存(物理内存)的内容,和磁盘上的虚拟内存的内容进行部分置换(swap),并同时运行程序。

虚拟内存的方法有分页式和分段式两种。

windows采用的方式是分页式。该方式是指,在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page)进行分割,并以页为单位在内存和磁盘间进行置换。

在分页式中,我们把磁盘的内容读出到内存称为Page In,把内存的内容写入带磁盘称之为Page Out。一般情况下,Windows计算机的页大小是4KB。也就是说,把大程序用4KB的页来切分,并以页为单位放入磁盘(虚拟内存)或内存中。


当然,虚拟内存的方式治标不治本,真正要解决问题,我们需要增加内存的容量,或者减小运行的应用文件。

使用DLL文件实现函数共用
调用_stdcall来减小程序文件的大小

/**********************************

CPU是什么
CPU是什么?
CPU 实际做什么?
CPU的内部结构
CPU 是寄存器的集合体
计算机语言
汇编语言
程序计数器
条件分支和循环机制
标志寄存器
通过地址和索引实现数组
CPU 指令执行过程
CPU是什么?
CPU 的全称是 Central Processing Unit,也是电脑中最硬核的组件,它计算机的关系就相当于大脑和人的关系。
它是一种小型的计算机芯片,通常嵌入在电脑的主板上。CPU的构建是通过在单个计算机芯片上放置数十亿个微型晶体管来实现。这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,
所以,也可以说CPU决定了你电脑的计算能力。

CPU 实际做什么?
CPU的工作核心是从程序或应用程序中获取指令并且执行计算。这个过程一共有三个关键阶段:提取,解码和执行。
CPU先从系统的RAM中提取指令,随后解码该指令的实际内容,最后再由CPU的相关部分执行该指令。

CPU的内部结构
以CPU的运行流程为例:

在这个流程中,CPU负责解释和运行最终转换成机器语言的内容。CPU 主要由两部分构成:控制单元和算数逻辑单元(ALU)。

控制单元:从内存中提取指令并解码执行;
算数逻辑单元(ALU):处理算数和逻辑运算。
CPU和内存都是由许多晶体管组成的电子部件,可以把它比作计算机的心脏和大脑。它能够接收数据输入,执行指令并且处理相关信息。它与输入/输出(I / O)设备进行通信,这些设备向 CPU 发送数据和从 CPU 接收数据。从功能上来看,CPU的内容是由寄存器、控制器、运算器和时钟四部分组成的,各个部分之间通电信号来连通。

这里简单介绍一下内存,为什么说到CPU需要讲一下内存呢?因为内存是与 CPU 进行沟通的桥梁。
计算机中所有程序的运行都在内存中得到运行的。内存一般又被称为主存,它的作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。CPU会在计算机运转时,把需要运算的数据调到主存中进行运算。在运算完成之后,CPU将结果传送出来,主存的运行也决定了计算机的稳定运行。主存一般通过控制芯片与CPU相连,由可读写的元素构成,每个字节都有一个地址编号。CPU 通过地址从主存中读取数据和指令,也可以根据地址写入数据。
注意一点:当计算机关机时,内存中的指令和数据也会被清除。

CPU 是寄存器的集合体
在 CPU 的四个结构中,寄存器的重要性远远高于其余三个。因为程序通常是把寄存器作为对象来进行描述的。而说到寄存器,就不得不说到汇编语言,说到汇编语言,就不得不说到高级语言,说起高级语言也就不得不提及语言的概念

计算机语言
人和人之间最古老和直接的沟通媒介是语言。但是和计算机沟通,就必须按照计算机指令来交换,其中就涉及到语言的问题。最早,为了解决计算机和人类的交流的问题,出现了汇编语言。但是汇编语言晦涩难懂,所以又出现了像是 C,C++,Java的这种高级语言。因此,计算机语言一般分为低级语言和高级语言。使用高级语言编写的程序,经过编译转换成机器语言后才能运行,而汇编语言经过汇编器才能转换为机器语言。

汇编语言
先来看一段采用汇编语言表示的代码清单:

mov eax, dword ptr [ebp-8]   /* 把数值从内存复制到 eax */
add eax, dword ptr [ebp-0Ch] /* 把 eax 的数值和内存的数值相加 */
mov dword ptr [ebp-4], eax /* 把 eax 的数值(上一步的结果)存储在内存中*/

这是采用汇编语言编写程序的一部分。汇编语言采用助记符来编写程序,每个原本是电信号的机器语言指令会有一个与其对应的助记符。比如,
mov,add 分别是数据的存储(move)和相加(addition)的简写。
汇编语言和机器语言一一对应。这点和高级语言不同,我们通常把汇编语言编写的程序转换为机器语言的这个过程,称之为汇编。与之相反,将机器语言转化为汇编语言的过程称之为反汇编。汇编语言可以帮助你理解计算机做了什么工作,机器语言级别的程序通过寄存器来处理,上面代码中的eax,ebp都是表示的寄存器,它们是CPU内部寄存器的名称。
因此,可以说 CPU 是一系列寄存器的集合体。

一般,在内存中的存储通过地址编号来表示,寄存器的种类是通过名字来区分。那些不同类型的CPU,其内部寄存器的种类、数量以及寄存器存储的数值范围也都是不同的。不过,根据功能的不同,我们可以将寄存器划分为下面几类:

其中,程序计数器、标志寄存器、累加寄存器、指令寄存器和栈寄存器只有一个,其他寄存器一般有好几个。


程序计数器
程序计数器是用来存储下一条指令所在单元的地址。程序在执行时,PC的初值作为程序第一条指令的地址,在顺序执行程序时,控制器先按照程序计数器所指出的指令地址,从内存中取出一条指令,随后分析和执行该指令,并同时将PC的值加1指向下一条要执行的指令。
我们可以通过一个事例来仔细看一下程序计数器的执行过程:

这是一段进行相加的操作,程序启动,在经过编译解析后,会经由操作系统把硬盘中的程序复制到内存中。以上示例程序,就是将123和456执行相加的操作,随后将结果输出到显示器上。因为使用机器语言很难描述,所以这些都是经过翻译后的结果。
事实上,每个指令和数据都有可能分布在不同的地址上,但是为了更好的说明,就把组成一条指令的内存和数据放在了一个内存地址上。地址0100是程序运行的起始位置,Windows等操作系统把程序从硬盘复制到内存以后,就会将程序计数器作为设定为起始位置0100,然后再执行程序,每次执行一条指令后,程序计数器的数值就会增加1,或者是直接指向下一条指令的地址。随后,CPU会根据程序计数器的数值,从内存中读取命令并且执行,换言之,程序计数器控制着程序的流程。

条件分支和循环机制
高级语言汇总的条件控制流程主要分为顺序执行、条件分支、循环判断三种。顺序执行是按照地址的内容顺序的执行命令。而条件分支则是根据条件执行任意地址的指令。循环则是重复执行同一地址的指令。一般情况下,顺序执行的情况较简单,每次执行一条指令程序计数器的值就是+1。
条件和循环分支会使得程序计数器的值指向任意的地址,这样一来,程序就可以返回到上一个地址来重复执行同一个指令,或者跳转到其它任意指令。下面,我们就以条件分支举例来说明程序的执行过程:

程序的开始过程和顺序流程是一样的,程序的顺序流程和开始过程相同。CPU从0100处就开始执行命令,在0100和0101中都是顺序执行,PC的值顺序+1,执行到0102地址的指令时,判断0106寄存器的数值大于0,跳转到0104地址的指令,再将数值输到显示器中,随后结束程序,0103的指令就被跳过了。这和我们程序中的if()判断相同,在不满足条件的情况下,指令一般会直接跳过。因此,PC的执行过程没有直接+1,而是下一条指令的地址。

标志寄存器
条件和循环分支会使用到 jump(跳转指令),会根据当前的指令来判断是否跳转,上面我们提到了标志寄存器,无论当前累加寄存器的运算结果是正数、负数还是零,标志寄存器都会将其保存。CPU 在进行运算时,标志寄存器的数值会根据当前运算的结果自动设定,运算结果的正、负和零三种状态由标志寄存器的三个位表示。标志寄存器的第一个字节位、第二个字节位、第三个字节位各自的结果都为1时,分别代表着正数、零和负数。

CPU 的执行机制比较有意思,假设累加寄存器中存储的 XXX 和通用寄存器中存储的 YYY 做比较,执行比较的背后,CPU 的运算机制就会做减法运算。而无论减法运算的结果是正数、零还是负数,都会保存到标志寄存器中。结果为正表示 XXX 比 YYY 大,结果为零表示 XXX 和 YYY 相等,结果为负表示 XXX 比 YYY 小。程序比较的指令,实际上是在 CPU 内部做减法运算。

通过地址和索引实现数组
接下来是基址寄存器和变址寄存器,通过这两个寄存器,可以对主存上的特定区域进行划分,以此实现类似数组的操作。
首先,可以用十六进制数将计算机内存上的 00000000 - FFFFFFFF 的地址划分出来。这样,凡是该范围的内存地址,只要有一个 32 位的寄存器,就可以查看全部地址。但是,要是想像数组那样,分割特定的内存区域以达到连续查看的目的的话,使用两个寄存器会更方便一些。比如,我们用两个寄存器来表示内存的值。

这种表示方式很像数组的构造,数组是指同样长度的数据,在内存中进行连续排列的数据构造。用数组名表示数组全部的值,通过索引来区分数组的各个数据元素,例如: a[0] - a[4],[]内的 0 - 4 就是数组的下标。

CPU 指令执行过程
CPU 到底是怎么一条条的执行指令的呢?工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数、结果写回。

取指令阶段就是将内存中的指令读取到CPU中寄存器的过程,程序起存起用语存储下一条指令所在的地址;
在取指令完成后,立马进入指令译码阶段,在指令译码阶段,指令编码器按照预先的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别和各种获取操作数的方法;
执行指令阶段的任务是完成指令所规定的各种操作,具体实现指令的功能;
访问取数阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算;
结果写回阶段作为最后一个阶段,把执行指令阶段的运行结果数据“写回”到某种存储形式:结果数据经常被写到CPU的内部寄存器中,以便被后续的指令快速地存取。

/*****************************CPU和寄存器详解

1.CPU
2.程序内存需要分段(以8086CPU为例)
3.CPU的不同型号
4.十六位寄存器(以8086为例,即x86架构)
4.1通用寄存器:
4.1.1数据寄存器:
4.1.2指针寄存器:
4.1.3变址寄存器
4.2段寄存器:
4.3控制寄存器
5. 三十二位寄存器(80386 )
1.CPU
编译器是一个程序,它可以将我们所写的程序翻译成特殊的机器语言结构。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。

电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率,即每秒15亿次的时钟脉冲。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一个指令需要跳动的次数(或就像他们经常说的执行周期)依赖CPU的产生和模仿。周期的次数取决于它之前的指令和其他因素。

2.程序内存需要分段(以8086CPU为例)


内存按访问的方式来看,就像长方形的带子,地址依次升高。内存是一个随机读写设备,即可以访问内部任何一处,不需要从头开始找,只要直接给出实际物理地址即可。
而分段是内存访问的机制,是给CPU用的访问内存的方式,只有CPU才会关注段
8086CPU有20根地址线,最大可寻址内存空间为1MB,2^20Byte。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为若干个段,每段不超过64KB,在8086中设置4个16位的段寄存器,用于管理4种段,注意这里是种,不是个(内存是分成四种段,这是考虑到程序执行时需要的四个部分。但是,内存不止四个段,只是同时最多只有四个段在工作,其他的在“睡眠”,需要时再“唤醒”。),具体种类为:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。
内存分段后,内存的地址(又称物理地址)就由两部分组成:段地址和段内偏移地址,段寄存器管理的是段地址。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
上述便是段地址×16(或者左移四位)+偏移地址=物理地址”的寻址模式的由来。
第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。
3.CPU的不同型号
8088,8086:
这些CPU从编程的观点来看是完全相同的。它们是用在早期PC机上的CPU。它们提供一些16位的寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS。它们仅仅支持1M字节的内存,而且只能工作在实模式下。在这种模式下,一个程序可以访问任何内存地址,甚至其它程序的内存!这会使排除故障和保证安全变得非常困难!而且,程序的内存需要分成段。每段不能大
于64K,即2^16Byte(16位的寄存器)。

80286:
这种CPU使用在AT系列的PC机中。它在8088/86的基本机器语言中加入了一些新的指令。然而,它主要的新的特征是16位保护模式。在这种模式下,它可以访问16M字节的内存和通过阻止访问其它程序的内存来保护程序。可是,程序依然是分成不能大于64K的段,即2^16Byte(16位的寄存器)。

80386:
这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一个新的32位保护模式。在这种模式下,它可以访问4G字节。程序同样分成段,但是现在每段大小同样可以到4G,即2^32Byte(32位的寄存器)

还有很多CPU型号这里不在列出,毕竟我们不做CPU的芯片开发,我们学习结构较为简单的CPU,了解其原理即可。

4.十六位寄存器(以8086为例,即x86架构)
寄存器是CPU内部的存储部件与内存空间没有关系,设置寄存器的原因是为了减少CPU与内存交换数据的次数,以提高计算机的工作速度。

8086 CPU 中寄存器总共为 14 个,即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,且都为16位。

4.1通用寄存器:
通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI 。

4.1.1数据寄存器:
AX,BX,CX,DX 称作为数据寄存器,都可以暂存一般的数据,他们还具有其他的特殊用途,具体的特殊用途如下:

AX (Accumulator):累加寄存器,也称之为累加器,除了做加法以外,还可以做乘法或除法,当操作的数是16位的时候经常与DX搭配使用,如下:

做除法(DIV)运算时:
除数可以存放在寄存器中或者是内存单元中,被除数默认放在AX或(DX和AX)中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,那么被除数就为32位,存放在DX和AX两个寄存器中,高16位存放在DX,低16位存放在AX。即除数可以是 8 位或者是 16 位的:

当除数是 8 位时,被除数一定会是 16 位的,并且默认是放在 AX 寄存器中,如果除数是 8 位的,则在 AL 中会保存此次除法操作的商,而在 AH 中则会保存此次除法操作的余数,
而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。
做乘法(MUL)运算时:
两个相乘的数要么都是 8 位,要么都是 16 位:

如果两个相乘的数都是 8 位的话,则一个默认是放在 AL 中,而另一个 8 位的乘数则位于其他的寄存器或者说是内存字节单元中,当 MUL 指令执行完毕后,如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中,
而如果两个相乘的数都是 16 位的话,则一个默认存放在 AX 中,另一个 16 位的则是位于 16 的寄存器中或者是某个内存字单元中。
同时,而如果是 16 位的乘法运算的话,则默认乘法运算的结果有 32 位,其中,高位默认保存在 DX 中,而低位则默认保存在 AX 中。
BX (Base):基地址寄存器;
BX 主要还是用于其专属功能 :存储偏移地址(与段寄存器搭配,可以寻址物理地址)。
如果未额外指明寄存器,会默认使用 DS 段寄存器,例如 [BX],相当于DS:[BP]
段地址×16(或者左移四位)+偏移地址=物理地址

CX (Count):计数器寄存器;
CX 中的 C 被翻译为 Counting 也就是计数器的功能,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:

一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;
还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。
DX (Data):数据寄存器;
在做除法(DIV)或者乘法(MUL)运算的时候可以搭配AX使用,请参考上面关于AX详细用法的讲解。

4.1.2指针寄存器:
SP (Stack Pointer):堆栈指针寄存器;
段地址使用默认的 SS 寄存器中的值
在任何时刻,SS:SP 都是指向栈顶元素
BP (Base Pointer):基指针寄存器;
段地址使用默认的 SS 寄存器中的值
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址。
sp会随着带有堆栈操作的指令(比如PUSH、CALL、INT、RETF)产生变化,而BP不会,所以在带参数的子过程中用BP来获取参数和访问设在堆栈里面的临时变量。
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。如下
在函数进入时:
push bp // 保存bp指针
mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。
// 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
.....
.....
函数结束时:
mov sp,bp // 将原sp指针传回给sp
pop bp // 恢复原bp的值。
ret // 退出子函数

只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。
他们也是通用寄存器,在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

4.1.3变址寄存器
SI (Source Index):源变址寄存器;
SI会默认使用 DS 段寄存器
DI (Destination Index):目的变址寄存器;
DI 会默认使用 DS 段寄存器
两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,但是在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

4.2段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
16位CS,DS,SS 和ES 寄存器是段寄存器。它们指出程序不同部分所使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在后面的文章中。

4.3控制寄存器
IP (Instruction Pointer):指令指针寄存器;
指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。
FLAG:标志寄存器;
FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之为0。并不是所有指令都修改FLAGS里的位。
5. 三十二位寄存器(80386 )
80386及以后的处理器扩展了寄存器。例如:16位AX寄存器扩展成了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,ESI 和EDI 。
许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用寄存器,在32位保护模式下只有这此寄存器的扩展形式被使用。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值