版权信息:可以任意转载, 转载时请务必以超链接形式标明文章原文出处,谢谢
原文出处: http://libiao.appspot.com/2009/08/intel_arch_registers.html
8个通用寄存器,即EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP
6个段寄存器,即CS,DS,SS,ES,FS,GS
1个EFLAGS寄存器
1个EIP(Instruction Pointer)寄存器
下面是这些寄存器的特殊用途
EAX: 累计运算(operand)以及保持结果数据
EBX: 指向数据段的数据
ECX: 字符串以及循环的计数器
EDX: I/O指针
ESI: 指向DS数据段的数据;字符串操作中指向原地址
EDI: 指向ES寄存器所指的数据段的数据地址;字符串操作中指向目标地址
ESP: 指向堆栈指针
EBP: 指向堆栈段中的数据
CS: 指向代码段,CPU要执行指令,通过CS段的段选择符(segment selector)找到代码段,然后再根据EIP的内容,来定位执行的指令。需要注意的是,CS段不是一个应用程序能够控制的,而是由内部的处理器操作来控制的,如procedure calls, interrupt handling, task switching等
DS,ES,FS,GS:是四个指向数据段的寄存器。四个数据段可以被加载,一个是当前模块的数据结构,一个是当前模块的上一层的数据结构,第三个是动态地创建数据结构,最后一个是其他的程序的数据结构
SS: 指向堆栈,其不像CS段,其可以实现多个堆栈并且来回自由切换
EFLAGS: EFLAGS寄存器包括一组状态标示(status flags),一个控制标示(control flag),以及一组系统标示(system flags)。在这些flags中,有一些是可以通过一些指令进行直接修改的,但是没有对整个寄存器进行检查或者修改的指令。但是可以调用指令LAHF, SAHF, PUSHF, PUSHFD,POPF, POPFD将EFLAGS的一组数据移动到堆栈或者EAX寄存器中,然后使用BT/BTS/BTR以及BTC等指令进行检查或者更改。当暂停一个进程的时候,处理器自动地将EFLAGS的状态保存在TSS(Task State Segment)中。若重新进行这个进程的时候,再从TSS中加载到EFLAGS中去。如果是中断或者异常处理的话,是将EFLAGS保存在堆栈中
状态标示(Status Flags): 表明算术运算指令的状态,对应于EFLAGS寄存器中的0,2,4,6,7以及11 比特。
控制标示(Control Flag):只有位于寄存器中第十位的Direction Flag,来设定字符串指令的行为,若DF标示以及被设了的话,字符串操作时从高地址往低地址进行操作;否则字符串地址是从低地址往高地址操作
系统标示(System Flags): 这些标示不是应用程序所能够更改的。
EIP: 指令指针。EIP指针保存的是下一个要执行的指令的在当前代码段中的位移(the offset in the current code segment for the next instruction to be executed)。其对于指令JMP, Jcc, CALL,RET,IRET等非常有用
永久链接: http://libiao.appspot.com/2009/08/intel_arch_registers.html