一直以来对寄存器的名称、作用比较模糊,今天抽时间整理了下。
(一) 通用寄存器
作用:传送和暂存数据,参与算数和逻辑运算。
(1)通用寄存器
16位的有8个:AX(Accumulator),BX(Base),CX(Count),DX(Data),BP(BasePointer),SP(Stack Pointer),SI(Source Index),DI(Destination Index)
对应的32位为:EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI
EAX,EBX,ECX,EDX为通用寄存器,其低16位为AX,BX,CX,DX,再进一步,每一个还能分成两个8位,如AX:AH-AL,BX:BH-BL等。他们除能作为普通数据寄存器使用外,他们还有特殊作用:
AX为累加器,进行乘除运算,字的输入输出,中间结果的缓存
BX基地址寄存器,除了作为通用寄存器,其主要功能是寻址,存放偏移地址,与段寄存器结合使用。
CX为计数器,控制循环次数以及CL存放移位的位数
DX为数据寄存器,在乘除运算时,可以作为默认操作数参与运算。
SI、DI为变址寄存器,存储单元在段内的偏移量,实现不同的寻址方式。SI存储器指针、串指令中的源操作数指针。DI存储器指针、串指令中的目的操作数指针。
BP、SP为指针寄存器,BP是基指针寄存器,当使用[BP]时,且没有显式给出段地址时,则默认使用SS段寄存器中的段地址。(BX、SI、DI默认使用DS段寄存器)SP是栈指针寄存器,存放了指向栈顶的指针。
(二)控制寄存器
(2)指令指针寄存器
IP(Instruction Pointer),32位为EIP,存放下次要执行的指令在代码段中的偏移量
(3)标志位寄存器
Flag,32位为EFlag, Flag寄存器中的数据是按位起作用的,Flag寄存器中存储的信息通常又被称为程序状态字(PSW)
位数 | 11 | 10 | 9 | 8 | 7 | 6 | 4 | 2 | 0 |
标志 | OF | DF | IF | TF | SF | ZF | AF | PF | CF |
全称 | Overflow Flag | Direction Flag | Interrupt
-Enable Flag |
Trap Flag | Sign Flag | Zero Flag | Auxiliary Carry Flag | Parity Flag | Carry Flag |
意义 | 溢出标志 | 方向标志 | 中断允许标志 | 追踪标志 | 符号标志(结果是否为负数) | 零标志位(结果是否为0) | 辅助进位标志 | 奇偶标志(结果中1的个数) | 进位标志 |
(参考内容:http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html)
(三)段寄存器
根据内存分段的管理模式而设立段寄存器。16位CPU的段寄存器分别是:
CS:(Code Segment) 代码段寄存器
SS:(Stack Segment)堆栈段寄存器
DS:(DataSegment)数据段寄存器
ES:(Extra Segment)附加段寄存器,存放当前执行程序中一个辅助数据段的段地址
FS:附加段寄存器(标志段寄存器)
GS:附加段寄存器(全局段寄存器)
关于FS寄存器,当系统运行在ring3时,FS 值为指向的段是 GDT 中的 0x38 段,基地址为 当前线程 的线程环境块( TEB ),所以该段也被称为“TEB 段”。当系统运行在ring0时,FS 指向的段是 GDT 中的 0x30 段,该地址指向系统的处理器控制区域( KPCR )。这个区域中保存这处理器相关的一些重要数据值,如 GDT 、 IDT 表的值等等。
(参考博文http://blog.csdn.net/misterliwei/article/details/4391580
http://bbs.pediy.com/showthread.PHP?t=159935)
对于访问某个段的程序,必须将段选择符加载到一个段寄存器中,通过段选择符去定位段描述符表中的一个段描述符来指定一个段,段描述符中包含访问一个段的所有信息,包括段基址、段长度、段属性等。
(段选择符、段描述符参考:http://blog.csdn.net/lbo4031/article/details/6990376
http://blog.sina.com.cn/s/blog_9e16dc4d010150t1.html)
8086CPU中,只有BX,SI,DI,BP可以以[..]的方式使用
操作系统的外壳(Shell)程序,将可执行文件加载到内存中以后,就会设置CPU中个的两个寄存器,即CS:IP指向可执行文件的起始地址。