240 likes | 373 Views
3.2.2 8086/8088 寄存器结构. 通用寄存器 8 个 (数据寄存器 4 个) (地址指针寄存器 2 个) (变址寄存器 2 个). 共 14 个寄存器. 段寄存器 4 个. 控制寄存器 2 个. 一.通用寄存器 通用寄存器 (8 个 ) :包括四个数据寄存器 AX(AH/AL), BX(BH/BL),CX(CH/CL),DX(DH/DL) ,两个地址指针寄存器 (SP,BP) 和两个变址寄存器 (SI,DI) 。. 1 .数据寄存器 AX 、 BX 、 CX 、 DX
E N D
3.2.2 8086/8088寄存器结构 通用寄存器8个 (数据寄存器4个) (地址指针寄存器2个) (变址寄存器2个) 共14个寄存器 段寄存器4个 控制寄存器2个
一.通用寄存器 通用寄存器(8个):包括四个数据寄存器AX(AH/AL), BX(BH/BL),CX(CH/CL),DX(DH/DL),两个地址指针寄存器(SP,BP)和两个变址寄存器(SI,DI)。 1.数据寄存器AX、BX、CX、DX 数据寄存器一般用于存放参与运算的操作数或运算结果。每个数据寄存器都是16位的,但又可将高、低8位分别作为两个独立的8位寄存器来用。高8位分别记作AH、BH、CH、DH,低8位分别记作AL,BL,CL,DL。注意,8086/8088 CPU的14个寄存器除了这4个16位寄存器能分别当作两个8位寄存器来用之外,其它寄存器都不能如此使用。
寄存器AX, BX,CX, DX的特定用法 AX(Accumulator)称为累加器。用该寄存器存放运算结果可使指令简化,提高指令的执行速度。此外,所有的I/O指令都使用该寄存器与外设端口交换信息。 BX(Base)称为基址寄存器。8086/8088CPU中有两个基址寄存器BX和BP。BX用来存放操作数在内存中数据段内的偏移地址,BP用来存放操作数在堆栈段内的偏移地址。 CX(Counter)称为计数器。在设计循环程序时使用该寄存器存放循环次数,可使程序指令简化,有利于提高程序的运行速度。 DX(Data)称为数据寄存器。在寄存器间接寻址的I/O指令中存放I/O端口地址;在做双字长乘除法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位数。
数据寄存器AX,BX,CX,DX特定用法举例 code segment assume cs:code start: mov ax,0 mov bx,1 mov cx,10 loop1: add ax,bx ;为什么此时的AX称为累加器 inc bx dec cx ;CX称为计数器,使用它比其他寄存器有什么好处 jnz loop1 mov ah,4ch int 21h code ends end start
2. 地址指针寄存器SP、BP SP(Stack Pointer)称为堆栈指针寄存器。在使用堆栈操作指令(PUSH或POP)对堆栈进行操作时,每执行一次进栈或出栈操作,系统会自动将SP的内容减2或加2,以使其始终指向栈顶。 BP(Base Pointer)称为基址寄存器。作为通用寄存器,它可以用来存放数据,但更经常更重要的用途是存放操作数在堆栈段内的偏移地址。
3.变址寄存器SI、DI SI(Source Index)称为源变址寄存器。DI(Destination Index)称为目的变址寄存器。这两个寄存器通常用在字符串操作时存放操作数的偏移地址,其中SI存放源串在数据段内的偏移地址,DI存放目的串在附加数据段内的偏移地址。 当然它们也可以放数据. mov si, 10 mov di, 20 add si, di mov si, offset str1 mov di, offset str2
二 .段寄存器 为了对1M个存储单元进行管理,8086/8088对存储器进行分段管理,即将程序代码或数据分别放在代码段、数据段、堆栈段或附加数据段中,每个段最多可达64K个存储单元。段地址分别放在对应的段寄存器中,代码或数据在段内的偏移地址由有关寄存器或立即数给出。
8086/8088的四个段寄存器 CS(Code Segment)——代码段寄存器。用来存储程序当前使用的代码段的段地址。CS的内容左移四位再加上指令指针寄存器IP的内容就是下一条要读取的指令在存储器中的物理地址。 DS(Data Segment)——数据段寄存器。用来存放程序当前使用的数据段的段地址。DS的内容左移四位再加上按指令中存储器寻址方式给出的偏移地址即得到对数据段指定单元进行读写的物理地址。 SS(Stack Segment)——堆栈段寄存器。用来存放程序当前所使用的堆栈段的段地址。堆栈是存储器中开辟的按先进后出原则组织的一个特殊存储区,主要用于调用子程序或执行中断服务程序时保护断点和现场。 ES(Extra Segment)——附加数据段寄存器。用来存放程序当前使用的附加数据段的段地址。附加数据段用来存放字符串操作时的目的字符串。
段寄存器 提供段内偏移地址的寄存器 CS IP DS BX、SI、DI或一个16位数 SS SP或BP ES DI(用于字符串操作指令) 表3.2 8086/8088段寄存器与提供段内移地址的 寄存器之间的 默 认 组 合
三. 控制寄存器 IP(Instruction Pointer)——指令指针寄存器。用来存放下一条要读取的指令在代码段内的偏移地址。用户程序不能直接访问IP。 FLAGS——标志寄存器。它是一个16位的寄存器,但只用了其中9位,这9位包括6个状态标志位,3个控制标志位,如图3.5所示。
1. 状态标志位(6位) 状态标志位用来反映算术和逻辑运算结果的一些特征。下面分别介绍这6个状态标志位的功能。 CF(Carry Flag)——进位标志。当进行加减运算时,若最高位发生进位或借位则CF为1,否则为0。通常用于判断无符号数运算结果是否超出了计算机所能表示的无符号数的范围。 PF(Parity Flag)——奇偶标志位。当指令执行结果的低8位中含有偶数个1时,PF为1,否则为0。
AF(Auxiliary Flag)——辅助进位标志位。当执行一条加法或减法运算指令时,若结果的低字节的低4位向高4位有进位或借位,则AF为1,否则为0。 ZF(Zero Flag)——零标志位。若当前的运算结果为0,则ZF为1,否则为0。 SF(Sign Flag)——符号标志位。当运算结果的最高位为1时,SF=1,否则为0。 OF(Overflow Flag)——溢出标志位。当运算结果超出了带符号数所能表示的数值范围,即溢出时,OF=1,否则为0。用来判断带符号数运算结果是否溢出。
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 O D I T S Z A P C 1 1 0 1 1 0 0101 0100 0011 1001 + 0100 0101 0110 1010 1001 1001 1010 0011 最高位 = 1 SF=1 低 8 位中偶数为 4 个 PF=1 运算结果不为 0 ZF=0 低 4 位向前有进位 AF=1 最高位向前没有进位 CF=0 次高位向前有进位 Cs=0,Cp=1,OF=Cs Cp=1
11101111 +) 11001000 10110111 0101101000001010 0100110010100011 1010011010101101 1 DF=1 DF=1 CF=1 CF=0 自动丢失 例3.1设变量x=11101111B,y=11001000B,X=0101101000001010B,Y=01001100 10100011B,请问分别执行x+y和X+Y操作后标志寄存器中各状态位的状态如何?
状态位 执行x+y后 执行X+Y后 CF 最高位D7向前有进位,CF=1 最高位D15向前没有进位,CF=0 PF 低8位中1的个数为偶数(6),PF=1 低8位中1的个数为奇数(5),PF=0 AF 低4位向前有进位,AF=1 低4位向前没有进位,AF=0 ZF 计算结果不为0,ZF=0 计算结果不为0,ZF=0 SF 最高位D7为1,SF=1 最高位D15为1,SF=1 OF CFDF=0,没有溢出,OF=0 CFDF=1,结果溢出,OF=1
2. 控制标志位(3位)——用来控制CPU的操作,由程序设置或清除。它们是: TF(Trap Flag)——跟踪(陷阱)标志位。是为测试程序的方便而设置。若将TF置1,CPU处于单步工作方式。 IF(Interrupt Flag)——中断允许标志位。是用来控制可屏蔽中断的控制标志位。若将IF置1,表示允许CPU接受外部从INTR引脚上发来的可屏蔽中断请求;若用CLI指令将IF清0,则禁止CPU接受可屏蔽中断请求信号。 DF(Direction Flag)——方向标志位。若将DF置1,串操作按减地址方式进行,也就是说,从高地址开始,每操作一次地址自动递减;否则按增地址方式进行。
注意 有关寄存器,尤其是在存储器寻址时用来存放操作数在段内偏移地址的地址寄存器和标志寄存器中各控制标志位的使用方法,将在后续章节中涉及到时还将进一步详细介绍,请读者务必熟练掌握。
3.2.3 总线周期的概念 为了便于对8086/8088CPU引脚功能的说明,本节简要介绍总线周期的概念。 8086/8088CPU在与存储器或I/O端口交换数据时需要启动一个总线周期。按照数据的传送方向来分,总线周期可分为“读”总线周期(CPU从存储器或I/O端口读取数据)和“写”总线周期(CPU将数据写入存储器或I/O端口)。