通用寄存器地址范围设置方法
一、8086/8088 16位cpu的寄存器组
1、通用寄存器
AX(aumulator,AH|AL)累加器
BX(base,BH|BL)基址寄存器
CX(counter)计数器
DX(data)双字长运算时存放高位字,也用来存放I/O的端口地址
SP(stack pointer)椎栈指针寄存器
BP(base pointer)基址指针寄存器
DI(destination index)目的变址寄存器
SI(source index)源变址寄存器
2、专用寄存器
IP(instruction pointer)指令指针寄存器
FLAGS标志寄存器,又称程序状态字寄存器(PSWprogram status ord)
注IP和FLAGS又称为控制寄存器,SP、BP、SI、DI和IP又称为指针及变址寄存器,通用寄存器中除指针及变址寄存品外的其他部分又叫做数据寄存器。
3、段寄存器
CS(code segment)代码段寄存器
DS(data segment)数据段寄存器
SS(stack segment)堆栈段寄存器
ES(extra segment)附加数据段寄存器
二、80386及以后的80x86版本的寄存器
1、通用寄存器(32位,低16位和8086的通用寄存器一致)
EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI
2、专用寄存器
A、指令指针寄存器(32位)EIP。
B、标志寄存器(32位)EFLAGS
各标志位的解释如下
CF(Carry Flag)进位标志
PF奇偶标志
AF(Assistant Flag)辅助进位标志
ZF零标志
SF符号标志
TF陷阱标志
IF中断标志
DF方向标志
OF溢出标志
IOPL输入输出标志
NT(Nested Task)嵌套任务标志,为1时表示当前执行的任务嵌套于另一任务中,执行完该任务后,要返回到原来的任务中去。
RF(Restart Flag)重启标志,用来控制是否接受调试故障,RF=0时表进接受,RF=1时表示忽略。如果你的程序每一条指令都被成功执行,那么RF会被清0,而当接受一个非调试故障时,处理器置RF=1。
VM(Virtual Machine)虚拟8086模式,用软件方式模拟8086模式,允许多个1MB大小的段存储于存储器中执行。VM=0表示工作在一般的保护模式下,VM=1表示工作在8086模式下。
AC(Alignment Check)对齐检查,置位该标志和控制寄存器CR0的AM标志则启用对内存引用的对齐检查,清除这两个标志则禁用对齐检查。当引用一个没有对齐的操作数时,将会产生一个对齐检查异常,比如在奇地址引用一个字地址或在不是4的倍数的地址引用一个双字地址。对齐检查异常只在用户态(3特权)下产生。默认特权为0的内存引用,比如段描述符表的装载,并不产生这个异常,尽管同样的操作在用户态会产生异常。对齐检查异常用于检查数据的对齐,当处理器之间交换数据时这很有用,交换数据需要所有的数据对齐。对齐检查异常可供解释程序使用。让某些指针不对齐就好比做上特殊标记,这样就无需对每个指针都进行检查,只在用到的时候,对这些特殊指针进行处理就可以了。
VIF(Virtual Interrupt)虚拟中断,是IF的一个虚拟映像,和VIP一起使用,当控制寄存器CR4中VME或PVI标志为1且IOPL小于3时,处理器只识别VIF标志(VME用来启用虚拟8086扩展,PVI标志用来启用保护模式下的虚拟中断)。
VIP(Virtual Interrupt Pending)虚拟中断等待。置1表明有一个正在等待处理的中断,置0表明没有等待处理的中断,该标志和VIF一起使用。处理器读取该标志但从来不修改它。当VME标志或者控制寄存器CR4中的PVI标志置1且IOPL小于3时,处理器只识别VIP标志。
ID(Identification)识别,置1或0表示是否支持CPUID指令。
3、段寄存器CS、DS、ES、SS、FS、GS(全部是16位寄存器,其中FS和GS都是附加段)
80386以后的CPU段寄存器里面存放的都是选择子,用于从GDT或LDT里面选择段描述符,选择子结构如下
各标志位解释如下
RPL(0-1)请求优先级
TITable Indicator,用于指定是从GDT里选择描述符还是从LDT里选择描述符
Index选择的描述符在描述符表里的偏移。
这些段寄存器都有与之对应的不可见cache寄存器(段描述符寄存器,注意区别于段描述符表寄存器),用于存储与选择子对应的段描述符,当段寄存器内容发生改变时,与之对应的段描述符寄存器内容将会从段描述符表中加载,从而允许一次加载,多次访问这个段描述符。
选择子对应的段描述符结构如下
描述符结构描述如下
低4字节0-15位段限长的0-15位
低4字节16-31位段基址的0-15位
高4字节0-7位段基址的16-23位
高4字节8-11位TYPE用行指定段或门(Gate)的类型、说明段的访问种类以及段的扩展方向。该字段的解释依赖于描述符类型标志S指明是一个应用(代码或数据)描述符还是一个系统描述符。TYPE字段的编码对代码、数据或系统描述符都不同,如下图
S为1时(数据段或代码段)时type值说明
第11位E位可执行位,用于选择数据段或代码段,E为0时表示数据(或堆栈)段,E为1时表示代码段。
第10位X位数据段时表示扩展方向,X=0向上扩展,X=1时向下扩展。代码段时优先级忽略。
第9位R/W位数据段时是否允许写或不允许写,代码段时表示是否允许读。
第8位A位已访问位,段被访问时被置位为1,用于追踪哪些段被访问过。S为0时(系统段)type值说明0无效,180286任务状态段,2LDT,380286的任务状态段,480286的调用门,580286的任务门,680286的中断门,780286的陷阱门,8无效,980386作任务状态段,10为以后保留,1180386的任务状态段,1280386的调用门,13保留,1480386中断门,1580386的陷阱门。
高4字节12位S表示系统段标志,为0时表示是系统段,为1时表示是普通段(代码段或数据段)。
高4字节13-14位DPL(Descriptor Privilege Level)表示描述符的特权级,从0-3,0级最高,3级最低。
高4字节15位P表示段存在标志,用于指出一个段是在内存中(P=1)还是不在内存中(P=0)。当一个段描述符的P标志为0时,那么把指向这个段描述符的选择符加载进段寄存器将导致产生一个段不存在异常。内存管理软件可以使用这个标志来控制在某一给定时间实际需要把那个段加载进内存中。这个功能为虚拟存储提供了除分页机制以外的控制。下图给出了当P=0时的段描述符格式。当P标志为0时,操作系统可以自由使用格式中标注为可用(Available)的字段位置来保存自己的数据,例如有关不存在段实际在什么地方的信息。
高4字节16-19位段限长的16-19位
高4字节20位AVL可用位,表示描述符所描述的段是否可用,被系统软件使用
高4字节21位L保留位,总是为0高4字节22位D/B(Default operation size/default stack pointer size and/or upper bound)(默认操作大小/默认栈指针大小和/或上界限)标志根据段描述符描述的是一个可执行代码段、下扩数据段还是一个堆栈段,这个标志具有不同的功能。(对于32位代码和数据段,这个标志应该总是设置为1;对于16位代码和数据段,这个标志被设置为0。)可执行代码段。此时这个标志称为D标志并用于指出该段中的指令引用有效地址和操作数的默认长度。如果该标志置位,则默认值是32位地址和32位或8位的操作数;如果该标志为0,则默认值是16位地址和16位或8位的操作数。指令前缀0x66可以用来选择非默认值的操作数大小;前缀0x67可用来选择非默认值的地址大小。栈段(由SS寄存器指向的数据段)。此时该标志称为B(Big)标志,用于指明隐含堆栈操作(如PUSH、POP或CALL)时的栈指针大小。如果该标志置位,则使用32位栈指针并存放在ESP寄存器中;如果该标志为0,则使用16位栈指针并存放在SP寄存器中。如果堆栈段被设置成一个下扩数据段,这个B标志也指定了堆栈段的上界限。下扩数据段。此时该标志称为B标志,用于指明堆栈段的上界限。如果设置了该标志,则堆栈段的上界限是0xFFFFFFFF(4GB);如果没有设置该标志,则堆栈段的上界限是0xFFFF(64KB)。
高4字节23位G表示段限长的内存颗粒度,为1时以4KB为单位,为0时以1B为单位。控制段内偏移地址的寻址范围从1B-1MB或者从4KB-4GB。
高4字节24-31位段基址的24-31位。
4、控制寄存器(32位)CR0、CR1、CR2、CR3
用于保存全局的机器状态
各标志位解释如下
CR0的低16位被称为机器状态字(MSW),位含义如下
PE(Protection Enable)保护允许位,进行保护模式时,PE=1,除复位外,不能被清除,实模式时,PE=0。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。
MP(Monitor coProcessor或Math Present)监视协处理器位,当协处理器工作时,MP=1,否则,MP=0。用于控制WAIT/FWAIT指令与TS标志的交互作用。如果MP=1、TS=1,那么执行WAIT指令将产生一个设备不存在异常;如果MP=0,则TS标志不会影响WAIT的执行。
EM(EMulation)仿真协处理器位,当MP=0,EM=1时,表示用软件仿真协处理器。当该位设置时,表示处理器没有内部或外部协处理器,执行协处理器指令时会引起设备不存在异常;当清除时,表示系统有协处理器。设置这个标志可以迫使所有浮点指令使用软件来模拟。
TS(Task Sitched)任务切换位,当任务切换时,TS=1,此时不允许协处理器工作,切换完成后,TS=0。该标志用于推迟保存任务切换时的协处理器内容,直到新任务开始实际执行协处理器指令。处理器在每次任务切换时都会设置该标志,并且在执行协处理器指令时测试该标志。如果设置了TS标志并且CR0的EM标志为0,那么在执行任何协处理器指令之前会产生一个设备不存在异常。如果设置了TS标志但没有设置CR0的MP和EM标志,那么在执行协处理器指令WAIT/FWAIT之前不会产生设备不存在异常。如果设置了EM标志,那么TS标志对协处理器指令的执行无影响。在任务切换时,处理器并不自动保存协处理器的上下文,而是会设置TS标志。这个标志会使得处理器在执行新任务指令流的任何时候遇到一条协处理器指令时产生设备不存在异常。设备不存在异常的处理程序可使用CLTS指令清除TS标志,并且保存协处理器的上下文。如果任务从没有使用过协处理器,那么相应协处理器上下文就不用保存。
ET(Extension Type)协处理器类型位,当ET=1时,协处理器为80387,并使用32位协处理器协议。当ET=0时,协处理器为80287。如果仿真位EM=1,则该位将被忽略。在处理器复位操作时,ET位会被初始化指明系统中使用的协处理器类型。如果系统中有80387,则ET被设置成1,否则若有一个80287或者没有协处理器,则ET被设置成0。
NE(Numeric Error)协处理错误标志,对于80486及以上的CPU。当设置该标志时,就启用了x87协处理器错误的内部报告机制;若复位该标志,那么就使用PC形式的x87协处理器错误报告机制。当NE为复位状态并且CPU的IGNNE输入引脚有信号时,那么数学协处理器x87错误将被忽略。当NE为复位状态并且CPU的IGNNE输入引脚无信号时,那么非屏蔽的数学协处理器x87错误将导致处理器通过FERR引脚在外部产生一个中断,并且在执行下一个等待形式浮点指令或WAIT/FWAIT指令之前立刻停止指令执行。CPU的FERR引脚用于仿真外部协处理器80387的ERROR引脚,通常连接到中断控制器输入请求引脚上。NE标志、IGNNE引脚和FERR引脚用于利用外部逻辑来实现PC形式的外部错误报告机制。
启用保护模式PE(Protected Enable)位(位0)和开启分页PG(Paging)位(位31)分别用于控制分段和分页机制。PE用于控制分段机制。如果PE=1,处理器就工作在开启分段机制环境下,即运行在保护模式下。如果PE=0,则处理器关闭了分段机制,并如同8086工作于实地址模式下。PG用于控制分页机制。如果PG=1,则开启了分页机制。如果PG=0,分页机制被禁止,此时线性地址被直接作为物理地址使用。
如果PE=0、PG=0,处理器工作在实地址模式下;如果PG=0、PE=1,处理器工作在没有开启分页机制的保护模式下;如果PG=1、PE=0,此时由于不在保护模式下不能启用分页机制,处理器会产生一个一般保护异常,即这种标志组合无效;如果PG=1、PE=1,则处理器工作在开启了分页机制的保护模式下。
当改变PE和PG位时,必须小心。只有当执行程序至少有部分代码和数据在线性地址空间和物理地址空间中具有相同地址时,我们才能改变PG位的设置。此时这部分具有相同地址的代码在分页和未分页世界之间起着桥梁的作用。无论是否开启分页机制,这部分代码都具相同的地址。,在开启分页(PG=1)之前必须先刷新页高速缓冲TLB。在修改该了PE位之后程序必须立刻使用一条跳转指令,以刷新处理器执行管道中已经获取的不同模式下的任何指令。在设置PE位之前,程序必须初始化几个系统段和控制寄存器。在系统刚上电时,处理器被复位成PE=0和PG=0(即实模式状态),以允许引导代码在启用分段和分页机制之前能够初始化这些寄存器和数据结构。
WP(Write Proctect)写保护标志,对于Intel 80486或以上的CPU。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。该标志有利于UNIX类操作系统在创建进程时实现写时复制(Copy on Write)技术。
AM(Alignment Mask)对齐屏蔽位。与Pentium处理器的标志寄存器中的对齐较验标志位AC联合使用,当AM为1,AC也为1且当前优先级CPL=3(用户模式)才可以执行对齐较验。AM=1表示允许对齐较验,AM=0表示不允许对齐较验。
NW(Not Write Through)不写贯穿位,用来控制cache的功能,当NW为0时,允许写贯穿和允许cache无效操作周期。当NW位为1时,禁止cache无效操作周期和cache命中时写贯穿。
CD(Cache Deny)cache禁止位,用来控制使用的是否为片内cache。若CD=0,则Pentium的片内cache允许执行填充操作。若CD=1,即使cache不命中时,也不允许填充cache。但若访问cache时命中,cache操作仍会正常进行。若要完全禁用cache,则必须将cache内容完全变成无效内容。
PG是否启用分页机制。在开启这个标志之前必须已经或者开启PE标志。即若要启用分页机制,那么PE和PG标志都要置位。
CR1由Intel保留
CR2用于保存页故障的线性地址。
CR3用于保存当前任务的页目录地址。
5、系统地址寄存器AR
A、全局描述符表寄存器(48位)GDTR
用于保存全局描述符表的32位基地址和16位界限
B、中断描述符表寄存器(48位)IDTR
用于保存中断描述符表的32位基地址和16位界限
全局描述符表寄存器和中断描述符表寄存器结构一致,见下图。16位界限确定了全局描述符表和中断描述符表的大小为64KB,每项大小为8B,所以允许最多为8K个描述符。
中断门描述符结构
各标志位解释如下
低4字节的0-15位为32位偏移中的0-15位。
低4字节的16-31位任务状态描述符选择子,指示在任务状态描述符(TSS任务状态段)在GDT或LDT中的位置。每当一个门被访问的时候,选择子被加载在任务寄存器TR中,这样来产生一个任务切换。
高4字节的0-4位计数(有多少个字传送到中断服务程序的堆栈上)
高4字节的16-31位32位偏移中的16-31位。(32位的偏移指向中断服务程序或其他程序的入口)
其他位和段描述符对应位的含义相同。
C、局部描述符表寄存器(16位)LDTR
用于保存局部描述符表的选择子,因为它是一种段寄存器(系统段寄存器),所以它也有自己的描述符(局部)寄存器,当LDTR的选择子改变后,LDTR所指向的描述符将被自动加载进它的描述符寄存器,以供反复使用。
D、任务状态寄存器TR
用于保存任务状态段(TSS)的描述符选择子,它也是一种段寄存器(系统段寄存器),也有自己的描述符(任务状态段)寄存器,当TR的选择子改变后,它所指向的描述符会自动被加载进它的描述符寄存器,以供反复使用。
局部描述符表寄存器和任务状态寄存器的结构如下
注这也是段寄存器的通用结构,前面是选择子,后面是附加的描述符寄存器。选择子和段寄存器里面的选择子相同。
任务状态段描述符结构
6、调试寄存器(32位)DR0-DR7
DR0-DR34个保存线性断点地址的寄存器。
DR4-DR5备用寄存器。
DR6调试状态寄存器,通过该寄存器的内容,可以检测异常,并允许和禁止进行异常处理程序。
DR7调试控制寄存器,用于规定断点字段的长度,断点访问类型,允许断点和允许所选择的调试条件。
7、测试寄存器(32位)TR0-TR7
TR0-TR5由Intel保留
TR6-TR7用于控制TLB中的RAM和CAM相联存储器的测试
TR6测试控制寄存器。
TR7测试状态寄存器,用于保存测试结果。
奇闻怪事
- 黎姿老公马廷强前妻 黎姿老公马廷强前妻是谁
- 紫禁城闹鬼是真的吗 紫禁城闹鬼是怎么回事
- 80年黄河透明棺材事件 80年代黄河透明棺材始末
- 51区外星人录像是真的吗 51区外星人真的存在吗
- 姜潮麦迪娜恋爱过程 姜潮麦迪娜怎么认识的
- 根达亚文明大概离现在多久 根达亚文明距今多少
- 赤塔事件真的还是假的 赤塔事件到底怎么回事
- 百慕大三角在哪个国家 百慕大三角在哪个国家的
- 邓超出轨安以轩:邓超出轨安以轩是不是真的
- 中国十大闹鬼最凶的地方 中国十大闹鬼最凶的地
- 湘西鬼结婚事件:湘西鬼结婚事件真假
- 中国昆仑山10大灵异绝密档案 中国昆仑山10大灵异
- 李维嘉的父亲是谁 李维嘉父母是哪里人
- 朱秀华事件是不是真的 朱秀华事件的真相是什么
- 太湖冤魂:太湖冤魂事件真假
- 爪哇虎和东北虎谁厉害 爪哇虎和东北虎谁厉害一