第三章汇编语言程序设计_第1页
第三章汇编语言程序设计_第2页
第三章汇编语言程序设计_第3页
第三章汇编语言程序设计_第4页
第三章汇编语言程序设计_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与接口技术第三章汇编语言程序设计本章目录3.1 计算机语言一、机器语言二、汇编语言三、高级语言3.2 汇编语言源程序一、汇编语言源程序的结构——分段结构二、汇编语言语句的类型和格式三、数据项及表达式3.3 伪指令一、数据定义伪指令二、符号定义伪指令三、段定义伪指令四、设定段寄存器伪指令五、过程定义伪指令六、模块定义与连接伪指令(自学)七、宏命令伪指令(自学)3.4 DOS调用一、概述二、DOS软中断和系统功能调用3.5 汇编语言程序设计举例3.1 计算机语言一、机器语言用二进制表示指令和数据优点:执行速度快,占有内存少缺点:不直观,不易编写、阅读和理解,面向硬件,不能移植二、汇编语言用助记符书写指令,地址和数据也可用符号表示优点:编写、阅读和修改较方便,不易出错,执行速度与机器语言相近缺点:面向硬件,不能移植汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编程序:完成汇编工作的系统软件。包括:小汇编(ASM):需要64K内存支持宏汇编(MASM):需要96K以上的内存支持,功能更强三、高级语言包括:BASIC,C,C++,FORTRAN,PASCAL,COBOL等优点:通用性强,容易理解、学习和掌握缺点:占用内存和时间多3.2 汇编语言源程序例3.2.1用汇编语言源程序实现五字节十六进制数相加DATA SEGMENT ;定义数据段DATA1 DB10H,11H,0A4H,13H,14HDATA2 DB23H,24H,21H,22H,0C2HDATA ENDS ;数据段结束CODE SEGMENT ;定义代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX ;初始化DSMOVCX,5MOVSI,0CLCLOOPER: MOVAL,DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLTCODE ENDS ;代码段结束

END START ;源程序结束返回1返回2一、汇编语言源程序的结构—分段结构NAME1 SEGMENT

(语句体)NAME1 ENDSNAME2 SEGMENT

(语句体)NAME2 ENDS

(语句体)

END <标号>二、汇编语言语句的类型和格式类型:指令性语句:由CPU指令组成指示性语句:由伪指令指令组成组成:指令性语句:[标号:][前缀]操作码 [操作数[,操作数]][;注释]指示性语句:[名字]伪操作[操作数[,操作数,…]][;注释]指令性语句和指示性语句的区别标号和名字:指令性语句中的“标号”和指示性语句中的“名字”在形式上类似,但标号表示指令的符号地址,需要加上“:”;名字通常表示变量名,段名,过程名等,其后不加“:”。不同的伪操作对是否有名字有不同的规定,有些伪操作规定前面必须有名字,有些则不允许有名字,还用一些可以任选。名字在多数情况下表示的是变量名,用来表示存储器中一个数据区的地址。指令性语句中的操作数最多为双操作数,也可以没有操作数,而指示性语句中的操作数至少要有一个,并可根据需要有多个,当操作数不只一个时,相互之间用逗号隔开例如:STRAT:MOVAX,DATA;指令性语句DATA1DB11H,22H,33H;指示性语句注释:在汇编语言程序中,注释的前面要求加上“;”,注释可以跟在语句后面,也可以作为一个独立的行。若注释有多行,则换行以后前面还要加上分号。三、数据项及表达式(一)常量数字常量字符串常量:用单引号括起的一个或多个ASCII码字符,如’aberTY’(二)标号标号是由程序员确定的,它不能与指令助记符或伪指令重名。也不允许由数字打头,字符个数不超过31。标号是某条指令所存放单元的符号地址,是转移或调用指令的目标操作数。标号有三种属性:段值属性:段值属性是标号所在段的段基址,它存放在CS寄存器中偏移量属性:偏移量属性是标号所在段的起始地址到定义该标号的地址之间的字节数(即偏移地址)。它是16位无符号数类型:

NEAR:近标号,只能在段内被引用,地址指针为2字节FAR:远标号,可以在其他段被引用,地址指针4字节(三)变量变量也有三种属性:段属性:变量所在段的段基址,存放在DS或ES寄存器中偏移量属性:变量所在段的起始地址到变量地址之间的字节数,它是16位无符号数类型:BYTE,WORD,DWORD,QWORD,TBYTE变量是存储器中某个数据区的名字,变量的值可以改变。变量在指令中可以作为存储器操作数引用变量名由字母打头,长度不超过31个字符,使用变量时应注意以下两点:①变量类型与指令的要求相符。如:MOV AX,VAR1 ;要求VAR1必须定义为字类型变量,否则这里的引用就是错误的②在定义变量时,变量名对应的是数据区的首地址。若数据区中有多个数据,则在对其它数据操作时,需修改地址。如:NUM DB 11H,22H,33H…MOV AL,NUM+2 ;(AL)33H(四)表达式表达式不是指令,不能由CPU执行。在程序汇编时,汇编程序对表达式进行运算,得到一个确定的值。所以在CPU执行程序时,表达式本身已经是一个有确定值的操作数。表达式的常用运算符:1、算术运算符+、-:用于数值表达式和地址表达式*、/、MOD:只用于数值表达式例如:MOVAL,8+5等价于:MOVAL,132、逻辑运算符AND、OR、XOR、NOT:只用于数值表达式例如:MOVAL,0ADHAND0CCH等价于:MOVAL,8CH注:逻辑运算符和逻辑指令的区别:

ANDAL,01011010B ;逻辑指令

MOVAL,01011010BAND11110000B;逻辑运算符3、关系运算符EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于):参与关系运算的必须是两个数值或同一段中的两个存储单元地址,运算结果为0(关系不成立时)或0FFFFH(即-1)(关系成立时)。例如,MOVAX,4EQ3;关系不成立,汇编成:MOVAX,0MOVAX,4NE3;关系成立,汇编成:MOVAX,0FFFFH4、取值运算符和属性运算符取值运算符分析一个存储器操作数的属性;而属性运算符则可以规定存储器操作数的某个属性①OFFSET利用OFFSET可以得到一个标号或变量的偏移地址例如,MOVSI,OFFSETDATA1②SEG利用SEG可以得到一个标号或变量的段基址,例如,下面两条指令的执行结果是将变量ARRAY的段地址送DS寄存器MOVAX,SEGARRAYMOVDS,AX③PTR:指定位于其后的存储器操作数的类型,例如CALLDWORDPTR[BX];说明存储器操作数为4字节,即远过程调用修改已定义变量的类型例如,变量VAR被定义为字变量,现在要将VAR当做字节操作数使用,则:错误:MOVAL,VAR正确:MOVAL,BYTEPTRVAR5、其它运算符(1)方括号[]:方括号里的内容表示操作数的偏移地址(2)段超越运算符冒号:“:”3.3 伪指令伪指令与CPU指令的区别:CPU指令在程序运行时由CPU执行,每条指令对应CPU的一种特定操作;而伪指令在汇编过程中由汇编程序执行经过汇编以后,每条CPU指令都被汇编并产生一条与之对应的目标代码,而伪操作则不产生任何目标代码。一、数据定义伪指令(一)格式:[变量名] 伪指令操作数[,操作数…]DB(DefineByte):定义变量为字节类型,变量中的每个操作数占有一个字节。DB伪指令也常用来定义字符串,例如:定义功能伪指令定义VC++定义无符号字节数据DATA1DB254unsignedchardata1=254有符号字节数据DATA4DB-100chardata4=-100字符串SDB‘fsdfsdafs’strings("fsdfsdafs");DW(DefineWord):定义变量为字类型,变量中的每个操作数占有2个字节。在内存中存放时,低字节放在低地址,高字节放在高地址伪指令定义VC++定义无符号字数据DATA1DW2544unsignedshortdata1=2544有符号字数据DATA4DW-100shortdata4=-100DD(DefineDoubleWord):定义变量为双字类型,变量中的每个操作数占有4个字节。在内存中存放时,低字节放在低地址,高字节放在高地址DD用于定义有符号双字、无符号双字和浮点数(单精度实数)伪指令定义VC++定义无符号双字DATA1DD254400unsignedintdata1=254400有符号双字DATA4DD-100intdata4=-100浮点数NUM1DD-23.4floatNum1=-23.4DQ(DefineQuadWord):定义变量为4字类型,变量中的每个操作数占有8个字节。在内存中存放时,低字节放在低地址,高字节放在高地址DQ通常用于存放双精度实数。伪指令定义VC++定义双精度实数NUM1DQ123.4doubleNum1=123.4DT(Defineten-bytes):定义变量的类型为十字节(TBYTE)。DT后面的每个操作数为10个字节的压缩BCD码。伪指令定义VC++定义十字节数据NUM1DT1234567890H无(二)通配符“?”给变量分配内存单元,但不赋初值。例如DATA2DW?;为变量分配2个字节的空间,初值任意(三)重复操作符DUPBUFDB10DUP(?);为变量BUF分配100个字节MASKDB 5DUP(‘OK!’);定义一个数据区MASK,其中有5个重复的字符串’OK!’,共占15个字节ARRAYDB100DUP(3DUP(8),6);定义一个数据区,其中包含重复100次的内容:8,8,8,6例如:画图表示下列变量在内存中的存放顺序VAR1DB11H,‘HELLO!’VAR2DW12H,3344HVAR3DD1234HVAR4DW2DUP(88H)VAR5DB2DUP(56,78)11H48H45H4CH4CH4FH21H12H00H44H33H34H12H00H00H88H00H88H00H38H4EH38H4EHVAR1+0VAR1+1VAR2+0VAR2+1VAR3+0VAR3+1VAR4+0VAR4+1VAR5+0VAR5+1二、符号定义伪指令(一)EQU格式:名字 EQU 表达式功能:将表达式的值赋予一个名字。以后可用这个名字代替表达式。从而使程序简捷易读,易修改。其中,表达式可以是:常数,变量,数值表达式,地址表达式,指令助记符。例如:TENEQU0AH;表示TEN为常数0AHADREQUES:[BP+DI+5];地址表达式在程序段中应用以上定义:MOVAL,TEN;AL0AHJMPWORDPTRADR;转到以字单元ES:[BP+DI+5]的内容为地址的程序段执行EQU不允许对同一符号重新定义。(二)等号“=”格式: 名字=表达式功能与EQU基本相同,区别在于它可以对同一符号重新定义。例如:FACTOR=10H;FACTOR代表数值10H…FACTOR=50H;从现在开始,FACTOR代表数值50H三、段定义伪指令(一)SEGMENT/ENDS格式:段名 SEGMENT [定位类型][组合类型][‘类别’]

(语句体)段名 ENDS功能:定义一个逻辑段,三个任选项是给汇编和连接程序的命令。段名不能与指令助记符或伪指令等保留字重名1、定位类型(Align):告诉汇编程序如何确定逻辑段的边界在存储器中的位置2、组合类型(Combine)功能:主要用于具有多个模块的程序中。它告诉汇编程序,当一个逻辑段装入存储器时它与其他段段如何组合。组合类型有6种:(1)NONE(缺省方式):表示本段与其他段不组合,即对不同程序中的逻辑段,即使段名相同,也分别作为不同的逻辑段装入内存而不进行组合。(2)PUBLIC:对不同程序模块中用PUBLIC说明的同名逻辑段,汇编时将它们组合在一起,构成一个大的逻辑段装入内存。(3)STACK:与PUBLIC基本相同,但仅限于堆栈区的逻辑段使用。即在汇编时将不同程序模块中用STACK说明的同名逻辑段集中为一个大的堆栈段,由各模块共享。SP指向这个大的堆栈区的栈顶(4)COMMON:对不同程序模块中用COMMON说明的同名逻辑段,连接时从同一地址开始装入,此时,各逻辑段将发生重叠。最后,连接后的长度等于原来最长逻辑段的长度,重叠部分的内容为最后一个逻辑段的内容(5)MEMORY:当几个逻辑段连接时,本逻辑段定位在最高地址空间。若被连接的逻辑段中有多个段的组合类型是MEMORY,则汇编程序只将首先遇到的段作MEMORY,其它为COMMON段(6)AT表达式 根据表达式的结果给段定位。例如AT8A00H表示本段从物理地址A8000H开始装入。3、’类别’(’class’)功能:在连接时决定各逻辑段的装入顺序。当几个程序模块进行连接时,其中具有相同类别名的逻辑段被装入连续的内存区定位类型,组合类型和‘类别’这3个可选项主要用于多个程序模块的连接。若程序只有一个模块,即只包含代码段,数据段,附加段和堆栈段时,除堆栈段建议用STACK类型外,其他段的组合类型及类别均可省略。定位类型一般采用默认值PARA四、设定段寄存器伪指令功能:ASSUME告诉汇编程序,源程序中的逻辑段和物理段之间的关系。当汇编程序汇编一个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中的指令或数据格式:ASSUME段寄存器名:段名,[段寄存器名:段名[,…]]注意:①ASSUME应放在可执行程序开始位置的前面②ASSUME只通知汇编程序有关段寄存器和逻辑段的关系,并没有给段寄存器赋实际的初值,后一项工作必须通过CPU指令(MOV)完成(代码段例外)(见例3.2.1)五、过程定义伪指令(一)PROC/ENDP格式:过程名PROC[NEAR/FAR]…RET过程名ENDP过程(即子程序)可以是近过程(与调用程序在同一个代码段内),此时类型为NEAR(缺省);过程也可以是远过程(与调用程序不在同一个代码段内),此时类型为FAR。过程的定义和调用均可嵌套,例如:NAME1PROC FAR

… CALLNAME2

… RETNAME2PROC

… RETNAME2ENDPNAME1ENDP过程NAME2嵌入在过程NAME1中例如:编写10ms延时子程序DELAYPROC;定义一个近过程 PUSHBX;保护BX原来的内容 PUSHCX;保护CX原来的内容 MOVBL,2;外循环次数=2NEXT:MOVCX,4167;内循环次数,实现延时5msW10MS:LOOPW10MS;CX0则循环 DECBL;修改外循环计数值 JNZNEXT;BX0则进行第2轮循环 POPCX;恢复CX原来的内容 POPBX;恢复BX原来的内容 RET ;过程返回DELAYENDP ;过程结束六、宏命令伪指令宏调用和子程序调用的区别:宏调用由MASM在汇编过程中处理,在每个宏调用处,将相应的宏定义体插入;子程序调用是用CALL和RET指令完成宏调用占用内存较多宏调用执行速度较快格式:宏指令名 MACRO [<形参表>]

…(宏定义体) ENDM使用宏的过程:宏定义→宏调用→宏扩展。其中,宏扩展是指汇编时,MASM对每个宏指令名,自动用相应宏定义体中的程序段代替。形参与实参:①形参可以没有②若实参多于形参,多余的实参被忽略;若实参少于形参,多余的形参为空例

有如下宏定义和宏调用STRMOVMACRO SOUR,DEST,COUNT,LEN MOV SI,OFFSETSOUR MOV DI,OFFSETDEST MOV CX,COUNT CLD REP MOVS&LEN ENDM ... STRMOV BUFFER1,BUFFER2,100,B ...则宏扩展后为:

STRMOV BUFFER1,BUFFER2,100,B

+ MOV SI,OFFSETBUFFER1 + MOV DI,OFFSETBUFFER2 + MOV CX,COUNT + CLD + REP MOVSB注:宏定义允许嵌套七、模块定义与连接伪指令在编写较大的汇编语言程序时,通常将其划分为几个独立的源程序(或称模块),然后将各个模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。在每一个模块的开始,常用伪指令NAME或TITLE为该模块定义一个名字,而在模块的结尾处要加结束伪指令END,以使汇编程序结束汇编。(一)NAME格式: NAME模块名功能:给汇编后得到的目标程序指定一个名字,以便连接时使用,NAME前不允许加标号。(二)TITLE格式:TITLE标题名功能:为程序清单的每一页指定打印的标题。标题名最多允许60个字符若程序中没有NAME伪指令,则汇编程序将TITLE伪指令后面的标题名中的前六个字符作为模块名。若源程序中既没有使用NAME,又没有使用TITLE伪指令,则汇编程序将源程序的文件名作为目标程序的模块名。(三)END格式: END [标号] 功能:源程序结束。其中,标号表示程序执行的开始地址。是任选项。若有多个模块连接在一起,则只有主模块的END语句使用标号见例3.2.13.4 DOS调用微机的系统软件提供了很多可供用户调用的功能子程序。包括控制台输入/输出,基本硬件操作、文件管理、进程管理等。用户可在自己的程序中直接调用这些功能,而无需在自行编写。系统软件中提供的功能调用有两种:BIOS(BasicInputandOutputSystem)功能调用(也叫低级调用)、DOS(DiskOperationSystem)功能调用(也称高级调用)BIOS:固化在主板上FlashROM中一组程序,在IBMPC的存储器系统中,BIOS存放在从地址0FE00H开始的8KBROM存储区中,其功能包括系统测试程序、初始化引导程序、部分矢量装入程序及外设的服务程序。DOS负责管理系统的所有资源、协调微机操作。DOS功能调用不依赖于具体的硬件系统。二、DOS系统功能调用DOS系统功能调用的步骤:Step1:AH置功能号Step2:在指定寄存器中放置入口参数Step3:执行INT21H指令Step4:分析出口参数1、键盘输入键盘上的按键分为3种类型:字符键,如字母、数字等功能键,如Del,Enter等组合键,如Shift,Alt等DOS系统功能通过调用字符输入子功能,可以接收从键盘上输入的字符,输入的字符将以对应的ASCII码形式存放。例如:若在键盘上按下数据键“9”,则键盘输入功能将返回一个字符9的ASCII码39H。若程序要求的是其他类型的值,则应自行编程进行转换。(1)单字符输入功能号为1,7和8。其中7号和8号功能无回显,1号功能有回显。(回显是指键盘输入的内容同时也显示在显示器上)编程时,可根据输入的信息是否需要自动显示来选择三者之一例如,按键‘Y’按下使程序转向Yes分支,按键‘N’按下使程序转向Not分支,按下其它键,继续等待输入字符KEY: MOV AH,1 INT 21H CMP AL,'Y‘ JE YES CMP AL,'N' JE NOT JMP KEY ...YES: ...NOT:

…(2)字符串输入(0AH)该功能要求用户指定一个输入缓冲区来存放输入的字符串。缓冲器一般定义在数据段,结构如图:缓冲区长度n实际读入的字符数(不含回车符)n个字节的预留内存区(DOS从键盘读入的字符放在此处)n+2个字节的输入缓冲区123n+2若输入的字符数(包括回车符)大于此值,则喇叭会发出嘟嘟声,且光标不再右移直到输入回车符为止由0AH号功能自动填入在调用此功能前,应把输入缓冲区的起始偏移地址预置入DX寄存器。例如,从键盘上输入一个长度不超过10的字符串,DATASEGMENTSTRINGDB10,0,10DUP(?)DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,STRING MOVAH,0AH INT21H MOVAH,4CH INT21HCODEENDS ENDSTART2、显示器输出在显示器上显示的内容都是字符形式,如果是数字,则一定是其对应的ASCII码。例如,若要显示5,需要先将它转换为5的ASCII码35H(1)单字符显示(2、6号功能)使用功能2显示:…MOVDL,<要显示的字符>MOVAH,2INT21H…使用功能6显示:…MOVDL,<要显示的字符>MOVAH,6INT21H…例如:在屏幕上依次显示”1”,“2”,“3”,”A”,“B”,“C”6个字符DATASEGMENTSTRDB‘123ABC’DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEABX,STR MOVCX,6LPP: MOVAH,2 MOVDL,[BX] INCBX INT21H LOOPLPP MOVAH,4CH INT21HCODEENDS ENDSTART(2)字符串显示(9号功能)该功能要求被显示的字符串必须以“$”字符作为结束符。显示事如果希望光标能自动换行,则应该在字符串结束前回车及换行的ASCII码0DH和0AHDATASEGMENTSTRDB‘Hello,World!’,0DH,0AH,‘$’DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,STR MOVAH,9 INT21H MOVAH,4CH INT21HCODEENDS ENDSTART例如:在屏幕上显示字符串”Hello,World!”3.返回到DOS(4CH号功能)一个实际可运行的用户程序在执行完后,应该返回DOS,简单地使用HLT指令使CPU停止运行将无法把控制权交还给DOS。而4CH号功能可以完成这一任务。方法:MOVAH,4CHINT21H例题:从键盘输入一串字符,在字符串尾插入’$’,并显示该字符串。DATASEGMENTBUFSIZEDB50ACTLENDB?CHARSDB50DUP(20H)DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,BUFSIZE MOVAH,0AH INT21H XORCX,CX MOVCL,ACTLEN LEADX,CHARS

MOVBX,DX ADDBX,CX MOVBYTEPTR[BX],’$’ MOVAH,09H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART例1将BCD数转换为ASCII码以BCDBUFF为首址的内存区有18个字节的组合BCD数,要求转换为相应的36个ASCII码,并依次输出到CRT显示。BCD数存放时,低位在前,高位在后。若该十进制数有若干个前导“0”,不显示前导“0”,若该数字全部为0,则要求显示一个“0”3.5 汇编语言程序设计举例例1流程图DATA SEGMENTBCDBUFDB56H,34H,12H,90H,78H,56H,34H,12H,90H,78H DB56H,34H,12H,90H,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME:CS:CODE,DS:DATA,SS:STACKTRANS PROC FARATART: PUSH DS MOV AX,0 PUSH AX;使程序返回DOS MOV AX,DATA MOV DS,AX MOV CX,18;(CX)<-字节数 LEA SI,BCDBUF ADDSI,17;(SI)<-BCD缓冲区末址

MOVDH,0;设置前导为‘0’标志LOAD: PUSHCX MOVAL,[SI];取一个字节BCD数

DEC SI MOVBL,AL;暂存BL MOVCL,4 ROLAL,CL ANDAL,0FH;取高4位BCD ORDH,AL;是否为前导‘0’ JZLAST;是,不显示

ADDAL,30H;不是,转换,显示

MOVDL,AL MOVAH,2 INT 21HLAST: POPCX;恢复CX中的循环次数

CMPCX,1;最后一个字节?

JNZBCDL;不是,转移到BCDL MOVDH,OFFH;是,设置标志BCDL: MOVAL,BLANDAL,0FH ORDH,AL JZGOON ADDAL,30H MOVDL,AL MOV AH,2 INT 21H GOON: LOOP LOAD RETTRANSENDPCODE ENDS END START例2字符串查找假设内存中已经存有一张表,从键盘上输入一个字符串,要求在表中查找该字符串,如有,则在屏幕上显示“OK!”,若没有,则显示“No!”;若输入字符串的长度大于表的长度,则显示“Wrong!Thelengthofthestringistoolong!”(本例中假设内存中已经存有一张包括26个英文大写字母的表),例2流程图DATA SEGMENTTABLE DB 'ABCDEFGHIGKLMNOPQRSTUVWXYZ'STR1 DB 'Pleaseenterastring:',ODH,OAH,'$'STR2 DB 'Wrong!Thestringistoolo

温馨提示

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

评论

0/150

提交评论