




已阅读5页,还剩124页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章子程序与宏指令设计,为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或宏指令的形式。,6.1子程序结构及设计方法6.2子程序参数传递6.3嵌套与递归子程序6.4宏指令6.5宏指令库6.6重复伪指令6.7条件伪指令,6.1子程序结构及设计方法,6.1.1含有子程序的程序结构在汇编语言中用过程定义伪指令定义子程序。过程定义伪指令格式:过程名PROC属型过程名ENDP,1调用程序和子程序在同一个代码段的程序结构(子程序类型可缺省,注意END后必须跟主程序名)CODESEGMENTMAINPROCFARCALLSUB1RETMAINENDPSUB1PROCRETSUB1ENDPCODEENDSENDMAIN,2调用程序和子程序在不同段的程序结构(SUB2既被段间调用又被段内调用,必须是FAR属性。CALL要显式说明是FAR属性)CODE1SEGMENTMAINPROCFARCALLFARPTRSUB2RETMAINENDPCODE1ENDSCODE2SEGMENTSUB1PROCFARCALLFARPTRSUB2RETSUB1ENDPSUB2PROCFARRETSUB2ENDPCODE2ENDSENDMAIN,6.1.2设计子程序时应注意的问题1子程序说明2寄存器的保存与恢复3密切注意堆栈状态,6.2子程序参数传递,可以通过给子程序传递参数使其更通用。常用的参数传递方法如下:通过寄存器传递;若调用程序和子程序在同模块(源程序)中,子程序可以直接访问模块中的变量;通过地址表传递参数地址;通过堆栈传递参数或参数地址。,6.2.1通过寄存器传递这种传递方式使用方便,适用于参数较少的情况。例1把BX中的16位二进制数转换成十进制并显示在屏幕上。,STASGSEGMENTDW32DUP(?)STASGENDSCODESEGMENTASSUMECS:CODEMAINPROCFARMOVBX,162EHCALLTERNMOVAX,4C00HINT21HMAINENDP,程序6.3,TERNPROC;二十并显示。MOVCX,10000CALLDEC_DIV;转换万位数MOVCX,1000CALLDEC_DIV;转换千位数MOVCX,100CALLDEC_DIV;转换百位数MOVCX,10CALLDEC_DIV;转换十位数MOVCX,1CALLDEC_DIV;转换个位数RETTERNENDP,DEC_DIVPROC;CX中为十进制的位权MOVAX,BXMOVDX,0DIVCX;商为转换后的一位十进制数MOVBX,DXMOVDL,ALADDDL,30H;转换成ASCII码MOVAH,2;显示INT21HRETDEC_DIVENDPCODEENDSENDMAIN,6.2.2同模块中的子程序可直接访问模块中的变量若调用程序和子程序在同模块中,子程序可以直接访问模块中的变量。例2实现数组求和功能。要求数组求和(不考虑溢出情况)由子程序实现,其数组元素及结果均为字型数据。见程序6.4。,STACKSGSEGMENTSTACKSTKDW32DUP(S)STACKSGENDSDATASEGMENTARYDW1,2,3,4,5,6,7,8,9,10COUNTDW($-ARY)/2;数组元素个数SUMDW?;数组和的地址DATAENDS,程序6.4,CODE1SEGMENTMAINPROCFARASSUMECS:CODE1,DS:DATAPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXCALLFARPTRARY_SUMRETMAINENDPCODE1ENDS,CODE2SEGMENTASSUMECS:CODE2ARY_SUMPROCFAR;数组求和子程序PUSHAX;保存寄存器PUSHCXPUSHSILEASI,ARY;取数组起始地址MOVCX,COUNT;取元素个数XORAX,AX;清0累加器,NEXT:ADDAX,SI;累加和ADDSI,TYPEARY;修改地址指针LOOPNEXTMOVSUM,AX;存和POPSI;恢复寄存器POPCXPOPAXRETARY_SUMENDPCODE2ENDSENDMAIN,6.2.3通过地址表传递参数地址适用于参数较多的情况。具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址通过寄存器或堆栈传递给子程序。例3编写一个数组求和子程序,其数组元素及结果均为字型数据。另定义两个数组,并编写一个主程序,通过调用数组求和子程序分别求出两个数组的和。见程序6.5。,程序6.5,STACKSGSEGMENTSTACKSTKDW32DUP(S)STACKSGENDSDATASEGMENTARYDW1,2,3,4,5,6,7,8,9,10;数组1COUNTDW($-ARY)/2;数组1的元素个数SUMDW?;数组1的和地址NUMDW10,20,30,40,50;数组2CTDW($-NUM)/2;数组2的元素个数TOTALDW?;数组2的和地址TABLEDW3DUP(?);地址表DATAENDS,CODE1SEGMENTMAINPROCFARASSUMECS:CODE1,DS:DATAPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;构造数组1的地址表MOVTABLE,OFFSETARYMOVTABLE+2,OFFSETCOUNTMOVTABLE+4,OFFSETSUMLEABX,TABLE;传递地址表首地址CALLFARPTRARY_SUM,;构造数组2的地址表MOVTABLE,OFFSETNUMMOVTABLE+2,OFFSETCTMOVTABLE+4,OFFSETTOTALLEABX,TABLE;传递地址表的首地址CALLFARPTRARY_SUM;段间调用调用数组求和子程序RETMAINENDPCODE1ENDS,CODE2SEGMENTASSUMECS:CODE2ARY_SUMPROCFAR;数组求和子程序PUSHAX;保存寄存器PUSHCXPUSHSIPUSHDIMOVSI,BX;取数组起始地址MOVDI,BX+2;取元素个数地址MOVCX,DI;取元素个数MOVDI,BX+4;取结果地址XORAX,AX;清0累加器,NEXT:ADDAX,SI;累加和ADDSI,TYPEARY;修改地址指针LOOPNEXTMOVDI,AX;存和POPDI;恢复寄存器POPSIPOPCXPOPAXRETARY_SUMENDPCODE2ENDSENDMAIN,6.2.4通过堆栈传递参数或参数地址这种方式适用于参数较多,或子程序有多层嵌套、递归调用的情况。步骤:主程序把参数或参数地址压入堆栈;子程序使用堆栈中的参数或通过栈中参数地址取到参数;子程序返回时使用RETn指令调整SP指针,以便删除堆栈中已用过的参数,保持堆栈平衡,保证程序的正确返回。,例4完成数组求和功能,求和由子程序实现,要求通过堆栈传递参数地址。STACKSGSEGMENTSTACKSTKDW16DUP(?)STACKSGENDSDATASEGMENTARYDW1,2,3,4,5,6,7,8,9,10COUNTDW($-ARY)/2SUMDW?DATAENDS,程序6.6,CODE1SEGMENTMAINPROCFARASSUMECS:CODE1,DS:DATAPUSHDS;XORAX,AXPUSHAX;MOVAX,DATAMOVDS,AX,LEABX,ARYPUSHBX;压入数组起始地址LEABX,COUNTPUSHBX;压入元素个数地址LEABX,SUMPUSHBX;压入和地址CALLFARPTRARY_SUM;调用求和子程序RET;MAINENDPCODE1ENDS,CODE2SEGMENTASSUMECS:CODE2ARY_SUMPROCFAR;数组求和子程序PUSHBP;保存BP值MOVBP,SP;BP是堆栈数据的地址指针PUSHAX;保存寄存器内容PUSHCX;PUSHSI;PUSHDI;MOVSI,BP+10;得到数组起始地址MOVDI,BP+8;得到元素个数地址MOVCX,DI;得到元素个数MOVDI,BP+6;得到和地址XORAX,AX,NEXT:ADDAX,SI;累加ADDSI,TYPEARY;修改地址指针LOOPNEXTMOVDI,AX;存和POPDI;恢复寄存器内容POPSI;POPCX;POPAX;POPBP;RET6;返回并调整SP指针ARY_SUMENDPCODE2ENDSENDMAIN,返回,程序6.6中所有入栈操作对堆栈的影响,返回,程序6.6中主程序的RET执行前堆栈状态,例5完成数组求和功能,其中求和由子程序实现,要求使用结构访问堆栈中的参数。编码见程序6.7。,返回,SS,SP,BP,程序6.7的堆栈及结构数据示意图,结构,程序6.7,STACKSGSEGMENTSTACKSTKDW16DUP(S)STACKSGENDSDATASEGMENTARYDW1,2,3,4,5,6,7,8,9,10COUNTDW($-ARY)/2SUMDW?DATAENDS,CODE1SEGMENTMAINPROCFARASSUMECS:CODE1,DS:DATAPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX,LEABX,ARYPUSHBX;压入数组起始地址LEABX,COUNTPUSHBX;压入元素个数地址LEABX,SUMPUSHBX;压入和地址CALLFARPTRARY_SUMRETMAINENDPCODE1ENDS,CODE2SEGMENTASSUMECS:CODE2STACK_STRCSTRUC;定义结构SAVE_BPDW?SAVE_CS_IPDW2DUP(?)SUM_ADDRDW?COUNT_ADDRDW?ARY_ADDRDW?STACK_STRCENDS,ARY_SUMPROCFAR;数组求和子程序PUSHBP;保存BP值MOVBP,SPPUSHAXPUSHCXPUSHSIPUSHDIMOVSI,BP.ARY_ADDR;数组始地址MOVDI,BP.COUNT_ADDRMOVCX,DIMOVDI,BP.SUM_ADDR;得到和地址XORAX,AX,NEXT:ADDAX,SI;累加ADDSI,TYPEARY;修改地址指针LOOPNEXTMOVDI,AX;存和POPDIPOPSIPOPCXPOPAXPOPBPRET6;返回并调整SP指针ARY_SUMENDPCODE2ENDSENDMAIN,子程序嵌套示意图,返回,6.3嵌套与递归子程序,1.子程序嵌套,以下是求N!递归过程的描述。编码见程序6.8。,2.递归子程序,BEGINFACT(N,RESULT)SAVEREGISTERONSTACKIFN=0RESULT1ELSEPUSHADDRESSOFRESULTONTOSTACKPUSHN-1ONTOSTACKCALLFACT(N-1,RESULT)RESULTN*RESULTENDIFRESTOREREGISTERSFROMSTACKDELETEPARAMETERSFROMSTACK,N!流程图,返回,程序6.8,STACKSGSEGMENTSTACKS;定义堆栈DW128DUP(ST)STACKSGENDSDATASEGMENTN_VALDW3;定义N值RESULTDW?;结果DATAENDS,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSGFRAMESTRUC;定义帧结构SAV_BPDW?;保存BP值SAV_CS_IPDW2DUP(?);保存返回地址NDW?;当前N值RESULT_ADDRDW?;结果地址FRAMEENDS,MAINPROCFARMOVAX,DATAMOVDS,AXLEABX,RESULTPUSHBX;结果地址入栈PUSHN_VAL;N值入栈CALLFARPTRFACT;调用递归子程序R1:MOVAX,4C00HINT21HMAINENDP,FACTPROCFAR;N!递归子程序PUSHBP;保存BP值MOVBP,SP;BP指向帧基地址PUSHBXPUSHAXMOVBX,BP.RESULT_ADDRMOVAX,BP.N;取帧中N值CMPAX,0JEDONE;N0时退出子程序嵌套PUSHBX;为下一次调用压入结果地址DECAXPUSHAX;为下一次调用压入(N1)值CALLFARPTRFACT,R2:MOVBX,BP.RESULT_ADDRMOVAX,BX;取中间结果(N1)!MULBP.N;N*(N1)!JMPSHORTRETURNDONE:MOVAX,1;0!1RETURN:MOVBX,AX;存中间结果POPAXPOPBXPOPBPRET4FACTENDPCODEENDSENDMAIN,程序6.8的运行情况:主程序把结果地址和N的初始值压入堆栈,然后调用FACT子程序。在FACT中,它不断调用自身,每调用一次都要在堆栈中形成一帧,该帧由以下信息组成:子程序中要用到的寄存器内容、中间结果地址、(N1)的值、子程序返回地址,自身调用直到N0为止。,当N0时开始返回。通过BP.RESULT_ADDR和BP.N取出堆栈中本次使用的参数,计算N*(N-1)!的值,保存中间结果,恢复寄存器的值,用RET4返回并废除已用过的N和中间结果地址。重复第步,逐层返回直到N等于初始值为止。,6.4宏指令,在高级汇编语言技术中,一段共用语句序列除了可以设计成子程序外,还可以设计成宏指令的形式。,6.4.1宏定义、宏调用、宏扩展,宏指令是源程序中一段有独立功能的程序代码。宏指令由宏定义伪指令定义,它只需在源程序中定义一次,便可以多次被调用。,宏指令名MACRO形式参数表;宏指令体ENDM,宏定义伪指令格式:,宏调用,宏指令一经定义,就可以在程序中调用它,这被称为宏调用。宏调用格式:宏指令名实参数表,宏扩展,宏扩展就是用宏定义体替换宏指令名,并用实参数替换形式参数。,例1输入一个字符的宏定义、宏调用、宏扩展,;宏定义INCHARMACROMOVAH,1INT21H;输入的字符在ALENDM;宏调用INCHAR当汇编程序汇编到宏指令INCHAR时,则对其扩展如下:1MOVAH,11INT21H,指令前的“1”表示该语句是扩展时替换得到的。,设计宏指令时应注意的问题,由于宏指令也像子程序那样可以被多次调用或被多个程序共享,所以在设计时需要注意以下问题:1宏指令说明2寄存器的保存与恢复3宏指令中的符号说明,6.4.2LOCAL伪指令,格式:LOCAL局部符号表功能:对局部符号表中的每个符号,在汇编时每扩展一次便建立一个惟一的符号,形如?xxxx(xxxx的值在0000FFFF之间)。以保证汇编时生成名字的惟一性。,例2以下是定义一个延时程序的宏指令delay,并且在同一个程序中两次被调用的扩展情况。,;宏定义DELAYMACROLOCALLOPMOVCX,2801LOP:LOOPLOPENDM,宏调用:DELAYDELAY汇编时宏扩展如下:DELAY0009B90AF11MOVCX,2801000CE2FE1?0000:LOOP?0000DELAY000EB90AF11MOVCX,28010011E2FE1?0001:LOOP?0001,宏指令中参数的使用,在宏定义时可以带有形式参数,而在宏调用时给出实参数即可。宏指令的参数可以是常数、寄存器、变量、表达式、操作码或操作码的一部分、指令或伪指令助记符等。,例3定义在两个字型内存变量之间传送数据的宏指令,并调用它,然后观察其扩展情况。,MOVEMOCROX,YPUSHAXMOVAX,XMOVY,AXPOPAXENDM,DATASEGMENTVAR1DW6543HVAR2DW?DATAENDS;宏调用;宏扩展MOVEVAR1,VAR21PUSHAX1MOVAX,VAR11MOVVAR2,AX1POPAX,6.4.3宏指令嵌套,宏指令嵌套有两种情况:宏定义体中含有宏调用;宏定义体中含有宏定义。,DMACMACROMNAME,OPER;外层宏定义MNAMEMACROX,Y,Z;内层宏定义PUSHAXMOVAX,XOPERAX,YMOVZ,AXPOPAXENDMENDM,例4宏定义体中嵌套宏定义的宏指令、宏调用及宏扩展示例。,ADW25BDW12CDW?DMACADDITION,ADD;外层宏调用1ADDITIONMACROX,Y,Z1PUSHAX1MOVAX,X1ADDAX,Y1MOVZ,AX1POPAX1ENDM,ADDITIONA,B,C;内层宏调用1PUSHAX1MOVAX,A1ADDAX,B1MOVC,AX1POPAX,DMACLOGIC_AND,AND;外层宏调用1LOGIC_ANDMACROX,Y,Z1PUSHAX1MOVAX,X1ANDAX,Y1MOVZ,AX1POPAX1ENDM,LOGIC_ANDA,B,C;内层宏调用1PUSHAX1MOVAX,A1ANDAX,B1MOVC,AX1POPAX使用适当的实参数,通过调用DMAC宏指令可以生成另一条新的宏指令,再调用新宏指令可以实现任何双操作数指令的操作,而且两个操作数可以同时为存储器操作数。这种方法使得宏的功能更强大。,PURGE伪指令,格式:PURGE宏指令名,功能:从内存中删除指定的宏指令。例:PURGEINCHAR,6.4.4宏操作符,这些操作符不仅适用于宏指令,也适用于重复汇编伪指令。宏操作符格式名称注释宏注释,1操作符宏调用PUTDATA0MYDATA,5;宏扩展1?0000MYDATADB5;宏调用PUTDATA0MYDATA,8;宏扩展1?0001MYDATADB8,返回,由操作符括起的内容作为一个整体原样传递。例如,可以使用符号包围目标,从而使该目标作为单一的参数而不是多个参数的列表。例6用不同的实参数调用PUTDATA宏指令,观察它们的变化。PUTDATAMACROTHENAME,THEDATAPD_宏扩展1PD_MYDATADB5,2文本原样传递操作符,;宏调用2PUTDATAMYDATA,;宏扩展1PD_MYDATADB5,4,3,又如以下符号定义语句:Numeric=10+2Textualequ其汇编结果是:NUMERIC.NUMBER000CTEXTUAL.TEXT10+2可以看到,对Numeric已经求值,而Textual只是一串字符而已。,返回,3字符原意操作符!,!操作符指示MASM把后跟的一个字符原样传送,即把它只作为普通字符对待。例如,若你需要把“!宏定义DEBUGMSGMACROPOINT,STRINGMSG宏扩展1MSG6DBATPOINT6:INSERTIONFAILS!,4表达式操作符,在宏调用时,操作符强迫后跟的表达式立即求值,并把表达式的结果作为实参数替换,而不是表达式本身。例8定义Problem1宏指令,并比较两次调用Problem1宏指令的区别,其中一次调用中使用了操作符。Problem1宏指令功能:把由宏指令参数所指定的字型数组(array)的一个元素装入AX寄存器,该参数经汇编后必须是一个常数表达式。,PROBLEM1MACROPARAMETERMOVAX,ARRAYPARAMETER*2ENDM;宏调用1:希望取出ARRAY12,其中的参数10+2是表达式本身PROBLEM110+2;宏扩展1:1MOVAX,ARRAY10+2*2;实际取出的是ARRAY7,正确的表达是:;宏调用2:PROBLEM1%10+2;宏扩展2:1MOVAX,ARRAY12*2,注意:由于MASM在调用宏指令时对其中的参数经常是原文替换,所以有时产生的可能不是预期的结果。,考虑以下对PROBLEM1的宏调用及宏扩展:;宏调用,要求装入ARRAY的元素2PROBLEM12;宏扩展1MOVAX,ARRAY2*2可以看到,宏扩展后结果正确。,;宏调用:装入ARRAY的元素10:INDEX=8PROBLEM1INDEX+2;宏扩展1MOVAX,ARRAYINDEX+2*2因为MASM的地址表达式遵守操作符优先级的优先规则,则该语句宏扩展后不是预想的结果,它访问的是元素6(索引12),而不是元素10(索引20)。,为了能够得到正确的结果,可以在宏指令的参数表达式中用()把参数括起来:;宏定义PROBLEM2MACROPARAMETERMOVAX,ARRAY(PARAMETER)*2ENDM;宏调用INDEX=8PROBLEM2INDEX+2;宏扩展1MOVAX,ARRAY(INDEX+2)*2,5宏注释;,在宏定义中,若注释以一个分号开始,则该注释在宏扩展时出现。但若注释以两个分号开始,则该注释在宏扩展时不出现。举例见列表伪指令。,返回,6.4.5列表伪指令,格式功能.LALL在列表文件中列出全部宏文本内容(以双分号开头的注释除外).SALL在列表文件中不显示任何宏文本内容.XALL(缺省)在列表文件中只列出可产生目标代码的宏文本内容注意:这些列表伪指令只影响列表文件,并不影响目标码的生成。,6.5宏指令库,为了使宏指令能让多个程序共享,可以把它们组织到一个文件中,并存放在磁盘上,把这种文件称为宏指令库。1.建立宏指令库可以把一些常用的宏指令集中在一个文件中形成宏指令库,用EDIT等任何文本编辑程序创建宏指令库,库名由用户自己起,而且对库的扩展名没有特殊要求。库中的宏指令以源代码形式出现。,假设MACRO.LIB中包含以下宏指令(详细内容见教材P174):SETMODE;设置8025彩色显示模式INCHAR;接收一个字符,并返回在AL中OUTCHARX;输出X字符PUSHREG;保存寄存器DX、CX、BX、AX、DI、SI、BPPOPREG;恢复寄存器BP、SI、DI、AX、BX、CX、DX,WINDOWMACROCollor,WleftTopRow,WLeftTopCul,WRightBottomRow,WRightBottomCul;功能:开窗口MOVEMOCROX,Y;字型数据X送Y变量CLRSCRN;清屏CURSOR;置光标,入口参数:DH:DL行,列号RETURN;返回操作系统,BIN_DECMACROASC,BIN;功能:把16位二进制数转换为十进制数的;ASCII值,ASC为5个字节的十进制数缓冲区,;BIN为要转换的二进制数。DISPMACROASC;显示首址为ASC的字符串,2把宏指令库包含到应用程序中格式:INCLUDE源文件名功能:把另一个源文件包含到当前源文件中。,3使用宏指令库中的宏指令例9实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。编码见程序6.9。,程序6.9,INCLUDEMACRO.LIBPURGESETMODE,INCHAR,OUTCHAR,WINDOW,MOVE,MULSTACKSGSEGMENTSTACKSDW16DUP(?)STACKSGENDSDATASEGMENTADD7006652;被除数BDW1234;除数CDW?;商PROMPTDBTheresultis:$ASCIIDB5DUP(?),$;转换结果DATAENDS,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSGMAINPROCFARMOVAX,DATAMOVDS,AXMOVDX,WORDPTRA+2MOVAX,WORDPTRADIVB,BIN_DECASCII,AXCLRSCRNDISPPROMPTDISPASCIIRETURNMAINENDPCODEENDSENDMAIN,4.宏指令与子程序的区别,采用宏和子程序均能达到代码共享、简化源程序的目的,但它们的区别也是显而易见的。区别主要有以下几点:,(1)工作方式的区别(2)参数传递的方便性(3)参数的多样性及灵活性,通常:宏指令被用在代码较短且参数较多的场合;子程序被用在代码较长的场合。,6.6重复伪指令,当程序中需要重复书写相同或几乎相同的语句时,可以用重复伪指令定义重复块,以简化程序和减轻程序设计人员的工作量。绝大部分MASM版本提供了REPT、IRP和IRPC重复伪指令,而在MASM6.X中还提供了其它重复伪指令。,6.6.1重复伪指令REPT,格式:REPT数值表达式;重复块ENDM功能:汇编程序使重复块的内容重复多次,重复次数由表达式给出。说明:重复块中可以出现任何有效的汇编语句,数值表达式的计算结果应该是无符号常数。,DATASEGMENTTABLELABELWORDX=5REPT6;重复6次DWX*X*X;定义立方值X=X+1ENDMDATAENDS,汇编后的情况如下:(1)0000DATASEGMENT(2)0000TABLELABELWORD(3)=0005X=5(4)REPT6(5)DWX*X*X(6)X=X+1(7)ENDM,(8)0000007D1DWX*X*X(9)000200D81DWX*X*X(10)000401571DWX*X*X(11)000602001DWX*X*X(12)000802D91DWX*X*X(13)000A03E81DWX*X*X(14)000CDATAENDS第(8)到第(13)行是汇编后的情况。在代码段中可以通过TABLE名来引用这些值。,MOVBX,10REPT2DECBXENDM汇编后产生如下语句:MOVBX,101DECBX1DECBX,CHARSMACRONUMMOVAH,2CHAR=AREPTNUMMOVDL,CHARINT21HCHAR=CHAR+1ENDMENDM,CODESEGMENTASSUMECS:CODEMAINPROCFARCHARS26MOVAX,4C00HINT21HMAINENDPCODEENDSENDMAIN从本例可以看出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年国家开放大学(电大)《算法设计与分析》期末考试备考试题及答案解析
- 2025年国家开放大学《外语》期末考试备考试题及答案解析
- 2025年国家开放大学《生态环境学概论》期末考试备考试题及答案解析
- 2025年国家开放大学《广告社交媒体营销策略与实施》期末考试备考试题及答案解析
- 2025年国家开放大学《公共关系学基础》期末考试备考试题及答案解析
- 2025年国家开放大学《嵌入式系统开发》期末考试备考试题及答案解析
- 2025年国家开放大学《科学技术史》期末考试备考试题及答案解析
- 企业职业病防控管理规范汇编
- 2025年国家开放大学《管理心理学》期末考试备考试题及答案解析
- 2025年国家开放大学(电大)《观光地理学》期末考试备考试题及答案解析
- GB 16663-2025醇基液体燃料
- 2024年全国统计师之初级统计基础理论及相关知识考试快速提分卷(附答案)
- 2025年湖北省荆门市辅警考试题库(附答案)
- 潮汕美食课件
- 2025年云南省公务员公开遴选笔试试题及答案(综合类)
- 气象科研课题申报书
- 2023年中级统计师《统计工作实务》试题真题及答案
- 新疆质量安全总监培训课件
- 2025年专题讲座-纪念抗战胜利80周年93阅兵
- 新视野第三版第一册unit2
- 入团志愿书(2016版本)(可编辑打印标准A4)
评论
0/150
提交评论