




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、x dw 110,120,130,140,150,160,170,180,190,200 y dw ? . .MOV AX, X MOV BX, OFFSET X MOV CX, 9 L1: INC BX INC BX CMP AX , BX JAE L2 XCHG AX, BX L2: LOOP L1 MOV Y,AX此程序段完成什么功能复习16.4.2 多重循环程序设计【例6.5】在以BUF为首址的字存储区中存放N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。 采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个
2、数交换位置,则第一遍比较后最小值排到最后.2冒泡法的排序过程序号 数比 较 遍 数1234 1 32 2 85 3 16 4 15 5 83216158851615832851581632858151632853程序如下:DATASEGMENTBUFDW 32,85,16,15,8DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA4START:MOVAX,DATAMOVDS,AXMOVCX,5 ;元素个数DECCX ;比较遍数LOOP1:MOV DX,CX ;保存外循环的循环次数也可以做内循环计数(比较次数)MOV BX,0LOOP2: MOV AX,BUFBX
3、 ;相邻两数比较 CMP AX,BUFBX+2JGE LXCHG AX,BUFBX+2;大数放AXMOV BUFBX,AX ;并将大数送相应单元5L:ADDBX,2 ;进下一个单元,准备取下一个数 Loop loop2 MOVCX,DX ;恢复外循环次数 LOOPLOOP1 MOVAH,4CH INT21HCODEENDSENDSTART思考:外循环次数还可用什么指令处理?6上机: 编写打印如下图形程序(yhsj)01 02 1 03 2 1 04 3 2 1 05 4 3 2 1 06 5 4 3 2 1 07 6 5 4 3 2 1 08 7 6 5 4 3 2 1 09 8 7 6 5
4、4 3 2 1 07其中过程名就是子程序名,它也表示子程序入口的符号地址。 属型可以是NEAR型(缺省值)或FAR型。 NEAR型子程序只可以被段内调用, FAR型子程序可以被段间或段内调用。10(1). 调用指令: 格式: CALL PROC_NAME 功能: 把断点地址(主程序中下一条指令地址)压入堆栈进行保护,无条件转到目标地址执行子程序。(2). 返回指令: 格式 : RET N 功能: 从栈顶弹出返回地址送IP,并返回到主程序中去继续执行。dos演示call演示ret演示111调用程序和子程序在同一个代码段的程序结构CODE SEGMENTCALLSUB1SUB1PROCnearRE
5、TSUB1ENDP CODEENDS12 密切注意堆栈状态注意一切与堆栈有关的操作。 例如:CALL调用类型和子程序定义类型的一致性。 PUSH和POP指令的匹配。 通过堆栈传递参数时子程序返回使用RET n指令等。 确保堆栈平衡,否则后果不可预料。16data segmentstring1 db how dow you do!,0dh,0ah,$data endscode segment assumestart:mov ax,data mov ds,ax lop1: mov dx,offset string1 mov ah,4ch int 21hdsp proc near dsp endpC
6、ode ends end start 填空177.5 子程序的参数传递1. 寄存器传递参数。 最常用, 用寄存器作为入口参数或出口参数。 适用传递少量参数.(howdoyou.asm)2. 通过地址表(存储器)传递参数地址。 安排数据区时,必须留出传递参数的位置。 适用传递大量参数.3. 堆栈传递参数或参数地址。 将参数入栈,子程序从堆栈中取数据. 适用参数多,子程序嵌套及递归.18(四) 举例说明 子程序参数传递19DEC_DIVPROC;CX中为十进制的位权MOV AX,BXMOV DX,0 DIV CX;商为转换后的一位十进制数MOV BX,DX ;余数MOV DL,AL ;商 ADD
7、DL,30H;转换成ASCII码 MOV AH,2;显示INT 21H RETDEC_DIVENDPCODE ENDS END MAIN23 mov bx, 0newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 9 jg exit cbw xchg ax, bx mov cx, 10 mul cx xchg ax, bx add bx, ax jmp newchar复习:此程序段完成的功能是什么?24 BX1234把BX中数以十六进制数形式显示(如007DH)0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 10 0 0 0
8、0 1 1 1 1 1 0 1 0 0 0 025 mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh ; 09 ASCII 30H39H cmp al, 3ah ;是否大于9 jl printit ; AF ASCII 41H46Hprintit: add al, 30hadd al, 7hmov dl, almov ah, 2int 21hdec chjnz rotate把BX中数以十六进制数形式显示,程序段填空26例7.3 把从键盘接收的十进制数以十六进行形式输出到屏幕上。开始调用DECIBIN调用CRLF调用BINI
9、HEX调用CRLF结束从键盘取得十进制数,保存在BX中用十六进制形式显示BX中的数27CODE SEGMENTASSUME CS:CODESTART: CALL DECIBIN CALL CRLF CALL BINIHEX CALL CRLF JMP START MOV AH, 4CH INT 21H 28DECIBIN PROC NEAR mov bx, 0newchar: mov ah, 1 ;键盘输入 int 21h sub al, 30h jl exit ; 9退出 cbw xchg ax, bx mov cx, 10 mul cx xchg ax, bx add bx, ax jmp
10、 newcharexit: RETDECIBIN ENDP 1 2 531 32 35( ( 010)+1 )10+2 )10+529 BX1234把BX中数以十六进制数形式显示(如007DH)0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 10 0 0 0 0 1 1 1 1 1 0 1 0 0 0 030BINIHEX PROC NEAR mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh ; 09 ASCII 30H39H cmp al, 3ah ;是否大于9 jl printit ; AF ASCII 4
11、1H46Hprintit: RETBINIHEX ENDPadd al, 30hadd al, 7hmov dl, almov ah, 2int 21hdec chjnz rotate31TEST VAR ,55HJZ ZERO.ZERO: 上述程序段中,当VAR的内容为何值时,执行JZ ZERO条件转移指令后,可满足条件转到ZERO处( )?。A) (VAR)=0FFH B) (VAR)=55H VAR中第0,2,4,6位为0 VAR中第1,3,5,7位为0 342若调用程序和子程序在同模块中,子程序可以直接访问模块中的变量例2实现数组求和功能。要求数组求和(不考虑溢出情况)由子程序实现,其
12、数组元素及结果均为字型数据。见程序。35DATA SEGMENTARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW 10;数组元素个数SUM DW ?; 和的地址DATA ENDS程序7.436CODE SEGMENT ASSUME CS:CODE,DS:DATAStart: MOV AX,DATA MOV DS,AX CALL ARY_SUM MOV AH,4CH INT 21H 37ARY_SUM PROC ;数组求和子程序 PUSH AX;保存寄存器 PUSH CX PUSH SI LEA SI,ARY;取数组起始地址 MOV CX,COUNT;取元素个数 XOR A
13、X,AX;清0累加器38NEXT: MOV SUM,AX;存和 RET ARY_SUM ENDPCODE ENDS END START ADD AX, SI;累加和 ADD SI, TYPE ARY;修改地址指针 LOOP NEXT POP SI;恢复寄存器 POP CX POP AX393通过地址表传递参数地址适用于参数较多的情况。 具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址通过寄存器或堆栈传递给子程序。40例7-5 编写一个数组求和的子程序,其数组元素及结果均为字型数据。 另定义两个数组,并编写一个主程序,通过调用数组求和子程序分别求出两个数组的和。41分析:虽然主、
14、子程序在同模块中,但由于在一个程序中要分别求出两个数组的和,因此子程序不能直接引用数组变量名。 本例用数组首地址、元素个数的地址、和的地址构成地址表,通过地址表传送这些参数的地址,以便子程序能够访问到所需参数。见程序7.5。42程序7.5STACKSG SEGMENT DW 32 DUP(?)STACKSG ENDSDATA SEGMENTARY1 DW 1,2,3,4,5,6,7,8,9,10;数组1CT1 DW ($-ARY1)/2;数组1的元素个数SUM1 DW ?;数组1的和地址ARY2 DW 10,20,30,40,50;数组2CT2 DW ($-ARY2)/2;数组2的元素个数su
15、m2 DW ?;数组2的和地址TABLE DW 3 DUP(?);地址表DATA ENDS43CODE1SEGMENTASSUME CS:CODE1,DS:DATA,SS: STACKSG START: MOV AX,DATA MOV DS,AX ;构造数组1的地址表 MOV TABLE,OFFSET ARY1 MOV TABLE+2,OFFSET CT1 MOV TABLE+4,OFFSET SUM1 LEA BX,TABLE;传递地址表首地址 CALL FAR PTR ARY_SUM ;段间调用调用数组求和子程序44;构造数组2的地址表 MOV TABLE,OFFSET ARY21 MOV
16、 TABLE+2,OFFSET CT2 MOV TABLE+4,OFFSET SUM2 LEA BX,TABLE;传递地址表的首地址 CALL FAR PTR ARY_SUMMOV AH,4CH INT 21HCODE1 ENDS45CODE2 SEGMENT ASSUME CS:CODE2ARY_SUM PROC FAR;数组求和子程序 PUSH AX;保存寄存器 PUSH CX PUSH SI PUSH DI MOV SI,BX;取数组起始地址 MOV CX,BX+2;取元素个数地址 MOV DI,BX+4;取结果地址 XOR AX,AX;清0累加器 mov bx,cx mov cx,bx
17、46NEXT: ADD AX,SI;累加和 ADD SI,TYPE ARY;修改地址指针 LOOP NEXT MOV DI,AX;存和 POP DI;恢复寄存器 POP SI POP CX POP AX RET ARY_SUM ENDPCODE2 ENDS END START474通过堆栈传递参数或参数地址这种方式适用于参数较多,或子程序有多层嵌套、递归调用的情况。步骤:主程序把参数或参数地址压入堆栈;子程序使用堆栈中的参数或通过栈中参数地址取到参数;子程序返回时,使用RET n指令调整SP指针,以便删除堆栈中已用过的参数,保持堆栈平衡,保证程序的正确返回。48例6完成数组求和功能,求和由子程
18、序实现,要求通过堆栈传递参数地址。STACK SEGMENT DW 16 DUP(?) TOS LABLE WORDSTACK ENDSDATA SEGMENTARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW ($-ARY)/2SUM DW ?DATA ENDS49CODE1 SEGMENTMAIN PROC FAR ASSUME CS:CODE1,DS:DATA,SS:STACK MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOS PUSH DS; XOR AX,AX PUSH AX; MOV AX,DATA MOV DS,AX50LEA
19、BX,ARY PUSH BX;压入数组起始地址 LEA BX,COUNT PUSH BX;压入元素个数地址 LEA BX,SUM PUSH BX;压入和地址 CALL FAR PTR ARY_SUM;调用求和子程序(压入cs 和IP) RET;MAIN ENDPCODE1 ENDS51CODE2 SEGMENT ASSUME CS:CODE2ARY_SUM PROC FAR;数组求和子程序 PUSH BP;保存BP值 MOV BP,SP;BP是堆栈数据的地址指针 PUSH AX;保存寄存器内容 PUSH CX; PUSH SI; PUSH DI; MOV SI,BP+10;得到数组起始地址 M
20、OV DI,BP+8;得到元素个数地址 MOV CX,DI;得到元素个数 MOV DI,BP+6;得到和地址 XOR AX,AX52NEXT: ADD AX,SI;累加 ADD SI,TYPE ARY;修改地址指针 LOOP NEXT MOV DI,AX;存和 POP DI;恢复寄存器内容 POP SI; POP CX; POP AX; POP BP; RET 6;返回并调整SP指针ARY_SUM ENDPCODE2 ENDS END MAIN53本例通过BP访问堆栈中的参数。程序的堆栈变化情况参见图7-1,指示了程序中所有入栈操作对堆栈的影响随入栈数据的增加,SP的值不断减小,堆栈可用空间也
21、随之减少。图7-2为已从子程序返回、而主程序RET指令执行前的堆栈状态,其中的灰色部分表示执行语句时已弹出的数据。54子程序中语句RET 6指令,在从堆栈弹出返回地址后还要使SP值加6,这样就跳过了通过堆栈传递的三个参数,或者说删除了它们。 因此,当主程序的语句RET指令被执行时,程序控制从栈顶弹出数字0给IP,弹出PSP的段基址给CS,于是执行PSP:0处的INT 20H指令,正确返回操作系统。55返回语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆栈状态语句执行后堆
22、栈状态图7-1 程序7.6中所有入栈操作对堆栈的影响SSSPBPDI值SI值CX值AX值BP值IP值CS值SUM的地址COUNT地址ARY首地址0PSP段基址56返回SP语句执行后堆栈状态图7-2 程序7.6中主程序的RET执行前堆栈状态SSDI值SI值CX值AX值BP值IP值CS值SUM的地址COUNT地址ARY首地址0PSP段基址57* 从以上分析可以看出: 通过堆栈传递参数时子程序的返回指令必须是RET N形式,当堆栈操作是16位时N值应该是压入堆栈的参数个数的2倍,只有这样保证程序的正常运行。58例5完成数组求和功能,其中求和由子程序实现,要求使用结构访问堆栈中的参数。(此例仅供参考)
23、图7-3给出了堆栈及结构数据定义。注意这些结构字段的顺序为其值压入的逆序。实际上,它只是给图7-1中由主程序压入的数据、返回地址及子程序压入的BP值起了个名字而已,而字段值的预置是通过PUSH和CALL指令实现的。当子程序用到堆栈中的参数时,只需使用BP作为基地址、通过结构字段名访问就可以了。编码见程序7.7。59返回SSSPBPDI值堆栈数据SI值结构字段名CX值AX值BP值SAVE_BPIP值SAVE_CS_IPCS值SUM的地址SUM_ADDRCOUNT地址COUNT_ADDRARY首地址ARY_ADDR0PSP段基址图7-3 程序7.7的堆栈及结构数据示意图结构60程序7.7STACK
24、SG SEGMENT STACK STK DW 16 DUP(S)STACKSG ENDSDATA SEGMENTARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW ($-ARY)/2SUM DW ?DATA ENDS61CODE1 SEGMENTMAIN PROC FAR ASSUME CS:CODE1,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX62LEA BX,ARY PUSH BX;压入数组起始地址 LEA BX,COUNT PUSH BX;压入元素个数地址 LEA BX,SUM PUSH BX;压入
25、和地址 CALL FAR PTR ARY_SUMRETMAIN ENDPCODE1 ENDS63CODE2 SEGMENT ASSUME CS:CODE2STACK_STRC STRUC;定义结构SAVE_BP DW ?SAVE_CS_IP DW 2 DUP(?)SUM_ADDR DW ?COUNT_ADDR DW ?ARY_ADDR DW ?STACK_STRC ENDS64ARY_SUMPROC FAR;数组求和子程序 PUSH BP;保存BP值 MOV BP,SPPUSH AX PUSH CX PUSH SI PUSH DI MOV SI,BP.ARY_ADDR;数组始地址 MOV DI
26、,BP.COUNT_ADDR MOV CX,DI MOV DI,BP.SUM_ADDR;得到和地址 XOR AX,AX65NEXT: ADD AX,SI;累加 ADD SI,TYPE ARY;修改地址指针 LOOP NEXT MOV DI,AX;存和 POP DI POP SI POP CX POP AX POP BP RET 6;返回并调整SP指针ARY_SUM ENDPCODE2 ENDS END MAIN66例6编写两个四位无符号十进制数乘法程序。要求:乘数从键盘输入;二进制乘;用十进制数形式显示乘积。1分析:由于题目要求从外设输入输出数据,而在内存中用二进制数形式实现乘法,所以涉及到代
27、码转换问题。步骤如下:从键盘输入两个十进制乘数(ASCII码)分别转换成二进制形式二进制数乘把二进制乘积转换成十进制数的ASCII码形式输出到屏幕。672设计:本例中的输入、输出、十进制到二进制的转换、二进制到十进制的转换均采用子程序形式实现。* 十二转换算法:Y=Y*10+Xi (Y的初始值为0,i =n,n-1,0)ASC_BIN是实现四位十进制数转换成二进制数的子程序。程序中Y值在AX中,i值由CL控制。68* 二十转换算法: 除10取余法。即用32位的二进制乘积(高16位在RSLTHI中、低16位在RSLTLO中)作为被除数,10作为除数,每次除后所得到的余数就是本位的十进制数,并把它
28、转换成ASCII码存放在输出缓冲区的相应位置,直到整个转换结束,最后输出。69BIN_ASC是实现32位二进制数转换成十进制数的子程序。考虑到32位的被除数除以10很容易产生超过16位的商,从而产生除法错中断无法得到正确结果,因此需要采用一种避免产生除法错中断的技术。本例采用的方法是把32位被除数扩展成48位,其中最高16位为0,然后进行除法运算。示意图如下:全0703编码(程序7.8)CR EQU 0DHLF EQU 0AHSTACKSG SEGMENT STACK S DW 64 DUP(ST)STACKSGENDS71DATA SEGMENTPROMPT1 DBCR,LF,INPUTNU
29、M1:$PROMPT2 DBCR,LF,INPUTNUM2:$ ASCIN1 DB5 , ? , 5DUP(?)ASCIN2 DB5 , ? , 5DUP(?)BIN1 DW?;乘数1二进制值BIN2 DW?;乘数2二进制值RSLTHI DW0;32位二进制乘积的高16位RSLTLO DW0;32位二进制乘积的低16位ASCOUT0 DBCR,LF,RESULT:ASC_OUT DB10DUP(0),$DATA ENDS72CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FAR MOV AX,DATA MOV DS,AX LEA D
30、X,PROMPT1 CALL DISP LEA DX,ASCIN1 CALL INPUT;输入乘数1LEA DX,PROMPT2 CALL DISP LEA DX,ASCIN2 CALL INPUT;输入乘数273LEA SI,ASCIN1+1;建立乘数1缓冲区的地址指针CALL ASC_BIN;把乘数1转换成二进制数MOV BIN1,AX;存乘数1的二进制值LEA SI,ASCIN2+1;建立乘数2缓冲区的地址指针CALL ASC_BIN;把乘数2转换成二进制数MOV BIN2,AX;存乘数2的二进制值MOV AX,BIN1MUL BIN2;乘数1*乘数2,结果为32位二进制数74MOV R
31、SLTLO,AX ;保存结果的高16位MOV RSLTHI,DX ;保存结果的低16位CALL BIN_ASC ;调用32位二进制数转换成十进制数子程序LEA DX,ASCOUT0CALL DISP ;显示十进制乘积MOV AX,4C00HINT 21HMAINENDP75DISP PROC;显示字符串子程序 MOV AH,9 INT 21H RETDISP ENDPINPUT PROC;输入字符串子程序 MOV AH,0AH INT 21H RETINPUT ENDP76ASC_BIN PROC;十进制数转换成16位二进制数子程序;SI指向十进制数缓冲区,其中第一个字节存放要转;换的十进制位
32、数,从第二个字节开始存放着十进制;数的ASCII码。AX中存放转换结果。 XOR AX,AX MOV CL,SI XOR CH,CH INC SI JCXZ M277M1: MOV BX,10 MUL BX MOV BL,SI;得到一位十进制数的ASCII码 INC SI ;修改地址指针 AND BX,0FH;把十进制数的ASCII码转换成十进制数 ADD AX,BXLOOP M1 M2: RETASC_BIN ENDP78BIN_ASC PROC;32位二进制数转换成十进制数子程序 LEA DI,ASC_OUT+9;DI指向十进制数串的个位 MOV BX,10C0: MOV DX,0 MOV
33、 AX,RSLTHI CMP AX,0 JE C179DIV BX MOV RSLTHI,AXMOV AX,RSLTLO DIV BX MOV RSLTLO,AX OR DL,30H MOV DI,DL DEC DI JMP SHORT C080C1: MOV AX,RSLTLOC2: CMP AX,0 JZ C3 MOV DX,0 DIV BX OR DL,30H MOV DI,DL DEC DI JMP SHORT C2C3: RETBIN_ASC ENDPCODE ENDS END MAIN81以上程序是运行在16位操作数模式的情况,但它的算法思想对更多位操作数也适用。对运行环境是32位
34、操作数模式的BIN_ASC子程序见教材。827.6 嵌套与递归子程序一、子程序嵌套在汇编语言中,允许子程序作为调用程序去调用另一子程序,把这种关系称为子程序嵌套。 图7-5为子程序嵌套示意图。嵌套的层数没什么限制,其层数称为嵌套深度。83主程序SUB1SUB2CALL SUB1CALL SUB2RETRETRET图7-5 子程序嵌套示意图返回84由于子程序嵌套对堆栈的使用很频繁,因此还要确保堆栈有足够空间,并要注意堆栈的正确状态,这包括CALL、RET、RET N、PUSH、POP、INT、IRET等与堆栈操作有关指令的正确使用。 总之,在子程序嵌套中使用堆栈更要小心,以免由于堆栈使用不当而导
35、致程序不能正常运行的情况发生。85二、递归子程序在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。 显然递归调用是子程序嵌套的一种特殊情况。使用递归算法往往能设计出效率较高的程序。86 递归调用最简单例子是计算阶乘。 求N!本身是一个子程序,由于N!是N和(N1)!的乘积,所以为求(N1)!必须递归调用求N!的子程序,只是每次调用所使用的参数不同而已。 以下是求N!递归过程的描述。87【例jiech.asm】试编制计算N! (N0)的程序。N!=N*(N-1)*(N-2)*1其递归定义如下: 0!=1 N!=N*(N-1)! (N1) 计算N!的子程序FACT的流程图如图所示。88流程图893!的程序示例, RESULT是保存阶乘的存储单元。程序如下:STACKSEGMENT STACK DB 200 DUP(0)STAC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村屋子交易合同样本
- 中介佣金合同样本简约样本
- 个人电机转让合同样本
- 【高三】【下学期期中】(高考前的“加速度”)家长会逐字稿
- 公司注销合同样本
- 出租房屋协议合同标准文本
- 乙方工地材料合同样本
- 养鸭子合同样本
- 买卖沙居间合同标准文本
- 提升企业员工忠诚度的工作思路计划
- 统编版小学语文五年级下册第二单元快乐读书吧整本书阅读课《西游记》课件
- 项目二 物流基本功能活动管理
- 融资借款合同协议书范本(2024版)
- 2024年湖南省高中学业水平合格性考试英语试卷真题(含答案详解)
- 铝型材质检规程
- 智能云服务交付工程师认证考试题库(网大版)-中(多选题)
- 旅游景区运营委托经营协议书
- 采矿学课程设计-潘三煤矿1
- 第9课第一框课件《相伴相助融洽相处》-【中职专用】中职思想政治《心理健康与职业生涯》(高教版2023·基础模块)
- 2024年4月自考04184线性代数(经管类)答案及评分参考
- MOOC 空中机器人-浙江大学 中国大学慕课答案
评论
0/150
提交评论