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

下载本文档

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

文档简介

第5章-汇编语言程序设计1第一页,共69页。主要内容

5.1汇编语言程序格式

5.2伪指令

5.3汇编语言程序设计

5.4DOS和BIOS功能调用微机原理及接口》教学课件第二页,共69页。汇编语言的特点汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序在有些应用领域,汇编语言的作用是不容置疑和无可替代的汇编程序设计的过程是与其他高级语言程序设计大致相同第三页,共69页。汇编语言源程序汇编程序可执行指令和伪指令DEBUG、ASM、MASM机器语言汇编语言的特点第四页,共69页。汇编语言源程序示例:DATASEGMENT M1DW00FFH M2DW00FFH P1DW? P2DW?DATAENDS

STACKSEGMENT STDB100DUP(?)TOPEQULENGTHSTSTACKENDS

CODESEGMENTASSUME CS:CODE,DS:DATASS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOP MOVBX,OFFSETM1 MOVAX,[BX] MOVDX,00H MOVBX,OFFSETM2 MULWORDPTR[BX] MOVBX,OFFSETP1 MOV[BX],AX MOVBX,OFFSETP2 MOV[BX],DX HLT MOVAH,4CH INT21H

CODEENDSENDSTART

第五页,共69页。5.1汇编语言源程序格式完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内通常,程序还需要一个堆栈段整个程序以END结束

源程序由语句序列构成第六页,共69页。一、汇编语言的语句格式执行性语句——执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体标号:

硬指令助记符操作数[;注释]说明性语句——说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等名字

伪指令助记符参数[;注释]第七页,共69页。1、标号、名字与标识符标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写一个源程序中,每个标识符的定义是唯一的,且不能是汇编系统所采用的保留字第八页,共69页。名字和标号的属性名字和标号是用户自定义的标识符。名字用于伪指令,标号用于硬指令。名字和标号一经使用便具有两类属性:逻辑地址属性——名字和标号对应存储单元的逻辑地址,含段地址和偏移地址;类型属性——变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等;标号、段名、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间调用汇编程序提供有关操作符,以便获取这些属性值第九页,共69页。保留字保留字(ReservedWord)是汇编程序已经利用的标识符(也称为关键字),主要有:硬指令助记符——例如:MOV、ADD伪指令助记符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS预定义符号——例如:@data

汇编语言对大小写不敏感第十页,共69页。2、(硬)指令和伪指令指令是目标机器所能执行的代码,为目标cpu所执行使CPU产生动作、并在程序执行时才处理的指令,硬指令就是第4章学习的处理器指令,与具体的处理器有关、与汇编程序无关伪指令是汇编程序所执行的一些操作,为交叉汇编机器所执行不产生CPU动作、在程序执行前由汇编程序处理的说明性指令,伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令第十一页,共69页。3、操作数和参数处理器指令中的操作数可以是立即数、寄存器和存储单元伪指令中的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔汇编语言程序中,指令参数有数值型(主要形式是常数和数值表达式)和地址型(主要形式是标号和名字,包括变量名、段名、过程名等)。例如,硬指令的操作数有立即数、寄存器和存储单元;其中,立即数就要用数值型参数表达,存储单元就应该用地址型参数(存储器操作数)表达。第十二页,共69页。1)常量常量表示一个固定的数值,它又分成多种形式常数字符串符号常量数值表达式第十三页,共69页。

常数指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数B由0和1两个数字组成,以字母B/b结尾二进制64H0FFH0B800H由0~9、A~F数字组成,以字母H/h结尾,以字母开头的常数需要加一个前导0十六进制100255D由0~9数字组成,以字母D/d结尾(缺省情况可以省略)十进制第十四页,共69页。字符串字符串常量是用单引号或双引号括起来的单个字符或多个字符其数值是每个字符对应的ASCII码值例如:

‘d’(等于64H)

‘AB’(等于4142H)

‘Hello,Assembly!’第十五页,共69页。符号常量符号常量使用标识符表达一个数值MASM提供等价机制,用来为常量定义符号名符号定义伪指令有等价“EQU”和等号“=”:

符号名EQU数值表达式 符号名EQU<字符串>;MASM5.x不支持 符号名=数值表达式EQU用于数值等价时不能重复定义符号名,但“=”允许重复赋值。例如: X=7 ;等效于:Xequ7 X=X+5 ;“XEQUX+5”是错误的第十六页,共69页。符号定义实例:符号定义

DosWriteCharequ2 CR=13 CallDOSequ<int21h>符号应用(左边的程序段等价右侧的符号形式) movah,2 →

movah,DosWriteChar movdl,13 →

movdl,CR int21h →

CallDOS第十七页,共69页。数值表达式数值表达式一般是指由运算符连接的各种常量所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符我们经常使用的是加减乘除(+-*/)例如:movax,3*4+5 ;等价于:movax,17第十八页,共69页。2)变量变量实质上是指可以读写的内存单元,虽然内存单元地址不变,但其中存放的数据可以改变变量需要事先定义才能使用变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化定义后的变量可以通过变量名等方法引用(读写)其中的数据,即变量中的数值第十九页,共69页。变量的定义变量定义的汇编语言格式为:

变量名变量定义伪指令初值表变量名为用户自定义的标识符,有时变量名也可以缺省变量定义伪指令有DB、DW、DD等初值表是用逗号分隔的参数,主要由常量、数值表达式或“?”组成。其中“?”表示未赋初值多个存储单元如果初值相同,可以用复制操作符DUP进行定义:

重复次数

DUP(重复参数)表示初值表首元素的逻辑地址,常称为符号地址。第二十页,共69页。变量名变量名是用户自定义的标识符,用来表示可读写数据的首地址,或初值表的首地址。这个用符号表示的地址,常称为符号地址。一个变量可以没有变量名,在这种情况下,汇编程序将直接为初值表分配空间,即该变量没有符号地址。设置变量名是为了方便存取它指示的存储单元。第二十一页,共69页。初值表初值表一般指用户定义的多个数据(用逗号分隔)或内存空间主要由数值常数、表达式或?、DUP等组成

?——表示初值不确定,即未赋初值;

DUP——表示重复初值。DUP的格式为: 重复次数DUP(重复参数)第二十二页,共69页。4、注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理第二十三页,共69页。5、分隔符语句的4个组成部分要用分隔符分开标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同MASM支持续行符“\”第二十四页,共69页。二、表达式用运算符1、算术运算符实现加、减、乘、除、取余的算术运算。 movax,3*4+5 ;等价于movax,17其中MOD也称为取模,它产生除法之后的余数,如: 19mod7=5+和-运算符还可以用于地址表达式。除加、减外,其他运算符的参数必须是整数。第二十五页,共69页。2、逻辑运算符实现按位相与、相或、异或、求反的逻辑运算。

oral,03h

AND45h

;等价于oral,01h第二十六页,共69页。3、移位运算符实现对数值的左移、右移的逻辑操作;移入低位或高位的是0。其格式为:

数值表达式SHL/SHR移位次数

moval,0101b

SHL(2*2) ;等价于moval,01010000b第二十七页,共69页。4、关系运算符用于比较和测试符号数值MASM用0FFFFH(补码-1)表示条件为真,用0000H表示条件为假。

运算符包括:EQNEGTLTGELE

例:movbx,((PORTLT5)AND20H)OR((PORTGE5)AND30H) ;当PORT<5时,汇编结果为movbx,20H ;当PORT>5时,汇编结果为movbx,30H ;否则,汇编结果为movbx,00H第二十八页,共69页。5、高低分离符取数值的高半部分或低半部分。HIGH、LOW从一个字数值或符号常量中得到高、低字节

movah,

HIGH8765h ;等价于movah,87h从MASM6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分

dd_valueequ0ffff1234h ;定义一个符号常量

movax,

LOWWORDdd_value;等价于movax,1234h第二十九页,共69页。6、地址操作符地址操作符取得名字或标号的段地址和偏移地址返回名字或标号的段地址SEG名字/标号返回名字或标号的偏移地址OFFSET名字/标号段前缀,采用指定的段地址寄存器:当前偏移地址$将括起的表达式作为存储器地址指针[]第三十页,共69页。7、类型操作符类型操作符对名字或标号的类型属性进行设置类型操作符包括:PTR/THIS/SHORTTYPE/LENGTH/SIZE第三十一页,共69页。1)PTR操作符 类型名PTR名字/标号PTR操作符使名字或标号具有指定的类型,其中:类型名可以是:BYTE/WORD/DWORD/FWORD/QWORD/TBYTE;NEAR/FAR;由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。 moval,byteptrw_var ;w_var是一个字变量 jmpfarptrn_label ;n_label是一个标号使用PTR操作符,可以临时改变名字或标号的类型。第三十二页,共69页。2)THIS操作符 THIS类型名用THIS说明的操作数,在汇编时,具有当前逻辑地址和指定的类型:

b_varequTHISbyte

;字节变量b_var,

w_vardw10dup(0)

;字变量w_var,两变量地址相同f_jumpequTHISfar ;f_jump为段间转移地址(f_jumplabelfar)LABEL伪指令的功能等同于“EQUTHIS”。第三十三页,共69页。3)SHORT操作符 SHORT标名指定标号作为-128~+127字节范围内的短转移,如果标号实际上超出了这个范围,则出错。

jmp

shortn_jump第三十四页,共69页。4)TYPE操作符 TYPE名字/标名返回与名字或标号类型相关的数值对字节、字和双字变量分别返回1、2和4;对短、近和远转移分别返回ff01h、ff02h和ff05h。 movax,TYPEw_var ;汇编结果为movax,2 movax,TYPEn_jump ;汇编结果为movax,0ff02h(near标号)操作符SIZE返回整个变量占用的字节数操作符LENGTH返回整个变量的数据项数(即元素数)第三十五页,共69页。8.运算符的优先级1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT第三十六页,共69页。5.2伪指令一、符号定义伪指令1、EQU(等值语句)

将表达式值赋予名字,一经定义不能重复。

例如:

CREQU0DH;常数AEQUASC-TABLE;变量(事先已定义)STREQU64×1024;数值表达式ADREQUES:[BP+DI+5];地址表达式第三十七页,共69页。功能同EQU,但可重新定义一个符号。例如:COUNT=100同COUNTEQU100CONNT=57COUNT重新定义2、等号语句=第三十八页,共69页。二、内存数据(变量)定义伪指令定义一个变量的类型,给内存单元赋初值,或者分配、预留内存单元分为以下几类:DB——定义字节伪指令DW

——定义字伪指令DD

——定义双字伪指令DF——定义3字伪指令DQ——定义4字伪指令DT——定义10字节伪指令第三十九页,共69页。1、定义字节变量(DefineByte)DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值初值表中每个数据一定是字节量,存放一个8位数据:可以是0~255的无符号数或是-128~+127带符号数也可以是字符串常数第四十页,共69页。定义字节变量实例:;数据段X db'a',-5 db2dup(100),?Y db'ABC'第四十一页,共69页。字节变量的应用X db'a',-5 db2dup(100),?Y db'ABC‘moval,X;此处X表示它的第1个数据,故AL←'a'decX+1;对X为始的第2个数据减1,故成为-6movY,al;现在Y这个字符串成为'aBC'符号地址变量初值初值表第四十二页,共69页。2、定义字变量(DefineWord)DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值初值表中每个数据是字量,一个字单元可用于存放任何16位数据:一个段地址一个偏移地址两个字符0~65535之间的无符号数-32768~+32767之间的带符号数第四十三页,共69页。定义字变量实例:;数据段count dw8000h,?,'AB'maxint equ64hnumber dwmaxintarray dwmaxintdup(0)第四十四页,共69页。字变量和字常量的应用字变量和字常量的定义:

WNUM

EQU

5678H ;定义WNUM为常量

COUNT

DW

20H ;定义COUNT为变量,假设它在数据段 ;的偏移地址为10H,20H为其中存放的 ;初始化数据字变量和字常量的应用:

MOVAX,[BX+SI+WNUM]→

MOVAX,[BX+SI+5678H]

MOVAX,COUNT

MOVAX,[0010H]

LEABX,COUNT

LEABX,[0010H]

MOVBX,OFFSETCOUNT→

MOVBX,0010H第四十五页,共69页。3、定义双字变量(DefineDoubleword)DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值初值表中每个数据是一个32位的双字量:可以是有符号或无符号的32位整数也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针

vardd DD 0,?,12345678h farpoint DD 00400078h第四十六页,共69页。4、其他数据单元定义伪指令定义3字伪指令DF——用于为一个或多个6字节变量分配空间及初始化。

6字节常用在32位CPU中表示一个48位远指针(16位段选择器:32位偏移地址)。定义4字伪指令DQ——用于为一个或多个8字节变量分配空间及初始化。

8字节变量可以表达一个64位整数。定义10字节伪指令DT——用于为一个或多个10字节变量分配空间及初始化。

10字节变量可以表达长双精度(longdouble)浮点数。第四十七页,共69页。5.变量的应用变量具有存储单元的逻辑地址属性程序代码中

通过变量名可直接存取其所指向的首个数据

Xdb'a',-5

moval,X ;X←'a'通过变量名加减位移量可存取以改变量地址为基地址的前/后数据

moval,X+1 ;X←-5

第四十八页,共69页。变量的定义示例:;数据段bvar1 db100,01100100b,64h,'d'

;字节变量:不同进制表达同一个数值,内存中有4个64Hminint =5

;符号常量:minint数值为5,不占内存空间bvar2 db-1,minint,minint+5

;内存中数值依次为FFH,5,0AHdb?,2dup(20h)

;预留一个字节空间,重复定义了2个数值20Hwvar1 dw2010h,4*4 ;字变量:两个数据是2010H、0010H,共占4个字节wvar2 dw? ;wvar2是没有初值的字变量第四十九页,共69页。变量的定义示例(续):dvar dd12347777h,87651111h,? ;双字变量:2个双字数据,一个双字空间abc db’a’,’b’,’c’,? ;定义字符,实际是字节变量maxintequ0ah ;符号常量:maxint=10string db’ABCDEFGHIJ’

;定义字符串:使用字节定义DB伪指令crlfs db13,10,’$’

;回车符0DH、换行符0AH和美元符'$'=24Harray1 dwmaxintdup(0)

;10个初值为0的字量,可以认为是数组array db2dup(2,3,2dup(4)) ;6个字节内容依次为:0203040402030404第五十页,共69页。三、定位伪指令汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址)定位伪指令ORG控制数据或代码所在的偏移地址

ORG

参数ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:

ORG100h ;从100H处安排数据或程序

ORG$+10 ;偏移地址加10,即跳过10个字节空间汇编语言程序中,符号“$”表示当前偏移地址值第五十一页,共69页。四、段定义伪指令段名 segment定位

组合

段字

‘类别名' ... ;语句序列段名 ends完整段定义由SEGMENT和ENDS这一对伪指令实现,前者定义一个逻辑段的开始,后者表示一个段的结束。段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code’类别,其他为可选属性参数。如果不指定,则采用默认参数;但如果指定,注意要按照上面的属性顺序。第五十二页,共69页。完整段定义格式示例:stack segmentstack dw512dup(?) ;设置堆栈stack endsdata segment ... ;在数据段定义数据data endscode segment’code’ assumecs:code,ds:data,ss:stackstart: movax,data movds,ax ... ;在代码段填入指令序列 movax,4c00h int21hcode ends endstart第五十三页,共69页。1、段定位(align)属性指定逻辑段在主存储器中的边界,可为:BYTE 从下一个可用的字节地址(xxxxxxxxb)开始段WORD 从下一个可用的偶数地址(xxxxxxx0b)开始段DWORD从下一个可用的模4地址(xxxxxx00b)开始段PARA 从下一个可用的模16地址(xxxx0000b)开始段PAGE 从下一个可用的模256地址(00000000b)开始段简化段定义伪指令的代码段和数据段默认采用WORD定位,堆栈段默认采用PARA定位。完整段定义伪指令的默认定位属性是PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始。第五十四页,共69页。2、段组合(combine)属性指定多个逻辑段之间的关系,可为:PRIVATE——本段与其他段没有逻辑关系,不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式。PUBLIC——连接程序把本段与所有同名同类型的其他段相邻连接,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。这是简化段定义伪指令默认的段组合。STACK——本段是堆栈的一部分,连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合。还有“COMMON”和“AT表达式”,这两者不常使用。第五十五页,共69页。3、段字(use)属性为支持32位段而设置的属性。对于16位x86CPU来说,它默认是16位段,即USE16。在汇编32位x86CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定标准的16位段。编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。第五十六页,共69页。4、段类别(class)属性当连接程序组织段时,将所有的同类别段相邻分配。段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用

‘code’

代码段

‘data’ 数据段

‘stack’ 堆栈段 来分别指示代码段、数据段和堆栈段,以保持所有代码和数据的连续。第五十七页,共69页。5、指定段寄存器伪指令ASSUME段寄存器:段名[,段寄存器名:段名,...]通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能。ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS:IP和SS:SP。 由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES。第五十八页,共69页。6、段组伪指令组名GROUP段名[,段名,...]把多个同类段合并为一个64KB物理段,并用一个组名统一存取它。定义段组后,段组内各段就统一为一个段地址,各段定义的变量和标号的偏移地址就相对于段组基地址计算。offset操作符取变量和标号相对于段组的偏移地址,如果没有段组则取得相对于段的偏移地址。 offset后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址。第五十九页,共69页。五、过程定义和子程序编写汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下:

过程名

PROC[NEAR|FAR] …… ;过程体

过程名

ENDP可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性NEAR属性(段内近调用)的过程只能被同一代码段的其他程序所调用FAR属性(段间远调用)的过程可以被相同或不同代码段的程序所调用第六十页,共69页。子程序编写注意事项子程序要用过程定义伪指令声明主程序执行CALL指令后调用子程序,子程序利用RET指令返回主程序堆栈操作——子程序中对堆栈操作(压入/弹出)要匹配使用,以保持堆栈的平衡现场的保护和恢复——子程序首部应保护要用到的寄存器(内容),子程序返回前需进行相应恢复子程序的位置——子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(即返回DOS的指令之后、结束汇编的END伪指令之前),也可以放在主程序开始执行之前的位置第六十一页,共69页。SOFDLYPROCPUSHBXPUSHCXMOVBL,10DELAY:MOVCX,2801WAIT:LOOPWAITDECBLJNZDELAYPOPCXPOPBX

RETSOFDLYENDP

例5.1:一个延迟100ms的子程序第六十二页,共69页。程序开始为了指明程序开始执行的位置,需要使用一个标号(例题中采用了start

标识符)连接程序会根据程序起始点正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值大多数程序需要数据段,程序的执行开始应是:start: movax,@data ;@data表示数据段的段地址

movds,ax ;设置DS第六十三页,共69页。六、源程序结束伪指令汇编结束表示通知汇编程序结束工作,即将源程序翻译成目标模块代码的过程结束。源程序的最后必须有一条END伪指令

END[标号]可选的“标号”参数指定程序开始执行点,连接程序据此设置CS和IP值(例题中采用了start标识符)程序终止和汇编结束是两码事第六十四页,共69页。汇编语言源程序示例:DATASEGMENT M1DW00FFH M2DW00FFH P1DW? P2DW?DATAENDS

STACKSEGMENT STDW100DUP(?)TOPEQULENGTHSTSTACKENDS

CODESEGMENTASSUME CS:CODE,DS:DATASS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOP MOVBX,OFFSETM1

温馨提示

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

评论

0/150

提交评论