您好,欢迎访问三七文档
1第三章8086/8088指令系统基本概念:指令—规定CPU从事某一特定运算的代码。指令系统—是微处理器所能执行的各种指令的集合,该指令集定义了计算机硬件所能完成的基本操作。不同的微处理器有不同的指令系统。8086/8088CPU指令系统是80X80/Pentium系列微处理器的基本指令集。§3.18086/8088指令格式与寻址方式3.1.1指令格式简介一:指令通常由操作码与操作数两部分组成。操作码指出操作的性质,即指示计算机执行什么操作。如:加法、乘法?还是数据比较?等等。操作数给出操作的对象,即操作过程中所需要的数据。如:加法中的加数、被加数等。[举例]:ADDAH,30H;上述指令中:ADD为操作码,AH与30H均为操作数。二:指令有无操作数指令、单操作数指令及双操作数指令之分。如果是双操作数,要用逗号将两个操作数分开;逗号右边的操作数称为源操作数,左边的称为目的操作数;2[举例]:无操作数指令:STICLD单操作数指令:PUSHAXINCBX双操作数指令:ADDAH,30H;AH是目的操作数,30H为源操作数。MOVAX,BX三:操作码是非常明确与清晰的,且简单易懂;但操作数的获得是比较复杂的,形式多种多样。这种寻找操作数的问题就是寻址方式问题。3.1.28086/8088的寻址方式一:寻址方式与有效地址▲寻址方式--就是寻找指令中操作数的方式。8086/8088CPU指令中,操作数有三种可能存放的位置:1:操作数包含在指令中,即指令的操作数部分就是操作数本身。这种操作数叫立即数,对应的寻址方式称为立即寻址(立即数寻址)。2:操作数放在CPU的某个寄存器中;这时,操作数部分只是CPU内部寄存器的一个编码。对应的寻址方式称为寄存器寻址。33:操作数放在内存的数据区中;此时,指令的操作数部分实际包含的是操作数所在内存的地址。这种寻址方式称为存储器寻址。▲有效地址—存储器寻址方式中,指令的操作数部分给出的是实际操作数所在内存单元的段内偏移地址,称为有效地址。(EA—EfficientAddress)。有效地址EA由三部分组成,分别是:①基址寄存器(BX,BP)的内容;②变址寄存器(SI,DI)内容;③位移量。有效地址EA的计算公式如下:EA=[基址寄存器]+[变址寄存器]+位移量由上述公式可组合出多种存储器寻址方式。望牢记!注意:由于我们只学习8086/8088指令系统,因此,我们不讲述32位寻址的情况。二:各种寻址方式详细介绍1:立即寻址--ImmediateAddressing;特点:(1)立即寻址方式下,操作数作为立即数直接包含在指令中,它跟在操作码之后一起放在代码段;(2)立即数可以总是和操作码一起被取入CPU的指令队列,在指令执行时,不需再访问存储器;(3)立即数可以是8位或16位的(对8086/8088系统而言)。若是16位的,则低字节放在相邻两单元的低地址单元;(4)立即寻址只用于源操作数。4[举例]:MOVBL,12H该指令执行后,BL=12HMOVAX,1234H指令执行后,AX=1234H(AH=12H,AL=34H)2:寄存器寻址--RegisterAddresssing所谓寄存器寻址就是实际操作数存放在指令规定的8位或16位寄存器中;[举例]:MOVDX,AX;设指令执行前,AX=5678H,DX=1234H;则执行后,DX=5678H,AX内容不变。操作码12H低地址高地址存储器代码段BL操作码34H12H低地址高地址存储器代码段AXDHDLDX56H78HAX56H78HAHAL5注意:源操作数与目的操作数的长度必须一致,否则就会出错。优点:指令实行过程中,CPU不需访问总线周期,速度快。3:存储器寻址方式--MemoryAddressing在上一部分内容中,我们已经知道,存储器寻址的关键是获得实际操作数所在内存单元的有效地址EA,而EA是由几个部分组合得到的,因此,存储器寻址又分为好几种类型。但无论哪种存储器寻址,实际操作数都是在存储区中。(1)直接寻址—DirectAddressing直接寻址是存储器直接寻址的简称,是最简单的存储器寻址方式,在该方式中,指令的操作数部分直接给出实际操作数的有效地址EA,也即:EA只由其计算公式的最后一项(位移量)组成。段寄存器的认定:①一般情况下,实际操作数默认在数据段中(DS段中)。②可以在指令中中增加段前缀以规定段寄存器名,称为段超越。[举例]:MOVAX,[2000H];将数据段中2000H和2001H单元的内容送到AX中(2000H单元内容送AL,2001H单元内容送AH)。设数据段寄存器DS=3000H,则执行的过程如下图所示:6但若指令改为:MOVAX,ES:[2000H];则实际操作数就不在数据段,而在附加段中。(2)寄存器间接寻址—RegisterIndirectAddressing在该寻址方式中,实际操作数的有效地址EA由指令规定的寄存器提供。即:EA=[寄存器];注意:①上述寄存器只能是EA的计算公式中规定的四个寄存器(BX,BP,SI,DI)之一。②段寄存器的默认规则:●若以SI,DI,BX间接寻址,则默认实际操作数在数据段中。●若以BP间接寻址,则默认实际操作数在堆栈段中。③可以采用段超越来强行规定实际操作数所在操作码00H20H????30000H32000H32001H代码段数据段EA3000HDS30000H+2000H32000HAXAHAL7的段。[举例]:MOVBX,[SI];假定SI=1000H,DS=2000H,则改指令的执行过程如下图所示:若指令为:MOVBX,[BP]则实际操作数要到堆栈段(ss段)区取。(3)基址加位移量寻址在这种寻址方式中:EA=[基址寄存器]+位移量①具体寄存器与位移量在指令中给出,位移量与操作码一起放在代码段中。②段寄存器的默认规则:●若以BX作为基址寄存器,则默认实际操作数在数据段中。●若以BP作为基址寄存器,则默认实际操作数在堆栈段中。操作码99H88H20000H21000H21001H代码段数据段EA=1000H2000HDS20000H+1000H21000H88H99HBXBHBL1000HSI8③可以采用段超越来强行规定实际操作数所在的段。[举例]:MOVAX,[BX+24]假设DS=2000H,BX=6000H;指令的执行过程如下图:(4)变址加位移量寻址在这种寻址方式中:EA=[变址寄存器]+位移量①具体寄存器与位移量在指令中给出,位移量与操作码一起放在代码段中。②段寄存器的默认规则:默认实际操作数在数据段中(DS段)。③可以采用段超越来强行规定实际操作数所在的段。具体执行过程与基址加位移量的情况相同。操作码24H????20000H26024H26025H代码段数据段EA=6000H+24=6024H2000HDS20000H+6024H26024H????AXAHAL6000HBX9(5)基址加变址寻址在这种寻址方式中,EA=[基址寄存器]+[变址寄存器]①具体基址寄存器与变址寄存器在指令中给出;②段寄存器的使用:与以前的定义相同,但当所使用的基址寄存器与搭配的变址寄存器默认的段寄存器不同时,由基地址寄存器决定使用什么段寄存器。③可以采用段超越来强行规定实际操作数所在的段。[举例]:MOVAX,[BX+SI]或写成:MOVAX,[BX][SI]设BX=1000H,SI=3000H,DS=5000H;则指令的执行过程如下:注意:①在该指令中,由于BX与SI都使用数据段,因此实际操作数默认在数据段中。假若指令为:MOVAX,[BP+SI],由于BP操作码????50000H54000H54001H代码段数据段5000HDS50000H+4000H54000H????AXAHAL1000HBX+3000HSIEA=4000H10默认的是堆栈段,SI默认的是数据段,二者不一致,应以BP的为准,因此指令的实际源操作数在堆栈段中。②以下指令是错误的指令MOVAX,[BX+BP];MOVAX,[SI+DI];Why???(6)基址加变址加位移量寻址在这种寻址方式中,EA=[基址寄存器]+[变址寄存器]+位移量①具体基址寄存器、变址寄存器与位移量在指令中给出;②段寄存器的使用:与“基址加变址寻址”的情况完全相同。③可以采用段超越来强行规定实际操作数所在的段。[举例]:MOVAX,[BX+DI+56H]设BX=8000H,DI=2000H,DS=2000H;则指令的执行过程如下:操作码56H????20000H2A056H2A057H代码段数据段2000HDS20000H+A056H2A056H????AXAHAL8000HBX+2000HDI+EA=A056H56H
本文标题:第3章第1节
链接地址:https://www.777doc.com/doc-2193581 .html