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微处理器响应中断请求,否则关闭中断。