第3章 寻址方式及指令系统_第1页
第3章 寻址方式及指令系统_第2页
第3章 寻址方式及指令系统_第3页
第3章 寻址方式及指令系统_第4页
第3章 寻址方式及指令系统_第5页
已阅读5页,还剩266页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章寻址方式与指令系统3.1指令系统概述3.28086寻址方式3.38086指令系统3.1指令系统概述3.1.1指令的基本概念

程序:是由完成一个完整任务的一系列有序指令组成的有序集合。

指令:是指示计算机进行某种操作的命令,通常一条指令对应着一种基本操作。

指令系统:计算机所能执行的全部指令的集合,称为处理器的指令系统。3.1.2指令格式

计算机中的指令通常由操作码(Operation)和操作数(Operand)组成,

操作码部分规定计算机所执行的操作;

操作数部分也称为地址码,用来描述该指令的操作对象。

操作码操作数…操作数

3.1.38086汇编语言格式

标号:操作码操作数;注释1.双操作数指令大多数指令需要两个操作数,分别称两个操作数为源操作数和目标操作数,指令运算结果存入目标操作数的地址中去。这样,目标操作数的原有数据将被取代。格式:操作码DST,SRC其中,DST为目标操作数,SRC为源操作数。2.单操作数指令指令中只给出一个操作数。若指令只需要一个操作数,则此操作数通常作为目标操作数,在运算前提供源操作数,运算后存放运算结果。若指令需2个操作数,则另一操作数由指令隐含指定。格式:操作码DST3.无操作数指令

格式:操作码例如: HLT ;停机指令,是无操作数指令 INCAX ;增1指令,是单操作数指令 ADDAX,BX ;加法指令,是双操作数指令3.1.4指令的执行

要执行的程序段的指令,均保存在存储器中,当计算机需要执行一条指令时,首先产生这条指令的相应地址,并根据地址号打开相应的存储单元,取出指令代码,CPU根据指令代码的要求以及指令中的操作数,去执行相应的操作。3.28086寻址方式计算机中操作数的存放大致有以下几种情况:①操作数包含在指令中。这样的数称为立即数,相应的寻址方式称为立即数寻址②操作数在CPU的某一个寄存器中。相应的寻址方式称为寄存器寻址。③操作数在内存储器中,指令中给出的是操作数在存储器中的地址信息。在这种情况下,只有给定操作在内存中存放的地址,才能找到并取出它。④操作数在某个寄存器端口。对于端口地址的不同给出方式,就形成不同的端口寻址方式。8086的基本寻址方式有7种:立即数寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址加变址寻址相对基址加变址寻址3.2.1数据寻址方式1.立即数寻址操作数直接存放在指令中,紧跟在指令操作码之后。这样的数称为立即数,相应的寻址方式称为立即寻址方式。这种寻址方式在汇编语言格式中表示为:数字表达式这个数字表达式的值可以是一个8位无符号整数,也可以是一个16位无符号整数,但不可以为小数。例如:MOVAX,251 ;将十进制数251送入寄存器AX,“251”是立即数MOVAL,‘5’ ;将5的ASCII码送入寄存器AL,其中‘5’是立即数MOVAL,0E8H ;将8位立即数E8H送入寄存器ALMOVAX,2346H;将16位立即数2346H送入寄存器AX特点:立即寻址方式中操作数可以从指令中直接取得,不需要运行总线周期,所以其显著特征是速度快。说明:立即数可为8位,可为16位只能为整数只能做源操作数2.寄存器寻址

操作数在CPU的内部寄存器中,指令指定寄存器名(机器指令中为寄存器的二进制编号)。这种寻址方式在汇编语言格式中表示为: 寄存器名

①对于16位操作数,可以使用的寄存器有:AX、BX、CX、DX、SI、DI、SP、BP等;②对于8位操作数,可以使用的寄存器有:AH、AL、BH、BL、CH、CL、DH、DL。例如:MOVAX,CX;将CX内容送AXMOVDL,BL;将BL内容送DL其中“AX”,“CX”,“DL”,“BL”就是寄存器寻址方式。机器执行直接寻址方式的指令时,根据地址码字段访问到寄存器,继而访问到操作数。优点:寄存器数量一般在几个到几十个,比存储器单元少很多,因此它的地址码短,从而缩短了指令长度,节省了程序存储空间。另一方面,从寄存器里取数比从存储器里取数的速度快得多,从而提高了指令执行速度。

说明:源操作数和目的操作数都可以使用寄存器寻址。3.存储器寻址方式⑴直接寻址操作数在存储器中,逻辑段中存储单元的有效偏移地址EA由指令直接给出。这种寻址方式在汇编语言格式中可以表示为以下几种:①地址表达式②[地址表达式]③[数字表达式]假设TABLE是在数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则以下三条指令是等效的:MOVAL,TABLEMOVAL,[TABLE]MOVAL,[1000H]其中“TABLE”、“[TABLE]”、“[1000H]”都是直接寻址方式。以下三条指令也是等效的:MOVAL,TABLE+2MOVAL,[TABLE+2]MOVAL,[1000H+2]例如:MOVAX,[3100H]特点:需要一个总线周期说明:默认的段寄存器为DS,如果不是DS,则需要用前缀指出。MOVBX,ES:[3100H]将ES段的3100H和3101H两单元的内容取到BX中。假设(DS)=3000H,(31000H)=12H,(31001H)=34H,则执行指令 MOVAL,[1000H]操作的示意图如图所示。数据段代码段31000H存储器AX30000HOP00H10H12H34H图3.5直接寻址操作示意图指令执行完以后,(AX)=3412H。⑵寄存器间接寻址

若操作数在存储器中,存储单元有效地址被放在基址寄存器BX、BP或变址寄存器SI、DI中,则称为寄存器间接寻址。寄存器间接寻址方式在汇编格式中表示为:[基址寄存器名或变址寄存器名]例如:MOVAX,[BX] ;物理地址=DS×16+BXMOVAL,[BP] ;物理地址=SS×16+BPMOVAX,CS:[DI];物理地址=CS×16+DI其中“[BP]”、“[BX]”、“[DI]”都是寄存器间接寻址方式。

特点:需要一个以上总线周期说明:①寄存器可以为BX,BP,SI,DI②如果没有指明具体的段寄存器,默认的段寄存器为DS;当寄存器为BP时,段寄存器为SS;③允许在指令中指定8位或16位位移量。有效地址EA=[BX][BP][SI][DI]如果(DS)=3000H,(BX)=1010H,(31010H)=12H,(31011H)=24H。则操作数的20位物理地址=30000H+1010H=31010H,执行指令MOVAX,[BX]操作的示意图如图3.7所示。存储器AX30000H12H24H数据段图3.7寄存器间接寻址操作图指令执行完以后,(AX)=2412H。这种寻址方式也允许指定段跨越前缀来取得其它段中的数据。这种寻址方式一般用于访问表格或字符串,执行完一条指令后,通过修改SI或DI或BX或BP的内容就可访问到表格的下一数据项的存储单元。1.以SI,DI,BX为寄存器进行间接寻址。默认段寄存器为DS操作数物理地址为:PA=16d×(DS)+(BX)PA=16d×(DS)+(SI)PA=16d×(DS)+(DI)若使用其他段寄存器,需用前缀指明。2.以BP为寄存器进行间接寻址默认段寄存器为SS操作数物理地址:PA=16d×(SS)+(BP)若使用其他段寄存器,需用前缀指明。⑶寄存器相对寻址若操作数在存储器中,存储单元的有效地址由一个基址或变址寄存器与指令中指定的8位或16位位移量组成,则称为寄存器相对寻址。这种寻址方式在汇编格式中表示为以下两种形式之一:①位移量[基址寄存器名或变址寄存器名]②[位移量+基址寄存器名或变址寄存器名]有效地址EA=[BX][BP]8位的位移量[SI]16位的位移量[DI]+例如:MOVAX,20H[SI] 物理地址=DS×16+SI+20H(8位位移量)MOVCL,[BP+2000H]物理地址=SS×16+BP+2000H(16位位移量)MOVAX,STR[BX]当机器执行这种寻址方式的指令时,依据地址码字段的编号访问得寄存器的值,将其与位移量相加(或相减),和(差)作为操作数的偏移地址。如果指令中指定的寄存器是BX、SI、DI,则操作数默认在数据段中,取DS寄存器的值作为操作数的段地址值;如果指令中指定的寄存器是BP,则操作数默认在堆栈数据段中,取SS寄存器的值作为操作数的段地址值,从而算得操作数的20位物理地址,继而访问到操作数。例如,TABLE是数据段中定义的一个变量名,假设它在数据段中的偏移地址为0100H,有指令:MOVAX,TABLE[SI]若(DS)=2000H,(SI)=00A0H,(201A0H)=12H,(201A1H)=34H,则源操作数20位物理地址=20000H+0100H+00A0H=2000H+01A0H=201A0H操作的示意图如图3.9所示:位移量TABLE数据段代码段201A0H存储器AX20000HOP00H01H12H34HOP图3.9寄存器相对寻址操作图用途:这种寻址方式一般用于表格处理。表格首地址为COUNT,修改基址或变址寄存器来取得表格中其他元素的值例如:某数据表的首地址为COUNT,欲读取表中第N个数据,存放到(AL)中,第N个数据的有效地址为:EA=COUNT+(N-1)MOVSI,N-1MOVAL,[SI+COUNT]⑷基址加变址寻址操作数在存储器中,存储单元的有效地址是两个指定寄存器的值之和。这种寻址方式在汇编格式中表示为以下两种形式之一:①[基址寄存器名][变址寄存器名]②[基址寄存器名+变址寄存器名]

例如:MOVAX,[BX][SI] 物理地址=DS×16+BX+SIMOVAX,[BX+SI] 物理地址=DS×16+BX+SIMOVCL,CS:[BX+DI] 物理地址=CS×16+BX+DI其中“[BX][SI]”、“[BX+DI]“都是基址变址寻址方式。当机器执行这种寻址方式的指令时,依据地址码字段的值仿问得基址寄存器和变址寄存器的值,将其相加,和作为操作数的偏移地址。

例如:MOVAX,[BX][SI]若(DS)=2000H,(BX)=0500H,(SI)=0010H,则偏移地址=0500H+0010H=0510H,20位物理地址=20000H+0510H=20510H。假设(20510H)=12H,(20511H)=34H,操作的示意图如图3.11所示:20510H存储器AX20000H12H34H数据段代码段图3.11基址变址寻址操作示意图用途:这种寻址方式也常用于数组或表格处理。表格首地址位于基址寄存器中,用变址寄存器来访问数组中的元素。两个寄存器都能修改,所以比直接变址方式更灵活。⑸相对基址加变址寻址操作数在存储器中,存储单元的有效地址由一个基址寄存器和变址寄存器的内容及指令中指定的8位或16位位移量的和构成。即EA=[BX]/[BP]+[SI]/[DI]+[8/16位位移量]地址表达式可以书写为以下两种形式之一:①位移量[基址寄存器][变址寄存器]②[基址寄存器+变址寄存器+位移量]例如:MOVAX,[BX+DI+20H] 指令中给出8位位移量20H。MOVAX,ES:1000H[BP][SI] 访问ES段字存储单元。以下三条语句是等价的:MOVAL,TABLE[BX][SI]MOVAL,TABLE[BX+SI]MOVAL,[TABLE+BX+SI]用途:这种寻址方式为堆栈处理提供方便:(BP)为栈顶值(一般都使用BP指向栈顶);从栈顶到数组的首地址可以用位移量(MASK)表示;变址寄存器(SI)或(DI)指向数组中某个元素。8086寻址方式的操作数有三种类型:立即操作数寄存器操作数存储器操作数(1)立即操作数立即操作数只能作为源操作数,不能作为目标操作数MOVAX,3100HMOV3100,AX指令中的立即操作数不应超过其8位或16位的取值范围MOVAL,100HMOVAX,20000H(2)寄存器操作数寄存器操作数可能存放在:8086的通用寄存器中,指针寄存器,变址寄存器中。隐含寄存器操作数:某些指令规定只能使用指定寄存器操作数,从指令形式看,似乎没有指出操作数,实际上是隐含了某些特定寄存器操作数。MOVCL;AL*CLAX(3)存储器操作数存储器操作数类型可以为:字节、字、双字。存储器操作数可以作为源操作数,也可以作为目的操作数。但多数指令不允许源操作数、目标操作数同时为存储器操作数。MOV[BX],[3100H]3.2.2程序地址寻址方式1.段内直接寻址这种寻址方式的汇编格式有三种:①指令名SHORT转移目标地址标号②指令名转移目标地址标号③指令名NEARPTR转移目标地址标号指令中直接指明了要转移的目标地址,因此叫直接寻址;又因为这种指令只改变IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。汇编这种指令寻址方式时,汇编程序计算转移目标地址标号与本条指令的下一条指令的地址的差值,将其补码称为位移量,写入指令的地址码字段。当执行这种寻址方式的转移指令时,机器取出位移量,与当前(IP)相加,和送入IP寄存器中,CS寄存器内容保持不变,从而实现转移,如图3.12所示:转移目标地址的偏移地址址指令位移量IP寄存器IP寄存器图3.12段内直接寻址示意图由此可看出,这种寻址方式实现的是相对转移。位移量不同,转移范围不同。当位移量为8位时,只允许转移到与本条指令的下一条指令相距-128~+127范围内的存储单元去。当位移量为16位时,允许转移到当前代码段内任何地方。要注意的是:条件转移指令的位移量只能是8位,而无条件转移的指令可以是8位,也可以是16位。8位叫短跳转,16位叫近跳转。3.段内间接寻址这种寻址方式的汇编格式为:①指令名16位寄存器名指令名WORDPTR存储器寻址方式转移的目标地址放在寄存器或存储器中,因此叫寄存器间接寻址。这种指令只改变IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到一个字,然后把它送入IP寄存器中,CS寄存器的内容不变,从而实现转移,如图3.14所示。图3.14段内间接寻址示意图2.段间直接寻址这种寻址方式的汇编格式有以下两种形式:①指令名FARPTR转移地址标号②指令名段地址:段偏移地址指令中直接指明了要转移的目标地址,此转移地址或用地址标号或用数值地址表示,因此叫直接寻址;又因为这种指令不仅改变IP寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。当执行这种寻址方式的转移指令时,机器取指令操作码之后的第一个字,把它送入IP寄存器中,取操作码之后的第二个字把它送入CS寄存器中,从而实现转移,如图3.13所示。图3.13段间直接寻址示意图转移目标地址的段地址址转移目标地址的偏移地址址指令CS寄存器IP寄存器地址段地址4.段间间接寻址这种寻址方式的汇编格式为:指令名DWORDPTR存储器寻址方式转移的目标地址放在存储器中。称作间接寻址。这种指令不仅改变IP寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到存储器中相继的二个字,把第一个字送入IP寄存器中,把第二个字送入CS寄存器,从而实现转移,如图3.15所示。转移目标地址的段地址CS寄存器根据寻址方式计算出20位物理地址指令存储器寻址方式转移目标地址的偏移地址址IP寄存器存储器图3.15段间间接寻址示意图3.38086指令系统

Intel8086CPU提供133条基本指令,按功能又可分为以下六类:①数据传送指令②算术运算指令③逻辑运算和移位指令④串操作指令⑤程序控制指令⑥处理器控制指令下面将分类介绍这些指令。3.3.1数据传送指令数据传送指令功能是将数据、地址或立即数传送到寄存器或存储单元中。传送指令包括:通用数据传送指令堆栈操作指令地址传送指令标志寄存器传送指令数据交换指令换码指令输入输出指令重点掌握MOV通用数据传送指令PUSH/POP堆栈操作指令XCHG交换指令LEA地址传送指令IN/OUT输入输出指令1.通用数据传送指令通用数据传送指令MOV是形式最简单、用的最多的指令,它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或者内存单元。格式: MOVDST,SRC其中,DST可以是寄存器和存储器,SRC可以是寄存器、存储器或立即数。说明:①指令中两个操作数不能同为存储器操作数。②CS不能做为目标操作数。③段寄存器之间不能互相传送。④立即数不能直接送入段寄存器。⑤MOV指令不影响标志位。下面举例说明MOV指令的应用:MOVAL,12HMOVAX,3456HMOVCL,4 ;CL←4,字节传送MOVDX,0FFH ;DX←00FFH,字传送MOVSI,200H ;SI←0200H,字传送

寄存器具有明确的字节和字类型⑴立即数传送给通用寄存器⑵通用寄存器之间相互传送

MOVAX,BX ;将BX中的数据传送到AX中。

MOVCL,BH ;将BH中的数据传送到CL中,BH、CL就为8位。

MOVSP,SI;将SI中的数据传送到SI中(3)通用寄存器和段寄存器之间相互传送MOVDS,AX ;DS←AX,字传送MOVAX,DS ;AX←DS(4)通用寄存器和存储器之间相互传送

MOVAX,[BX] 将以BX为有效地址的2个连续内存单元中的数据传送到AX中MOV[SI],DH 将DH中的数据传送到由SI指定的内存单元中指令中的[BX]、[SI]和[DI]分别表示以BX、SI和DI中的值为有效地址的内存单元。MOVAX,[2000H](5)段寄存器存储器之间的相互传送MOVES,[SI]MOV[DI],SS虽然MOV指令不能直接实现两个存储单元之间的数据传送,但可以借助CPU内部的寄存器,通过两条指令来完成两个存储单元之间的数据传送。(6)立即数传送给存储器MOVBYTEPTR[BX],34HMOVWORDPTR[BP],2345H必须确定存储单元的类型,字或者字节BYTEPTRWORDPTR举例1.MOVMEM2,MEM1修改MOVAX,MEM1MOVMEM2,AX2.MOVDS,2000H修改MOVAX,2000HMOVDS,AX3.MOVES,DS修改MOVAX,DSMOVES,AXMOV指令传送功能图解MOV指令也并非任意传送!非法指令的主要现象:两个操作数的类型不一致无法确定是字节量还是字量操作两个操作数都是存储器段寄存器的操作有一些限制不能对指令指针IP进行操作非法指令--两个操作数类型不一致在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令

MOVAL,050AH ;非法指令,修正: ;MOVAX,050AH MOVSI,DL ;非法指令,修正: ;MOVDH,0

;MOVSI,DX非法指令--无法确定是字节量还是字量操作当无法通过任一个操作数确定操作类型时,需要利用汇编语言的操作符显式指明

MOV[BX+SI],255 ;非法指令,修正: ;MOVBYTEPTR[BX+SI],255

;BYTEPTR说明是字节操作 ;MOVWORDPTR[BX+SI],255

;WORDPTR说明是字操作非法指令--两个操作数都是存储器8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)

MOVBUF2,BUF1 ;非法指令,修正:

;假设BUF2和BUF1是两个字变量 ;MOVAX,BUF1

;MOVBUF2,AX

;假设BUF2和BUF1是两个字节变量 ;MOVAL,BUF1

;MOVBUF2,AL非法指令--段寄存器的操作有一些限制8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活

MOVDS,ES ;非法指令,修正: ;MOVAX,ES

;MOVDS,AX MOVDS,100H ;非法指令,修正: ;MOVAX,100H

;MOVDS,AX

MOVCS,[SI] ;非法指令 ;指令存在,但不能执行2.堆栈操作指令

堆堆栈(Stack)是主存中一个特殊的区域。它采用先进后出FILO(FirstInLastOut)或后进先出LIFO(LastInFirstOut)的原则进行存取操作,而不是随机存取操作方式。堆栈指针——它指示栈顶位置,在8086中,栈顶由SS和SP共同指示,即SS:SP。用户操作(PUSH/POP指令)

⑴堆栈

向下生长——向低地址方向生长;双字节操作——高对高,低对低;“栈顶总满”——栈顶已经堆有数据。8088/8086的堆栈操作特点⑵堆栈操作指令

堆栈只有两种基本操作:进栈和出栈,用户操作堆栈对应两条指令PUSH和POP。进栈指令PUSH:进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部出栈指令POP:

出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2说明:①PUSH、POP指令不能使用立即寻址方式,POP指令不能使用CS寄存器。②堆栈中数据的压入弹出必须以字为单位进行,每次PUSH操作栈顶向低地址移动两个字节,而POP操作栈顶向高地址移动两个字节。③字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节④堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据⑤两条堆栈指令不影响标志位。⑥堆栈段是程序中不可或缺的一个内存区,常用来临时存放数据传递参数保存和恢复寄存器堆栈的实例和图例MOVAX,7812HPUSHAXPOPAX例:现场的保护和恢复pushax ;进入子程序后pushbxpushds...popds ;返回主程序前popbxpopax3.数据交换指令格式: XCHGDST,SRC说明:①DST、SRC不允许是段寄存器、立即数和IP寄存器。②DST和SRC中,必须有一个是寄存器寻址,即DST和SRC不能同为内存单元。两个存储单元之间不能直换互换数据。③DST和SRC的取值范围必须相同,同为8位或者16位。④此指令不影响标志位。举例XCHGBL,DLXCHGAX,SIXCHG[DI],ALXCHG[BX],[DI]XCHGDS,AX例1: XCHGBX,[BP+SI]假设该指令执行前:(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H,即源操作数物理地址=1F00H:0100+0020=1F00H:0120H=1F120H,交换前源操作数为0000H,目标操作数为1234H;则指令执行后,(BX)=0000H,(1F120H)=1234H例2:MOVAX,1199H ;AX=1199HXCHGAH,AL ;AX=9911H;等同于XCHGAL,AH例3:MOVwvar,5566H ;wvar是一个字变量XCHGAX,wvar;AX=5566H,wvar=9911H;等同于XCHGwvar,AX例4:XCHGAL,BYTEPTRwvar+1;AX=5599H,wvar=6611H;“BYTEPTRwvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配4.地址传送指令8086中,专用于地址传送的指令有三条:LEA(LoadEffectiveAddress)取有效地址指令;LDS(LoadPointerintoregisterandDS)取地址指针装入DS和另一个寄存器的指令LES(LoadpointerintoregisterandES)取地址指针装入ES和另一个寄存器的指令⑴LEA有效地址传送指令有效地址传送指令LEA把源操作数的有效地址(偏移量)送入指定的寄存器中。格式: LEAREG,SRC其中,目标操作数REG是一个16位的通用寄存器。说明:①REG不能是段寄存器。②这条指令不影响标志位。例如:LEAAX,[2782H]LEABX,[BP+SI]LEASP,[0482H]例: MOVBX,400H MOVSI,3CH LEABX,[BX+SI+0F62H] ;BX←400H+3CH+0F62H=139EH⑵将地址装入DS和另一个寄存器LDS格式: LDSREG,SRC;指针送寄存器和DS指令LDS指令将源操作数SCR指定的4个连续字节(内存单元),前两字节作为偏移量,传送到REG中;后两字节作为段地址,传送到DS中。例如, LDSBX,[1230H]将地址为1230H和1231H的内存单元中的16位数据作为偏移量,送入BX寄存器;将地址为1232H和1233H的内存单元中的16位数据作为段值,送入DS寄存器。说明:①LDS指令中的REG不允许是段寄存器。②LDS指令不影响标志位。(3)将地址装入ES和另一个寄存器LES格式: LESREG,SRC;指针送寄存器和ES指令LEDS指令将源操作数SCR指定的4个连续字节(内存单元),前两字节作为偏移量,传送到REG中;后两字节作为段地址,传送到ES中。例如, LESDI,[1230H]将地址为1230H和1231H的内存单元中的16位数据作为偏移量,送入DI寄存器;将地址为1232H和1233H的内存单元中的16位数据作为段值,送入ES寄存器。说明:①LES指令中的REG不允许是段寄存器。②LES指令不影响标志位。5.标志寄存器传送指令⑴读取标志指令LAHF读取标志指令LAHF被执行时,将标志寄存器FLAGS中的低8位,传送至AH中。如图3.18所示。

图3.18LAHF指令操作格式

⑵设置标志寄存器指令SAHF设置标志寄存器指令SAHF与LAHF正好相反,把AH传送至标志寄存器FLAGS的低8位。SAHF指令可能会改变SF、ZF、AF、PF和CF标志位,但不影响位于高字节的OF、DF、IF和TF标志。(3)对标志寄存器压栈指令PUSHF将标志寄存器的值推入堆栈顶部,同时,栈指针SP的值减2,此指令在执行时标志寄存器的值不变。(4)对标志寄存器弹栈指令POPF在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。

PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序状态标志和恢复主程序状态标志的作用。6.换码指令使累加器中的一个值转换为内存表格中对应的某一个值。即可以用表格中的一个值来置换AL中的内容。使用该指令前,内存表的首地址赋给BX,AL中存放表格某一项与表格首地址的位移量,执行BX+AL,得到该表格中的一个地址,再将该地址所对应单元中的值送到AL中。举例:十进制数字0~9的7段显示码的码表7.输入输出指令IN,OUT8086通过输入输出指令与外设进行数据传送输入指令用于CPU从外设端口接收数据输出指令用于CPU向外设端口发送数据AL8位I/O端口AX16位I/O端口端口:CPU与外设之间通过接口进行数据交换,一个端口通常对应接口中的一个或一组寄存器,每个8位端口有一个地址,叫做端口号。两个相邻的8位端口可以组成一个16位端口。端口数:外部设备最多有65536个I/O端口。(由A0~A15译码形成)端口号:端口号(即外设端口地址)为0000H~FFFFHPC机仅使用A0~A9译码形成I/O端口地址,即1024H个端口地址,因此端口号范围为0000H~03FFH其中,A9=1,表示扩充槽上的端口地址端口号中前256个端口(0~FFH),可以使用直接的输入/输出指令,指令中提供端口号INAL,PORT;(AL)←(PORT)功能:把来自端口PORT的一个字节送入AL寄存器 INAX,PORT;(AX)←(PORT+1,PORT)功能:把来自PORT和PORT+1两个端口的数据构成一个字送入AX寄存器中OUTPORT,AL;(PORT)←(AL)功能:把AL寄存器中的一个字节送入端口PORTOUTPORT,AX;(PORT+1,PORT)←(AX)功能:把AX寄存器中的一个字送入PORT和PORT+1两个端口(1)直接输入输出指令IN,OUT例如:INAL,50HINAX,70HOUT44H,ALOUT80H,AX以上IN和OUT指令是直接端口寻址方式,端口地址PORT是一个8位的立即数,其范围是0~255。所有的端口号(0~FFFFH),都可以使用间接的输入/输出指令,执行这些指令之前,已经将端口号传入DX中INAL,DX;(AL)←(DX)功能:把来自DX的一个字节送入AL寄存器 INAX,DX;(AX)←(DX)功能:把来自DX的一个字送入AX寄存器中OUTDX,AL;(DX)←(AL)功能:把AL寄存器中的一个字节送入DX中OUTDX,AX;(DX)←(AX)功能:把AX寄存器中的一个字送入DX中注意:端口号≥256时,只能使用间接输入/输出指令(2)间接输入输出指令IN,OUT注意:操作数可以8位也可以16位,当为8位时必须用到AL,16位时必须用到AX若端口地址小于255,可直接在指令中给出(n),大于255时,必须将端口地址放入DX所有输入或输出必须借助累加器AL或AX传输,其他寄存器不行传送16位数据的端口地址必须是偶数I/O口的累加器传送指令举例(1)INAL,06H OUT06H,AL

(2)

INAX,31H OUT31H,AX(3)INAL,100H OUT100H,AL

(4)INAX,100H OUT100H,AX

举例:1.将(28H)(28H)端口的字数据传送到DATA_WORD2.从端口3FCH送一个字到AX寄存器3.将(AL)中数据传送到(05H)端口3.3.2算术运算指令

问题:无符号数和有符号数能否使用同一套加、减、乘、除指令无符号数和有符号数使用同一套加、减,要求参与运算的两个数必须同为无符号数或同为有符号数;另外,要用不同的方法判断运算结果是否溢出,采用什么方法判断溢出。结论1.无符号和有符号加法、减法运算可以使用同一套指令系统,无符号和有符号乘法、除法不可以使用同一套指令系统;2.参加运算的必须同是无符号数或同是有符号数;3.溢出的判断:无符号数运算产生溢出时,CF=1;有符号数运算产生溢出时,OF=14.无符号数运算产生溢出,会设置进位位,对于多字节运算,要利用进位向高位字节传送数值;有符号数运算产生溢出,则表示出现错误。5.标志位运算结果为0时,ZF=1;运算结果为负数,则SF=1;运算结果低八位有偶数个1,PF=1;3.3.2算术运算指令

实现二进制/BCD码数据的四则运算1、加法运算:ADD/ADC/INC2、减法运算:SUB/SBB/DEC/NEG/CMP3、乘法运算:MUL/IMUL4、除法运算:DIV/IDIV5、符号扩展:CBW/CWD6、十进制调整:DAA/DAS/AAA/AAS/AAM/AAD四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。请注意算术运算指令对标志的影响重点掌握:ADD/ADC/SUB/SBB/INC/DEC/CMP比较熟悉:

NEG/MUL/IMUL/DIV/IDIV一般了解:CBW/CWD认真理解:DAA/DAS/AAA/AAS/AAM/AAD1.加法与减法指令

⑴不带进位加法指令ADD不带进位加法指令ADD完成两个操作数求和运算,并把结果送目标操作数中。ADD指令影响CF、OF、AF、SF、ZF和PF标志位。格式:ADDDST,SRC例如:ADDAL,50HADDCX,1000HADDDS,SIADD[BX+DI],AXADDAX,[BX+2000H]MOVAL,46H ;AL=46HMOVBX,9A4DH ;BX=4A4DHADDAL,0C5H ;AL+0C5H→AL指令执行后,对标志位的影响如下:二进制运算无符号数带符号数(AL)=46H=0100011070+70+0C5H=11000101197-59自然丢掉100001011267+11SF=0,CF=1,ZF=0,AF=0,OF=0,PF=0⑵带进位加法指令ADC两个操作数相加时,还要把进位标志CF加上去,结果送到目标操作数中。格式:ADCDST,SRC带进位加法指令主要用来实现多字节、多精度加法,因为它能加上低位来的进位。例如:ADCAX,SIADCDX,[SI]ADCBX,3000HADCAL,5利用ADC指令实现多字节加法加数和被加数分别存储在2000H和3000H开始的存储单元MOVSI,2000HMOVAX,[SI]MOVDI,3000HADDAX,[DI]MOV[SI],AXMOVAX,[SI+2]ADCAX,[DI]+2MOV[SI+2],AX例如:5A764872H+1F5A427FH(四个字节的数据进行相加)思路:先加低16位,再加高16位例如,有两个4字节数,分别存放在自0100H和0200H开始的存储单元中,其低位字节位于低地址处。求这两个数之和,存放在自0300H开始的单元中。相应的程序段如下: MOVAX,[0100H] ADDAX,[0200H] MOV[0300H],AX ;低字之和存入低地址。 MOVAX,[0100H]+2 ;装入高字。 ADCAX,[0100H]+2 ;高字求和,考虑低字的进位。 MOV[0300H]+2,AX ;存入高字之和。⑶自增指令自增指令INC将操作数DST加1,结果再送回DST。格式:INCDSTINC指令影响OF、AF、SF、ZF和PF等标志位,但不影响进位标志CF。一般用于循环程序中修改指针和循环次数

例如:INCALINCCXINCBYTEPTR[BX+DI+500]INCSI;将SI内容加1,结果送回SI。举例(1)MOVAL,0FFHADDAL,1(2)MOVAL,0FFHINCAL结果是多少?CF=?例:一个数有10个字节,在M中低在先,高在后,另一个数也为10字节,也是低在先,高在后,求两数之和。MOVAX,2000HMOVDS,AXCLCMOVAL,BXADCAL,SIMOV[BX],ALINCBXINCSI⑷不带借位的减法指令SUB该指令求源操作数与目标操作数之差,结果送到目标操作数OPRD1中。SUB指令影响CF、OF、AF、SF、ZF和PF等标志位。格式:SUBDST,SRC例如:SUBBX,CXSUB[BP+2],CLSUBAL,20SUBSI,5010HSUBWORDPTR[DI],1000H例如:MOVDL,41HSUBDL,5AH上述指令执行后(DL)=0E7H,SF=1,ZF=0,CF=1,OF=0,AF=1,PF=1。⑸带借位的减法指令SBB在两个操作数相减时,还要再减去借位标志CF,结果送到目标操作数中。格式:SBBDST,SRCSBB指令对状态标志位的影响与SUB指令相同。它的用法与ADC指令相似,主要用来做多字节、多精度减法,因为它能够减去低位产生的借位。例如:SBBAX,2030HSBBWORDPTR[DI+2],1000H⑹自减指令DEC自减指令DEC将目标操作数DST减1,并将结果再送回DST。格式:DECDST例如:DECAXDECBLDECBYTEPTR[DI+2]DEC指令影响OF、AF、SF、ZF和PF标志位,但不影响进位标志CF。⑺求补指令NEG求补指令NEG对指令中给出的操作数DST求其相反数的补码形式,再将结果送回DST。因为对一个数取其相反数,相当于用0减去这个数,所以NEG指令执行的也是减法操作。格式:NEGDSTDST0-DST或DST全1-DST+1无论操作数DST是正数还是负数,执行完该指令后,都相当于对DST按位取反,末位加1。例如:NEGALNEGCX 若(AL)=03H,则CPU执行完该指令后,(AL)=0FDH。NEG指令影响CF、OF、AF、SF、ZF和PF标志位。CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志。CMP指令执行的功能与SUB指令,但结果不回送目的操作数。两个操作数保持原值。⑻比较指令CMP格式:CMPDST,SCR例如:CMPAX,2000HCMPAL,50HCMPAX,[BX+DI+100]CMPDX,DI在比较指令执行之后,根据ZF、CF、SF和OF四个标志位可以判断两数的大小。

比较指令CMP结果不回送,两个操作数原值不变,但影响标志位。执行指令之后,根据ZF,CF,SF,OF四个标志来判断两个数的大小。(1)ZF=1,两个操作数相等(2)对于两个无符号数,若CF=0,则DST>SRC若CF=1,则DST<SRC(3)对于两个有符号数两数同为正或负,如果SF=0,DST>SRC如果SF=1,DST<SRC两数一正一负时,如果OF=SF,DST>SRC如果OF!=SF,DST<SRC比较指令CMP的用途:执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等。所以,CMP指令后面常跟条件转移指令,根据比较结果不同产生不同的分支。2.乘法指令与除法指令

两个8位操作数相乘(其中一个在AL中);结果为16位AX两个16位操作数相乘(其中一个在AX中)结果为32位AX,DX:其中DX看成是AX的扩展,结果的高16位放入DX中,低16位放入AX中

乘法运算指令

2.乘法指令与除法指令

MULr8/m8;无符号字节乘法;AX←AL×r8/m8MULr16/m16;无符号字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符号字节乘法;AX←AL×r8/m8IMULr16/m16;有符号字乘法;DX.AX←AX×r16/m16

乘法运算指令

乘法指令的功能乘法指令分无符号和有符号乘法指令:MUL和IMUL乘法指令的一个源操作数显式给出,另一个操作数隐含使用AL/AX,目标操作数为AX/DX.AX。字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX中;字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX中。乘法指令利用OF和CF判断乘积的高一半是否具有有效数值。乘法指令对标志的影响乘法指令如下影响OF和CF标志:MUL

指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1。IMUL

指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。乘法指令对其他状态标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)。 对标志没有影响是指令的执行不改变标志的状态。例:无符号和有符号数的乘法运算moval,0b4h;al=b4h=180

movbl,11h;bl=11h=17mulbl;ax=Obf4h=3060,;OF=CF=1;AX高8位不为0moval,0b4h

;al=b4h=-76movbl,11h;bl=11h=17imulbl;ax=faf4h=-1292,;OF=CF=1;AX高8位含有效数字举例:(1)设(AL)=0FCH,(CL)=10H执行MULCL后(AX)=0FC0H,CF=OF=1执行IMULCL后(AX)=0FFC0H,CF=OF=0(2)MOVAL,0FFHMOVBL,0FFHMULBL;(AX)=FE01HMOVAL,0FFHMOVBL,0FFHIMULBL;(AX)=0001H⑵

除法运算指令

DIVr8/m8

;无符号字节除法:AX÷r8/m8 AL←商,Ah←余DIVr16/m16

;无符号字除法:DX.AX÷r16/m16 AX←商,DX←余IDIVr8/m8

;有符号字节除法:AX÷r8/m8 AL←商,Ah←余IDIVr16/m16

;有符号字除法:DX.AX÷r16/m16 AX←商,DX←余除法指令的功能除法指令分无符号和有符号除法指令:DIV和IDIV除法指令的除数显式给出(隐含使用一个操作数AX和DX作为被除数)。字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH;字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX。除法指令对标志没有定义。除法指令会产生结果溢出举例:(1)MOVAX,11MOVBL,2DIVBL(AX)=0105(2)MOVDX,0MOVAX,11MOVBX,2DIVBX(AX)=0005;(DX)=0001(3)MOVAX,0FFFFHMOVBL,1DIVBL除法错中断

当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断。对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出。 对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢出。3.符号扩展指令CBW

;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变。CWD;AX的符号扩展至DX;如AX的最高有效位是0,则DX=00;AX的最高有效位为1,则DX=FFH。AX不变。什么是符号扩展符号扩展指令常用于获得倍长的数据,如被除数符号扩展指令不影响标志位MOVAL,1CBWMOVAL,-1CBWMOVAX,1CWDMOVAX,-1CWD例:符号扩展MOVAL,80H ;al=80hCBW ;ax=ff80hADDAL,255 ;al=7fhCBW ;ax=007fh注意:CBW和CWD只能用来扩充AL和AX。问题:BL中有一个8位数,使其扩展为16位,怎样实现?4.十进制调整指令十进制数调整指令对BCD码运算的结果进行十进制调整,以得到正确的BCD码运算结果。

BCD码运算分压缩和非压缩两种,它们的调整方法不同。压缩BCD码:一个字节中容纳两个BCD码,其范围为:00H~99H。非压缩BCD码: 一个字节中仅容纳1个BCD码,其范围为:00H~09H。BCD码一位十进制数用4位二进制编码来表示:二进制编码的十进制数(BCD:BinaryCodedDecimal)

常用的是BCD码是8421BCD码,它用4位二进制编码中的0000~1001来表示“0”~“9”这10个数码。

8086支持组合BCD码和非组合BCD码的调整运算。真值

8(1位十进制)64(2位十进制)

二进制编码

08H

40H

组合BCD码

08H 64H

非组合BCD码

08H

0604H组合BCD码加/减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) DAA

;AL←将AL的加和调整为组合BCD码(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) DAS

;AL←将AL的减差调整为组合BCD码使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA影响AF,CF,PF,SF和ZF,但OF位不确定DAS影响AF,CF,PF,SF和ZF,但OF位不确定调整方法:如果AL低4位>9或AF=1,则AL寄存器的内容加06H,且将AF置1如果AL高4位>9,或CF=1,则AL寄存器内容加60H,且将CF置1组合BCD码的加减运算实现组合BCD码加法:68+28=96

moval,68h ;al=68h,组合BCD码表示真值68movbl,28h ;bl=28h,组合BCD码表示真值28addal,bl ;二进制加法:al=68h+28h=90hdaa ;十进制调整:al=96h

实现压缩BCD码减法:68-28=40moval,68h ;al=68h,组合BCD码表示真值68movbl,28h ;bl=28h,组合BCD码表示真值28subal,bl ;二进制减法:al=68h-28h=40hdas ;十进制调整:al=40h举例:2个8字节长组合BCD码相加MOVSI,1000HMOVDI,2000HMOVCX,8CLC;清除CFLOOP1:MOVAL,[SI]ADCAL,[DI]DAAMOV[DI],ALINCSIINCDIDECCXJNZLOOP1总结四则运算是计算机经常进行的一种操作。算术运算指令也是经常使用的一类指令。这一节要重点掌握:

ADD/ADCSUB/SBBINC/DECCMP8086除直接支持二进制数的算术运算;还提供对BCD码运算的调整指令,实现了间接的十进制算术运算操作。表8086支持的4种数据类型的算术运算3.3.3逻辑运算指令

以二进制位为基本单位进行数据的操作

1、逻辑运算: AND

OR

XOR

NOT

TEST2、移位: SHL

SHR

SAR3、循环移位:ROL

ROR

RCL

RCR常用指令,应该特别熟悉;同时,注意这些指令对标志位的影响。1、逻辑运算指令TEST与AND指令执行同样的操作,但不改变原操作数的原始值,也不会送操作结果,只是根据结果设置状态标志。TESR指令一般用来检测指令位是1还是0。NOT指令并不影响标志所有其他逻辑指令使CF和OF清零,AF不一定,并根据一般规则设置SF,ZF和PF位。逻辑运算指令的功能:逻辑指令主要用于根据源操作数中数据位的组合格式,有选择的使目的操作数中某些位改变、清零或对它进行测试。TEST指令后面可能跟一条JNZ或JZ的条件转移指令,从而根据ZF的结果判定是否转移。逻辑与运算:与1相“与”结果不变,与0相“与”结果为0;结果送目的操作数。

ANDDST,SRC;(DST)←(DST)∧(SRC)AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。屏蔽作用——对指定位置0①逻辑与指令AND②逻辑或指令OR逻辑或运算:与0相“或”结果不变,与1相“或”结果为1;结果送目的操作数。

ORDST,SRC;(DST)←(DST)∨(SRC)指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。对指定位置1③逻辑异或指令XOR逻辑异或运算:与0相“异或”结果不变,与1相“异或”的结果取反。结果送目的操作数。

XORDST,SRC;(DST)←(DST)≮(SRC)指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。对指定位取反例:XORBL,00001001B;将BL中D3和D0位求反,其他位不变比较三条对(AX)清0的指令:XORAX,AX;清CF,2个字节,3个T(时钟周期)SUBAX,AX;清CF,2个字节,3个TMOVAX,0;不影响标志位,3个字节,4个T④逻辑非指令NOT逻辑非运算:按位取反。原来是“0”的位变为“1”;原来是“1”的位变为“0”。

NOTDST;(DST)中各位取反单操作数指令不影响标志位易与NEG指令混淆例:NOTBL;11110110B

将BL所有位取反

逻辑运算moval,45handal,31h;逻辑与al=01hmoval,45horal,31h;逻辑或al=75hmoval,45hxoral,31h;逻辑异或al=74hmoval,45hnotal;逻辑非al=bah45h0100010131h00110001⑤测试某些位为0或1TEST

testal,01h

;测试AL的最低位D0

jnzthere

;标志ZF=0,即D0=1

;则程序转移到there

...

;否则ZF=1,即D0=0,顺序执行

there:

...TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。TEST指令举例:对逻辑运算指令的说明:1、对应位进行相应的逻辑运算2、AND指令一般用于将指令位清03、OR指令一般用于将指定位置14、XOR指令一般用于将某个寄存器清05、TEST指令一般用于测试寄存器中的指令位是0还是1,在TEST指令后常跟一条条件转移指令。指令应用举例例1:将英文小写字母ASCII转换成大写大写英文字母ASCII为:‘A’~’Z’41H~5AH小写英文字母ASCII为:‘a’~’z’61H~7AH……MOVAL,‘a’ANDAL,0DFH;(AL)=41H……例2:判断A单元中数据的奇偶性假设:(A)=0AEHMOVAL,A;(AL)=0AEHTESTAL,01HJZEVEN;结果=0为偶数转EVEN奇数处理……EVEN:偶数处理检测(AL)的最低位是否为0,若为0转EVEN例3:假设AL中存放着一个负数的原码,编程求其补码①反吗+1②从末位开始找第一个非0位,按位取反,符号位不变MOVAL,81H原码:10000001补码:11111111方法1:NOTALORAL,80HADDAL,1方法2:ANDAL,7FHNOTALADDAL,1方法3:XORAL,7FHADDAL,1方法4:NEGALORAL,80H方法5:ANDAL,7FHNEGAL

3.3.4移位指令

移位指令将操作数移动一位或多位,分成非循环移位和循环移位,分别具有左移或右移操作:

(2)循环移位指令ROL(RotateLeft)RCL(RotatethoughCFLeft)ROR(RotateRight)RCR(RotatethoughCFRight)

(1)非循环移位指令SAL(ShiftArithmeticLeft)SHL(ShiftLogicLeft)SAR(ShiftArithmeticRight)SHR(ShiftLogicLeft)(1)非循环移位指令SAL:算术左移,LSB补0,MSB进CFSAR:算术右移,LSB进CF,MSB不变SHL:逻辑左移,LSB补0,MSB进CFSHR:逻辑右移,LSB进CF,MSB补0

(1)非循环移位指令指令格式:SHLDST,1SHLDST,CLSALDST,1SALDST,CLSHRDST,1SHRDST,CLSARDST,1SARDST,CL移位次数若是1次,可以直接出现在指令中,如果移位次数大于1次,则由CL寄存器间接给出。(1)非循环移位指令例:SALDX,1MOVCL,4SALAX,CLSALAL,CLSALAL,3SALAL,CL(1)非循环移位指令注意:①操作数可以是寄存器或内存单元中的8位或16位操作数;②逻辑移位指令把操作数看成是无符号数SHLSHR③算术移位指令把操作数看成有符号数SALSAR④SAL和SHL操作相同,以0填充最低位⑤SAR和SHR操作不同,SAR最高位保持不变(符号位),SHR以0填充最高位⑥对于移位指令,只有移动次数是1时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论