转自:https://blog.youkuaiyun.com/lml435035844/article/details/135032209
用于学习
一、通用寄存器
RAX: accumulator register, 累加寄存器,通常用于存储函数的返回值,它主要用于输入/输出和大规模的指令运算,AX 寄存器可以说是使用频率最高的寄存器。也可以用于存储其他值,只是通过RAX存储函数返回值属于惯例。
RBX: base register,基址寄存器,一般用于访问内存的基址。BX也被称为数据寄存器,即表明其能够暂存一般数据,同样也可以将BX当做两个独立的 8位寄存器使用即 BH 和BL。BX除了具有暂存数据的功能之外,还用于寻址(即寻找物理地址),这就是为什么将其称为基址寄存器,它存放的数据一般就用来作为偏移地址使用,因为偏移地址是相对于基址地址上的偏移。
RCX: counter register,计数寄存器。一般用于循环计数。也可以称为数据寄存器,能够暂存一般性数据,可以分为CH 和CL。它也有专门功能:即计数器功能,当汇编指令使用循环LOOP时,可以通过CX来指定需要循环的次数。
RDX: 数据寄存器,能够暂存一般性数据。
RSI: source index,源变址寄存器,字符串运算时常应用于源指针。
RDI: destination index,目标变址寄存器,字符串运算时常用于目标指针。
RBP: Stack Pointer,栈指针寄存器。它包含了当前栈顶的内存地址。在函数调用时,参数、局部变量和返回地址等数据都存储在栈中。RSP的值在函数调用时会发生变化,以便为这些数据分配空间。通过修改 RSP 的值,可以在栈上分配空间或释放空间。
RSP: Base Pointer,基址指针寄存器。它通常用于指向当前栈帧的基址,即指向当前函数的栈帧的起始位置。在函数中,局部变量和其他数据可以通过 RBP 来访问。RBP 的值在函数调用时保持不变,因此可以作为一个固定的参考点来访问栈上的数据。RBP和RSP寄存器在 x86-64 架构中用于管理函数调用栈,分别指向当前函数的栈帧基址和栈顶。
RIP: Instruction Pointer,指令指针寄存器。它包含了将要执行的下一条指令的内存地址。当处理器执行指令时,会不断更新 RIP 的值,以便指向下一条将要执行的指令。RIP 的值的变化是由控制转移指令(如函数调用、跳转指令等)来控制的。
R8-R15: 一般是可以任意使用的,不指定特定用途,支持拆分。
二、浮点寄存器
三、其他寄存器
转:https://www.cnblogs.com/HachikoT/p/16953947.html
标志寄存器
标志寄存器eflags,记录了CPU执行指令过程中的一系列状态,这些标志大都由CPU自动设置和修改。
CF:进位标志位。无符号数运算时,运算结果的最高有效位向前有借位或进位。
PF:奇偶标志位。运算结果所有的bit中1的个数为偶数则为1,为奇数则为0。
AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少,最后四位向前有借位或者进位。
ZF:零标志位。执行结果是否为0。
SF:符号标志位。执行结果的符号位(最高位)。
TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行。
IF:中断允许标志位。是否响应外部中断。可以通过sti和cli指令来开启和关闭。
DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增;如果DF=1,si、di递减。可以通过std和cld指令来设置。
OF:溢出标志位。记录了有符号运算的结果是否发生了溢出。
IOPL:是从80286开始出现的,占2个bit表示I/O特权级,如果当前特权级小于或等于IOPL,则可以执行I/O操作,否则将出现一个保护性异常。IOPL只能由特权级为0的程序或任务来修改。
NT:也是从80286开始出现的,表示嵌套任务,用于控制中断返回指令IRET,当NT=0时,用堆栈中保存的值恢复EFLAGS、CS和EIP,从而实现返回;若NT=1,则通过任务切换实现中断返回。
VM:表示虚拟8086模式,如果VM被置位且80386已出于保护模式下,则CPU切换到虚拟8086模式,此时,对段的任何操作又回到了实模式,如同在8086下运行一样。
RF:表示恢复标志(也叫重启标志),与调试寄存器一起用于断点和单步操作,当RF=1 时,下一条指令的任何调试故障将被忽略,不产生异常中断。当RF=0时,调试故障被接受,并产生异常中断。用于调试失败后,强迫程序恢复执行,在成功执行每条指令后,RF自动复位。
AC:表示对齐检查。这个标志是80486以后的CPU才有的。当AC=1且CR0中的AM=1时,允许存储器进行地址对齐检查,若发现地址未对齐,将产生异常中断。所谓地址对齐,是指当访问一个字(2字节长)时,其地址必须是偶数(2的倍数),当访问双字(4字节长)时,其地址必须是4的倍数。但是只有运行在特权级3的程序才执行地址对齐检查,特权级0、1、2忽略该标志。
VIF:表示虚拟中断标志。以下的三个标志是Pentium以后的CPU才有的。当VIF=1时,可以使用虚拟中断,当VIF=0时不能使用虚拟中断。该标志要和下面的VIP和CR4中的VME配合使用。
VIP:表示虚拟中断挂起标志。当VIP=1时,VIF有效,VIP=0时VIF无效。
ID:表示鉴别标志。该标志用来只是Pentium CPU是否支持CPUID的指令。
cr0: 存储了CPU控制标记和工作状态。
cr1: 保留未使用。
cr2: 导致出现页错误的线性地址。
cr3: 存储了当前进程的页目录地址。
cr4: 存储了CPU工作相关以及当前任务的一些信息。
cr0:
PE:开启保护模式。PE=0表示CPU工作在实模式,PE=1表示CPU工作在保护模式。
MP:监控协处理器。MP=1表示协处理器在工作,MP=0表示协处理器未工作。
EM:协处理器仿真,当MP=0,EM=1时,表示正在使用软件仿真协处理器工作。
TS:任务转换,每当进行任务转换时,TS=1,任务转换完毕,TS=0。TS=1时不允许协处理器工作。
ET:处理器扩展类型,反映了所扩展的协处理器的类型,ET=0为80287,ET=1为80387。
NE:数值异常中断控制,NE=1时,如果运行协处理器指令发生故障,则用异常中断处理,NE=0时,则用外部中断处理。
WP:写保护,当WP=1时,对只读页面进行写操作会产生页故障。
AM:对齐标志,AM=1时,允许对齐检查,AM=0时不允许,关于对齐,在EFLAGS的AC标志时介绍过,在80486以后的CPU中,CPU进行对齐检查需要满足三个条件,AC=1、AM=1并且当前特权级为3。
NW(Not Write-through)和CD(Cache Disable),这两个标志都是用来控制CPU内部的CACHE的,当NW=0且CD=0时,CACHE使能,其它的组合说起来比较复杂。
PG:页式管理机制使能,PG=1时页式管理机制工作,否则不工作。
cr3
PCD:页CACHE禁止,当PCD=0时,页目录表进行高速缓存,PCD=1时,不进行高速缓存;该位控制PCD引脚控制外部CACHE工作还是不工作。
PWT:CACHE的写入分为透写(Write-Through)和回写(Write-Back),80486以上的CPU内部的CACHE都是透写的,但对外部CACHE而言,允许某些页是回写的,而另一些页是透写的,当PWT=1时,外部CACHE对页目录进行透写,否则进行回写;此位驱动PWT引脚以控制外部CACHE是透写还是回写。CR4是从Pentium CPU开始出现的。
cr4
VME:虚拟8086方式扩展,VME=1允许使用虚拟8086扩展模式,否则只能使用80386/80486的虚拟8086模式。
PVI:保护模式虚拟中断,PVI=1时,在保护模式下支持虚拟中断标志VIF(EFLAGS中),PVI=0则不支持虚拟中断标志。
TSD:时间戳禁止,TSD=1时,允许在特权级为0的程序中执行RDTSC指令(读时间戳计数指令),TSD=0时,允许任何特权级执行RDTSC指令。
DE:调试扩展。
PSE:页大小扩展,PSE=1时,页大小可以扩展到2M或4M,PSE=0时,页大小只能是4K.
PAE:物理地址扩展,PAE=1时,页物理地址可以扩展到36bits以上,PAE=0时只能用32bits的物理地址。
MCE:硬件检查使能,Pentium以后的CPU有一种硬件检测功能,MCE=1时允许使用该功能。
PGE:全局页使能,PGE=1时,允许使用全局页,PGE=0时禁止使用全局页。
PCE:性能监视计数器使能,当PCE=1时,允许在任何保护级下执行RDPMC指令,PCE=0时,只有特权级0的程序可以执行RDPMC指令。
VMXE:VMX使能位,VMXE=1时,允许VMX操作。
SMXE:SMX使能位,SMXE=1时,允许SMX操作。