首页 > 代码库 > 8086中的寄存器

8086中的寄存器


1   寄存器的分类

通用寄存器:

ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl);

sp,bp,si,di

指令寄存器:

ip

标志寄存器:

FR

段寄存器:

cs,ds,ss,es

2   ax,bx,cx,dx

这四个寄存器存放一般数据,你可以在里面存放任何数据,但是其用途会有不同。

AX (Accumulator):累加寄存器,也称之为累加器;

BX (Base):基地址寄存器,[bx]表示对bx中存放内容作为地址的内存单元进行访问

CX (Count):计数器寄存器,例如jcxz,loop指令都是根据CX寄存器的值进行判断然后决定是否进行跳转

DX (Data):数据寄存器,在进行32位的乘除法操作时,用它存放被除数的高16位或余数。它也用于存放I/O端口地址

3     ah,al,bh,bl,ch,cl,dh,dl

每个AX,BX,CX,DX都可以分为高8位,低8位,这两个8位可以单独的做位一个寄存器来使用。例如:

MOV AH,00h

MOV AL,FFh

4   sp,bp,di,si

SI (Source Index):源变址寄存器,在串处理指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中的存储单元地址

DI (Destination Index):目的变址寄存器,在串处理指令中,DI和附加段寄存器ES联用,以达到在附加段中寻址的目的

SP (Stack Pointer):堆栈指针寄存器,它指定栈顶的段偏移地址,和SS决定的栈段地址,一起决定了栈顶元素的地址

BP (Base Pointer):基指针寄存器,主要用于给出堆栈中数据区基址的偏移

5 CS,DS,SS,ES

CS (Code Segment):代码段寄存器,存放当前执行的程序的段地址

DS (DataSegment):数据段寄存器,存放当前执行的程序所用操作数的段地址

SS (StackSegment):堆栈段寄存器,存放当前执行的程序所用堆栈的段地址

ES (ExtraSegment):附加段寄存器,存放当前执行程序中一个辅助数据段的段地址

         8086CPU的CPU内部总线是16根,但是地址总线是20根,为了达到20根线的寻址能力,就用了两个16位的地址去合成一个20位的总线。例如一个20位的地址ABCDE,可以表示为ABCD,000E,那么ABCDE =ABCD*16 + E;

或者 ABC0 + 00DE,那么ABCDE = ABC0* 16 + DE;

或者 AB00 + 0CDE,那么ABCDE = AB00*16 + CDE;

或者A000 + BCDE,那么ABCDE = A000*16 + BCDE;

从上面可以看出对于8086CPU的一个段的最大长度就是64kb了。那么所谓的段寄存器的作用就可想而知,他们就是为了提供20位地址中的段地址。

6   IP,FLAG

IP (Instruction Pointer):指令指针寄存器,和CS一起决定了指定的地址CS:IP

FLAG:标志寄存器;


<1>进位标志 CF,记录运算时最高有效位产生的进位值。 
<2>符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。 
<3>零标志  ZF,运算结果为0时ZF位置1,否则置0。 
<4> 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。 
<5>辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。 
<6>奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。

<7>方向标志 DF,在串处理指令中控制处理信息的方向。当DF=1时,串处理从高地址向低地址方向处理。当DF=0时,串处理就从低地址向高地址方向处理。 
<8>陷阱标志 TF,用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。 
<9>中断标志 IF,用于控制可屏蔽硬件中断。当IF=1时,允许8086微处理器响应中断请求,否则关闭中断。