




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章子程序设计 子程序设计是汇编语言程序设计中最重要的方法与技术之一 本节着重介绍子程序的基本概念 子程序的设计方法 主程序与子程序的参数传递等问题 通过本节的学习 应能熟练地掌握子程序设计技术 独立地编写子程序 7 1子程序概述 子程序又称为过程 Procedure 在程序设计中 往往把多次重复出现 具有通用性 能够完成特定处理任务的程序段编写成独立的程序模块 这就是子程序 一般子程序具备如下几个特性 1 可重复性 2 可通用性 3 可浮动性 4 模块化调用子程序的程序称为主程序 或称调用程序 在主程序中 如果执行到调用子程序语句 就把控制转移到子程序 子程序执行完后 再把控制返回给主程序 主程序与子程序之间的调用关系如图7 1所示 图中主程序在K处和J处均调用子程序A 当主程序调用子程序后 CPU就转去执行子程序 执行完毕 则自动返回到主程序的断点处继续往下执行 断点是指转子指令的直接后继指令的地址 如在K处调用子程序A 断点就是DK 子程序A执行完后 返回到DK处继续向下执行 在设计子程序时 主要应解决如下几个问题 1 主程序是怎样调用子程序的 2 子程序执行完后 怎样才能返回到主程序的断点处继续向下执行 3 主程序与子程序之间用什么方式互相传递数据 4 如何编写子程序 下面分别讨论这些问题 7 2子程序调用与返回指令 为了实现主程序调用子程序以及子程序执行完后能返回主程序 在8086 8088指令系统中专门设置了子程序调用指令CALL和返回指令RET 1 子程序调用指令CALL 主程序调用子程序需要通过调用指令来实现 调用指令的基本功能是将子程序的返回地址 即CALL指令的下一条指令的地址 简称断点地址 包括段地址和偏移地址 压入堆栈 以便执行完子程序后能返回主程序 并从断点处继续往下执行 然后按照某种寻址方式转向子程序的入口地址去执行子程序 1 子程序调用指令CALL 主程序和子程序可以在同一个代码段中 也可以在不同的代码段中 前者称为段内调用 后者称为段间调用 不管是段内调用还是段间调用 若子程序入口地址直接出现在调用指令中 用子程序名表示 则为直接调用 若调用指令中出现的是存放子程序入口地址的寄存器名或存储单元的地址 则为间接调用 下面分别介绍各种调用格式 1 段内直接调用 指令格式 CALL过程名执行操作 SP SP 2 修改堆栈指针 SS SP IP IP入栈 保存16位返回地址 IP IP 16位偏移量 转向子程序入口即首先把子程序的返回地址 CALL指令的下一条指令地址 压入堆栈中 然后转移到子程序的入口地址 执行该子程序 16位偏移量是子程序入口地址与CALL指令的下一条指令地址之间的差值 例7 3 分析下列指令 CALLSUB1其中 SUB1为子程序名 假设该指令第一个字节的地址为2000H 1000H 段内直接调用指令为三字节 则其返回地址是2000H 1003H 再假设子程序SUB1的入口地址为2000H 3000H 则该指令执行后 堆栈 IP和CS的内容如图7 2所示 调用前 CS 2000H IP 1003H调用后 CS 2000H IP 3000H 2 段内间接调用 指令格式 CALLdest或CALLWORDPTRdest DEST为通用字寄存器或字存储单元 执行操作 SP SP 2 修改堆栈指针 SS SP IP IP入栈 IP dest 转向子程序入口该指令与段内直接调用类似 区别是将字寄存器或字存储单元内容作为子程序入口地址送入IP 例7 4 下面两条指令均是段内间接调用 CALLBXCALLWORDPTR BX 第一条指令的操作数为寄存器BX 即BX的内容作为子程序的入口偏移地址 第二条指令的操作数为字存储单元 寄存器BX所指的一个字存储单元中的内容作为子程序的入口偏移地址 3 段间直接调用 指令格式 CALLFARPTR过程名执行操作 SP SP 2 修改堆栈指针 SS SP CS CS入栈 SP SP 2 修改堆栈指针 SS SP IP IP入栈 IP 过程入口地址的偏移量 CS 过程入口地址的段地址该指令执行时先把返回地址的段地址压入堆栈 再把返回地址的偏移量压入堆栈 达到保存返回地址的目的 然后把过程入口地址的段地址和偏移量分别送入CS和IP 达到转移的目的 例7 5 分析如下调用指令 CALLFARPTRSUB2其中SUB2是子程序名 且过程SUB2与调用指令不在同一段中 假设该指令第一个字节的地址为2000H 0200H 段间直接调用指令为5字节 那么其返回地址为2000H 0205H 再假设子程序SUB2的入口地址为4000H 0100H 那么该指令执行后 堆栈 IP和CS的内容如图7 3所示 调用前 CS 2000H IP 0205H调用后 CS 4000H IP 0100H 4 段间间接调用 指令格式 CALLDWORDPTRdest dest为双字存储单元操作数 执行操作 SP SP 2 修改堆栈指针 SS SP CS CS入栈 SP SP 2 修改堆栈指针 SS SP IP IP入栈 IP dest的低地址值 CS dest的高地址值该指令的执行与段间直接调用类似 区别是根据寻址方式求出有效地址后 把指定存储单元的低字内容送到IP寄存器 高字内容送到CS寄存器 例7 6 下面指令都是段间间接调用 CALLDWORDPTR BX CALLDWORDPTRDST这两条指令的操作数均为双字存储单元类型 其中第一条指令由BX的内容指定数据段中的一个双字存储单元地址 第二条指令是由DST指定数据段中的一个双字存储单元地址 在连续的两个字单元中分别存放着子程序的入口偏移地址和入口段地址 以上几条调用指令在使用时应注意 宏汇编程序MASM能根据定义过程时所指定的过程类型决定采用段内直接调用还是段间直接调用 如果先调用后定义 为了调用远过程 必须在过程名前加类型说明符 FARPTR 调用近过程可以在过程名前加类型说明符 NEARPTR 或省略 对于间接调用 如果操作数是16位操作数 则汇编成段内间接调用 如果操作数是32位操作数 则汇编成段间间接调用 如果发生调用指令语句在前 有关变量定义伪指令在后的情况 则需要在调用语句中用PTR等操作符加以说明 2 子程序返回指令RET 子程序执行完后需要返回主程序 这个功能由子程序返回指令RET来实现 RET的功能是从堆栈的栈顶弹出返回地址 返回指令总是与调用指令配套使用 并且返回指令通常放在子程序的末尾 即出口处 使子程序执行完毕能够返回主程序 继续执行原来的程序 与调用指令相对应 返回指令也有段内返回和段间返回两种形式 段内返回是从栈顶弹出一个字数据送入IP 段间返回是从栈顶弹出两个字数据分别送入IP和CS 从而控制程序返回到主程序 1 段内返回指令 指令格式 RET执行操作 IP SS SP 栈顶内容送入IP SP SP 2 修改栈顶指针该指令弹出当前栈顶的一个字内容送入IP 作为偏移地址 段内返回指令用于子程序被定义成近过程时 2 段间返回指令 指令格式 RET执行操作 IP SS SP 栈顶内容送入IP SP SP 2 修改堆栈指针 CS SS SP 栈顶内容送入CS SP SP 2 修改堆栈指针该指令把当前栈顶的两个字内容依次送入IP和CS 分别作为偏移地址和段地址 段间返回指令用于子程序被定义为远过程时 3 带立即数的返回指令 指令格式 RETn n为立即数或数值表达式带立即数的返回指令又分为带立即数的段内返回和带立即数的段间返回两种形式 它们都是在完成基本返回指令的功能后 再执行 SP SP n操作 即修改堆栈指针 跳过堆栈中的一些已经无用的数据 n一般是偶数 例7 7 分析如下返回指令 RET4假设在执行该指令前 SP 0D253H若为段内返回 则执行该指令后 SP 0D253H 2H 4H 0D259H 若为段间返回 则执行该指令后 SP 0D253H 4H 4H 0D25BH 汇编程序MASM能根据RET指令所在过程的类型决定采用段内返回 还是段间返回 注 CALL指令和RET指令均不影响标志位 3 子程序定义格式 汇编语言中 子程序也叫过程 其定义格式为 子程序名PROC NEAR FAR 子程序名ENDP说明 子程序名是用户自定义的标识符 用以标识不同的过程 命名原则要遵从系统对标识符的定义规则 PROC与ENDP是子程序定义伪指令 NEAR或FAR是过程的类型说明符 NEAR类型的过程只允许段内调用 FAR类型的过程允许段间调用 过程的缺省类型为NEAR 7 3主程序与子程序的参数传递 主程序在调用子程序前 必须把需要子程序处理的原始数据传递给子程序 即为子程序准备入口参数 子程序根据入口参数进行一系列处理之后得到处理结果 该结果必须送给调用它的主程序 即提供出口参数以便主程序使用 这种主程序为子程序准备入口参数 子程序为主程序提供出口参数的过程称为参数传递 根据实际情况 子程序可以只有入口参数或只有出口参数 也可以入口参数和出口参数同时存在 常用的参数传递方式有三种 寄存器传递 存储单元传递和堆栈法传递 1 用寄存器传递参数 用寄存器传递参数就是将子程序的入口参数和出口参数都放在约定的寄存器中 此法的优点是信息传递快 编程也较方便 并且节省内存单元 缺点是但由于寄存器个数有限 而且在处理过程中要经常使用寄存器 如果要传递的参数很多 将导致无空闲寄存器供编程用 所以此法只适用于要传递的参数较少的情况 例7 8 设ARRAY是一个含有10个元素的数组 每个元素都是8位字节数据 试用子程序计算各数组元素的 累加和 注 为了简化程序设计 以下程序中的 累加和 是指不记进位的累加 分析 我们编写子程序来完成求数组元素的累加和 主程序需要向它提供入口参数 使得子程序能够访问数组元素 子程序需要将求和结果这个出口参数传给主程序 本例我们采用寄存器法实现参数的传递 寄存器和存储单元分配如下 BX 用来存放数组首地址 CX 用来存放数组元素个数 AL 用来存放数组元素累加和 RESULT 用来最终存放数组元素累加和的存储单元 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTARRAYDB12H 36H 48H 5 17H 29H 8 26H 59H 35HCOUNT 10RESULTDB 存放累加和DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXMOVBX OFFSETARRAY BX 数组的偏移地址MOVCX COUNT CX 数组元素个数CALLPROC SUM 调用求和子程序MOVRESULT AL RESULT AL MOVAH 4CHINT21H 子程序名 PROC SUM 功能 计算数组元素的累加和PROC SUMPROCXORAL AL 累加器清0SUM ADDAL BX 求和INCBX 指向下一字节LOOPSUM CX 0转SUM继续求和RETPROC SUMENDPCODEENDSENDBEGIN 本程序中 用BX CX寄存器作为入口参数 分别将主程序中数组的偏移地址和数组元素的个数传递给子程序 在子程序中用AL寄存器作为出口参数 将求得的数组元素的累加和返回给主程序 本程序运行完后 在RESULT存储单元中存放的数组元素累加和是91H 2 通过存储单元传递参数 用存储单元传递参数就是将入口参数和出口参数都放到事先约定好的存储单元之中 此法的优点是参数传递的数量不受限制 每个参数都有独立的存储单元 编写程序时不易出错 缺点是要占用一定数量的存储单元 例7 9 要求同上 现在用存储单元传递参数 计算数组元素的累加和 分析 采用存储单元传递参数 例中主程序和子程序共用ARRAY和RESULT两个存储单元 主程序只要设置好数据段DS 就可以调用子程序了 子程序直接通过存储单元存取数组元素 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTARRAYDB12H 36H 48H 5 17H 29H 8 26H 59H 35HCOUNT 10RESULTDB DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXCALLPROC SUM 调用求和子程序MOVAH 4CHINT21H 子程序名 PROC SUM 功能 计算数组元素的累加和PROC SUMPROCXORAL AL 累加器清0MOVBX OFFSETARRAYMOVCX COUNTSUM ADDAL BX INCBXLOOPSUM CX 0转SUM继续求和MOVRESULT AL 累加和送RESULT保存RETPROC SUMENDPCODEENDSENDBEGIN 主程序和子程序的参数传递读者可自己分析 程序运行后 在RESULT存储单元中存放的累加和是91H 3 通过堆栈传递参数 该方法是利用堆栈作为主程序和子程序之间传递参数的工具 优点是参数不占用寄存器 也无需另开辟存储单元 将参数存放在公用的堆栈区 处理完之后堆栈恢复原状 不影响其他程序段使用堆栈 缺点是由于参数和子程序的返回地址混杂在一起 访问参数时必须准确地计算它们在堆栈内的位置 如果操作不慎 在执行RET指令时 栈顶存放的可能不是返回地址 从而导致运行混乱 由此可见 使用该方法编制程序比较复杂 例7 10 要求同上 现在用堆栈传递参数 计算数组元素的累加和 分析 通过堆栈传递参数 主程序将数组的偏移地址和数组元素个数压入堆栈 然后调用子程序 子程序通过BP寄存器从堆栈相应位置取出参数 非栈顶数据 求和后用AL返回结果 例中用堆栈传递入口参数 但出口参数仍利用寄存器传递 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTARRAYDB12H 36H 48H 5 17H 29H 8 26H 59H 35HCOUNT 10RESULTDB DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXMOVAX OFFSETARRAYPUSHAX 数组的偏移地址进栈MOVAX COUNTPUSHAX 数组元素个数进栈CALLPROC SUM 调用求和子程序MOVRESULT AL 保存数组元素累加和MOVAH 4CHINT21H PROC SUMPROCPUSHBP 保护BPMOVBP SP BP指向当前栈顶 用于取入口参数MOVBX BP 6 BX 数组的偏移地址MOVCX BP 4 CX 数组的元素个数XORAL AL 累加器清0SUM ADDAL BX 求和INCBXLOOPSUMPOPBPRET4PROC SUMENDPCODEENDSENDBEGIN 程序中多次用到了PUSH POP指令 读者可自己分析堆栈的变化情况 本程序运行后 在RESULT存储单元中存放的累加和是91H 以上介绍了三种常用的参数传递方式 实际应用中到底采用哪一种 要根据具体情况而定 有时是几种方式混合使用 不管采用什么方式 主程序与子程序的配合一定要默契 7 4子程序设计方法 子程序是供主程序调用的 为了便于分工合作 使不同的程序员在不需要了解子程序的内部结构及其算法的情况下 就能方便地调用子程序 一个完整的子程序应当包括以下几部分内容 子程序调用方法说明 保护现场和恢复现场 子程序定义 参数传递方法 1 子程序调用方法说明 为了使子程序便于阅读 便于维护和使用 一般应提供子程序调用方法说明 主要包括 子程序名 子程序功能 寄存器与存储单元分配 入口参数 出口参数 子程序调用示例等 以注释的形式出现在子程序清单中 2 保护现场和恢复现场 保护现场和恢复现场是子程序设计时必须考虑的问题 子程序中需要使用的寄存器 有可能在调用子程序前主程序正在使用 其值在从子程序返回主程序后还要继续使用 因此子程序执行前要保护现场 返回时要恢复现场 否则会破坏现场数据 保护现场和恢复现场的工作可以在主程序中完成 也可以在子程序中完成 一般情况下 是在子程序的开始安排一串保护现场的语句 在子程序的返回指令前再恢复现场 这样处理 主程序在转子程序前不必考虑保护现场 恢复现场的工作 其处理流程显得非常清晰 保护现场和恢复现场的最简洁方法是利用堆栈指令 保护时将寄存器内容及状态标志寄存器的内容压入堆栈 恢复时再从堆栈中弹出 例如 若子程序SUB1中改变了AX BX CX DX四个寄存器的内容 则可以用如下方法实现保护现场和恢复现场的工作 SUB1PROCPUSHAX 以下4条指令用于保护现场PUSHBXPUSHCXPUSHDX 子程序处理部分POPDX 以下4条指令用于恢复现场POPCXPOPBXPOPAXRETSUB1ENDP注意 恢复现场时寄存器出现的顺序应与保护现场时寄存器出现的顺序相反 即依照 后进先出 的原则从堆栈中弹出信息 下面我们通过具体例子来说明子程序的设计方法 例7 11 编写一个求两个正整数最大公约数的子程序 分析 求两个数的最大公约数可以采用辗转相除法 具体算法如下 取两个正整数M和N 用M除以N 求得余数R 0 R N 若R 0 则N的当前值即为求得的最大公约数 算法结束 否则 更新M和N的值 即将N M R N 转 继续求解 子程序清单 子程序名 GCD 功能 求两个正整数的最大公约数 入口参数 AX BX 用来分别存放两个正整数 出口参数 CX 用来存放求得的最大公约数 GCDPROCPUSHAXPUSHBX 保护现场PUSHDXAGAIN XORDX DX DX清0 扩充被除数DIVBX 商存入AX 余数存入DXANDDX DX 判断余数是否为0JZEXIT 余数为0转EXITMOVAX BX 否则 更新被除数MOVBX DX 更新除数JMPAGAIN 继续辗转相除EXIT MOVCX BX 最大公约数存入CXPOPDXPOPBX 恢复现场POPAXRET 子程序返回GCDENDP 例7 12 假设在A B C D四个字单元中各存放一个正整数 试编写程序分别求出A与B的最大公约数M C与D的最大公约数N 再求出M与N之和 将结果存入RESULT字单元中 分析 本程序需两次调用求最大公约数子程序 将两次返回结果求和再存入RESULT字单元中 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTADW720BDW81CDW1150DDW125RESULTDW DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXMOVAX AMOVBX BCALLGCD 调用子程序 求A B的最大公约数MOVRESULT CX 结果存入RESULT单元MOVAX CMOVBX DCALLGCD 调用子程序 求C D的最大公约数ADDRESULT CX 将结果加到RESULT单元MOVAH 4CH 返回INT21H 求最大公约数子程序GCDPROCPUSHAXPUSHBXPUSHDXAGAIN XORDX DX DX清0 扩充被除数DIVBX 商存入AX 余数存入DXANDDX DX 判断余数是否为0JZEXIT 余数为0转EXITMOVAX BX 否则 更新被除数MOVBX DX 更新除数JMPAGAIN 继续辗转相除EXIT MOVCX BX 最大公约数存入CXPOPDXPOPBX 恢复现场POPAXRETGCDENDPCODEENDSENDBEGIN 本程序运行时 第一次调用求最大公约数子程序GCD 求出720和81的最大公约数为9 送入RESULT字单元中 第二次调用求最大公约数子程序GCD 求出1150和125的最大公约数为25 然后将9和25的和34送入RESULT字单元中 所以最终在RESULT字单元中存放22H 同学们可以自己调整A B C D的值 分析程序的执行过程 例7 13 十进制到十六进制数转换程序 要求从键盘输入一个无符号十进制数 然后将该数以十六进制形式在屏幕上显示出来 例如 输入32 输出20H 输入100 输出64H 输入1248 输出4E0H 分析 我们采用子程序结构 用一个子程序DECTOBIN实现从键盘输入十进制数 并把它转换为二进制数 另一个子程序BINTOHEX将二进制数以十六进制数的形式在屏幕上显示出来 另外为显示清晰 用RETURN子程序达到回车换行效果 整个程序流程如图7 4所示 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTMSGDB0DH 0AH PLEASEINPUT BUF1DB6DB DB6DUP 0 BUF2DB6DUP 0 DATDW10DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXREPEAT LEADX MSGMOVAH 9INT21HCALLDECTOBIN 调用键盘输入子程序CALLRETURN 调用回车换行子程序CMPBX 1JZEXCALLBINTOHEX 调用转换显示子程序CALLRETURNEX MOVAH 4CHINT21H 子程序DECTOBIN 功能 接收从键盘输入的十进制数 并将其转换为二进制数存放在BX寄存器中 无入口参数 出口参数为BX寄存器 DECTOBINPROCMOVBX 0 BX清0INPUT LEADX BUF1 键盘接收十进制数输入 送入以BUF1 2为首址的字节存储区中MOVAH 10INT21HLEASI BUF1 2 SI指向BUF1字节存储区MOVCL BUF1 1 CL保存输入十进制数的位数MOVAX 0NEXT MOVBL SI CMPBL 30HJBEXIT 若不在0 9之间 则退出CMPBL 39HJAEXITSUBBL 30HMOVBH 0MULDATJOEXITADDAX BXJCEXITINCSIDECCLJNENEXTMOVBX AX 将数据最终放在BX寄存器中JMPEXIT1EXIT MOVBX 1EXIT1 RETDECTOBINENDP 子程序BINTOHEX 功能 将BX寄存器中的二进制数转换为十六进制数并显示出来 入口参数 BX寄存器 无出口参数 BINTOHEXPROCLEADI BUF2MOVCH 4 CH 转换次数4AGAIN MOVCL 4 每次转换四位ROLBX CLMOVAL BLANDAL 0FH 将十六进制数转换为ASCII码 若不在 0 9 之间 则加07H调整 否则直接转OUTPUTADDAL 30HCMPAL 3AHJLOUTPUTADDAL 7HOUTPUT MOV DI AL 将转换后的字符存入BUF2存储单元中INCDIDECCHJNZAGAINMOV DI BYTEPTR H MOV DI 1 BYTEPTR LEADX BUF2MOVAH 9INT21HRETBINTOHEXENDP RETURN子程序 用来输出回车换行 RETURNPROCMOVAH 2MOVDL 0AHINT21HMOVDL 0DHINT21H 输出回车换行RETURNENDPCODEENDSENDBEGIN 7 5子程序的嵌套 主程序可以调用子程序 子程序还可以再去调用另一个子程序 这种情况称为子程序的嵌套 子程序嵌套的层数没有限制 只要堆栈空间允许即可 嵌套子程序的设计与调用方法与前面介绍的子程序设计与调用方法一致 要特别注意以下几点 1 调用指令CALL与返回指令RET必须成对使用 2 用寄存器传递参数或作为工作单元时 要及时保存和恢复寄存器内容 3 若程序中用到堆栈 要注意堆栈的正确操作方法 下面我们来看一个例子 例7 14 假设在BUF1开始的存储区中放有若干个无符号字节数据 试编写程序 找出其中的最大值 并以十六进制的形式在屏幕上显示出来 分析 本程序用子程序嵌套方法来实现 子程序MX DISP用来求若干个无符号字节数的最大值 并调用DISPLAY子程序进行显示 子程序DISPLAY用来以十六进制的形式在屏幕上输出字符 源程序如下 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTBUF1DB24 12 53 84 36 120 58N BUF1DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKBEGIN MOVAX DATAMOVDS AXMOVCX N 1LEASI BUF1CALLMX DISPMOVAH 4CHINT21H 子程序MX DISP 功能 用来求若干个无符号字节数的最大值 并调用DISPLAY子程序进行输出 入口参数 SI寄存器 指向存放无符号字节数的存储区 CX寄存器 存放进行比较的次数 取值为N 1 出口参数 DL寄存器 存放要显示的字符 MX DISPPROCMOVBL SI NEXT1 INCSICMPBL SI JAENEXT2MOVBL SI NEXT2 DECCXJNZNEXT1MOVCL 4MOVDL BLSHRDL CLCALLDISPLAYMOVDL BLANDDL 0FHCALLDISPLAYMOVDL H MOVAH 2INT21HRETMX DISPENDP 子程序DISPLAY 功能 用来以十六进制的形式在屏幕上输出字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铁路局机务考试题及答案
- 2025年广西壮族自治区纪委监委公开遴选公务员笔试试题及答案解析
- 山西联合体考试题及答案
- 农业科研技术合作开发合同书
- 技士证考试题库及答案
- 鞍山中考模拟考试题及答案
- 岳阳二中考试题目及答案
- 信阳九中分班考试试卷及答案
- 日本驾考笔试题库及答案
- 人事管理人员笔试试题及答案
- 2025年旋挖钻司机操作安全教育培训试题试卷及答案
- 红领巾知识竞赛题库及答案
- 2025至2030中国铷/铯及其化合物行业项目调研及市场前景预测评估报告
- 国库账户管理办法
- 工装租借管理办法
- 常务理事管理办法
- DG-TJ08-2144-2025 公路养护工程质量检验评定标准
- 酒店消防检修维护方案
- 英文财务培训课件模板
- 专题07概率统计之以期望为依据的决策问题(原卷版)
- JG/T 296-2010空气吹淋室
评论
0/150
提交评论