本文对Intel CPU寄存器做一些浅显的介绍。Intel处理器寄存器在很多教科书上有,网络也有很多文章涉及到。因此本文在这些基础上做一些归纳总结,另外也参考了Intel IA32架构软件开发手册。
一、Intel CPU发展历程
1、16位处理器(1978)
IA-32架构从16位处理器的发展而来,即8086和8088。8086拥有16比特寄存器、16比特外部数据总线,20比特寻址能力,共1MB地址空间。8088与8086相似,但其外部数据总线为8比特。
8086/8088引入分段机制(segmentation),16比特的段寄存器可指向最大64KB内存,同时使用4个段寄存器,能够访问256KB空间。20比特的地址由段寄存器和另一个16比特指针组成,则可以访问1MB范围的地址。
2、Intel 286处理器(1982)
Intel 286为IA-32架构引入了保存模式。保护模式使用段寄存器作为选择子或指针来索引描述符表(descriptor table)。描述符提供24比特基地址,可寻址16MB范围。支持虚拟内存管理,以及其它保护模式机制,包括:段限制检查、只读、只执行段、4个特权等级。
3、Intel386处理器(1985)
Intel386处理器是IA-32第一个32位处理器。引入32比特寄存器,同时使用操作符和寻址。低16位寄存器与8086等早期处理器保持兼容。386支持32比特地址,寻址空间达到4GB。另外支持段内存(segmented-memory)模式和扁平内存(flat-memory)模式。
(其它有空再慢慢写)
二、寄存器分类
二、寄存器分类详解
1、EAX, EBX, ECX, EDX都可以作为32位寄存器、16位寄存器或者8位寄存器使用。EAX可作为累加器用于乘法、除法及一些调整指令,对于这些指令,累加器常表现为隐含形 式。EAX寄存器也可以保存被访问存储器单元的偏移地址。EBX常用于地址指针,保存被访问存储器单元的偏移地址。ECX经常用作计数器,用于保存指令的 计数值。ECX寄存器也可以保存访问数据所在存储器单元的偏移地址。用于计数的指令包括重复的串指令、移位指令和循环指令。移位指令用CL计数,重复的串 指令用CX计数,循环指令用CX或ECX计数。EDX常与EAX配合,用于保存乘法形成的部分结果,或者除法操作前的被除数,它还可以保存寻址存储器数据。
2、EDI和ESI常用于串操作,EDI用于寻址目标数据串,ESI用于寻址源数据串。
3、EBP和ESP是32位寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。
4、标志寄存器EFLAGS
控制任务状态和模式切换、中断处理、指令追踪和访问权限控制.寄存器中的标志位需要特权指令代码才可以修改(特权指令:运行在内核态下的代码)
寄存器如图所示:
5、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
CS——代码段寄存器(Code Segment Register),其值为代码段的段值;
DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
参考:
http://blog.chinaunix.net/uid-27717694-id-3943419.html
Intel IA-32 架构软件开发人员手册:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
李迟2016.2.16 晚