




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 子程序结构Assembly Language Programming2第六章第六章 子程序结构子程序结构 把功能相对独立的程序段单独编写和调试,作为一把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。个相对独立的模块供程序使用,就形成子程序。 子程序可以实现源子程序可以实现源程序的模块化程序的模块化,可,可简化源程序结简化源程序结构构,可以,可以提高编程效率提高编程效率。 定义和使用子程序、参数传递和返回值约定、寄存定义和使用子程序、参数传递和返回值约定、寄存器使用约定、局部变量和堆栈控制等。器使用约定、局部变量和堆栈控制等。 参数传递参数传递是子程
2、序设计的是子程序设计的重点和难点重点和难点36.1 子程序的设计方法子程序的设计方法 一、一、 过程(子程序)定义伪操作过程(子程序)定义伪操作子程序名子程序名 PROC NEAR ( 或或 FAR ) retret子程序名子程序名 ENDP 子程序名子程序名为符合语法的标识符为符合语法的标识符 NEAR属性属性(段内近调用段内近调用) ): 调用程序和子程序在同一代码调用程序和子程序在同一代码段中段中,只能被相同代码段的其他程序调用只能被相同代码段的其他程序调用; ; FAR属性属性(段间远调用段间远调用) ): 调用程序和子程序不在同一代调用程序和子程序不在同一代码段中码段中,可以被相同或
3、不同代码段的程序调用可以被相同或不同代码段的程序调用. .4对简化段定义格式,在微型、小型和紧凑存储模对简化段定义格式,在微型、小型和紧凑存储模式下,过程的缺省属性为式下,过程的缺省属性为near;在中型、大型和;在中型、大型和巨型存储模式下,过程的缺省属性为巨型存储模式下,过程的缺省属性为far对完整段定义格式,过程的缺省属性为对完整段定义格式,过程的缺省属性为nearnear用户可以在过程定义时用用户可以在过程定义时用nearnear或或farfar改变缺省属改变缺省属性性二、使用子程序二、使用子程序 子程序名子程序名 / 子程序入口地址子程序入口地址 子程序名子程序名是一个(全局标识符)
4、是一个(全局标识符)常量地址常量地址。 子程序调用(中断调用):隐含使用堆栈保存返回地址子程序调用(中断调用):隐含使用堆栈保存返回地址 call near ptr subprog ;段内调用段内调用 (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 (EIP) subprog的的偏移地址偏移地址 call far ptr subprog ;段间调用;段间调用 (1) 保存返回地址保存返回地址 (2) 转子程序转子程序 (CS) subprog 的段地址的段地址 (EIP) subprog 的偏移地址的偏移地址 (EIP)(ESP) (EIP)(ESP) (CS)56 int n (
5、n : 中断类型号)中断类型号) (1) 保存现场和返回地址保存现场和返回地址 (2) 转中断处理程序转中断处理程序 (IP) (n*4) (CS) (n*4+2) 子程序返回子程序返回(1) ret(2) ret imm(3) iret (中断返回)(中断返回)(IP)(SP) (CS)(PSW)7例例6.1 调用程序和子程序在同一代码段中调用程序和子程序在同一代码段中code segment main proc far . call subr1 . retmain endpsubr1 proc near . retsubr1 endpcode ends8 seg1 segment subt
6、 proc far . ret subt endp . call subt .seg1 endsseg2 segment . call subt .seg2 ends代码段代码段seg1代码段代码段seg2例6.2 调用程序和子程序不在同一代码段中 三、三、 增强功能的增强功能的过程(子程序)定义过程(子程序)定义子程序名子程序名 PROC 属性属性 USES 寄存器列表寄存器列表 ,参数表参数表LOCALLOCAL 局部变量表局部变量表retret子程序名子程序名 ENDP 距离:距离:NEAR/FAR (微、小、紧凑和平坦模式为微、小、紧凑和平坦模式为NEAR,中、大和巨模式为,中、大和巨
7、模式为FAR) 语言类型:语言类型:C、BASIC、PASCAL、FORTRAN、 可见性:可见性:Private / Public可以使用宏名指定属性可以使用宏名指定属性 参数名参数名:类型类型 ; ; 缺省类型为缺省类型为DWORDDWORD910 入口参数入口参数(输入参数):主程序提供给子程序(输入参数):主程序提供给子程序 出口参数出口参数(输出参数):子程序返回给主程序(输出参数):子程序返回给主程序参数的形式:参数的形式: 数据本身(数据本身(传值传值) 数据的地址(数据的地址(传址传址) 四、四、 参数传递约定参数传递约定 C C语言用语言用 AL / AX / DX:AX /
8、EAX / EDX:EAX AL / AX / DX:AX /EAX / EDX:EAX 返返回整数,用浮点堆栈栈顶返回实数。汇编语言一般回整数,用浮点堆栈栈顶返回实数。汇编语言一般建议使用建议使用C C语言约定。语言约定。通过通过寄存器寄存器传送传送参数参数通过通过存储器存储器传送传送参数参数 *子程序和调用程序在同一程序模块中,则子子程序和调用程序在同一程序模块中,则子程序可直接访问模块中的变量。程序可直接访问模块中的变量。 *子程序和调用程序不在同一程序模块中,则子程序和调用程序不在同一程序模块中,则有两种传送方式:建立有两种传送方式:建立公共数据区公共数据区和使用和使用外部外部符号。符
9、号。通过通过地址表地址表传送传送参数地址参数地址通过通过堆栈堆栈传送传送参数参数或或参数地址参数地址传递的方法:传递的方法:12subnameproc;具有缺省属性的具有缺省属性的subname过程过程push esi;保护寄存器:保护寄存器:顺序压入堆栈顺序压入堆栈push edi;以以 esi/edi/ebx 为例为例push ebx;过程体过程体pop ebx;恢复寄存器:恢复寄存器:逆序弹出堆栈逆序弹出堆栈pop edipop esiret;过程返回过程返回subnameendp;过程结束过程结束保护现场保护现场恢复现场恢复现场五、利用堆栈五、利用堆栈(保护寄存器、临时变量和临时数据)
10、(保护寄存器、临时变量和临时数据)13六、子程序框架六、子程序框架 (PowerAsm.asm); 计算 iNum * 2 iPower; int GetPowerC(int iNum, int iPower);PUBLIC GetPowerAsm_TEXT SEGMENT WORD PUBLIC CODEGetPowerAsm PROC NEAR ; 保存 EBP ; 保存 ESP 到 EBP,以后可以用 EBP 依据返回; 地址向前或向后寻址参数或局部变量 MOV EAX, EBP+8 ; 第一个参数之前为EBP,再之前是EIP MOV ECX, EBP+12; 第二个参数也是双字整数 S
11、HL EAX, CL; EAX = EAX * (2 CL) ; 恢复 EBP RET; 结果在 EAX 中GetPowerAsm ENDP_TEXT ENDS END堆栈状态:堆栈状态:低地址低地址 高地址高地址内部临时堆栈操作内部临时堆栈操作, 局部变量局部变量, EBP,返回地址返回地址,第一个参数第一个参数,第二个参数第二个参数/ 计算计算 iNum * 2 iPower 的的嵌汇编嵌汇编 C 程序程序int GetPowerC(int iNum, int iPower) _asm MOV EAX, iNumMOV ECX, iPowerSHL EAX, CL ; EAX = EAX
12、* (2 CL) / 返回结果在返回结果在 EAX 中(编译时或出现一个警告)中(编译时或出现一个警告)14第一个参数第一个参数第二个参数第二个参数返回地址返回地址EBP局部参数局部参数局部参数局部参数ESP/ 去除框架的去除框架的C函数函数void _declspec (naked) MyNakedFunction()_asm / 可自己完成初始化工作可自己完成初始化工作 PUSH EBPMOV EBP, ESPSUB ESP, _LOCAL_SIZE . . ._asm / 执行对应的扫尾工作执行对应的扫尾工作 MOV ESP, EBPPOP EBPRET 15; 也可以不使用也可以不使用
13、EBPGetPowerAsm PROC NEAR MOV EAX, ESP+4 ; 第一个参数之前只有返回的偏移地址第一个参数之前只有返回的偏移地址EIP MOV ECX, ESP+8 ; 两个参数都为双字整数两个参数都为双字整数 SHL EAX, CL; EAX = EAX * (2 CL) RET; 返回结果在返回结果在 EAX 中中GetPowerAsm ENDP; 计算计算 iNum * 2 iPowerGetPowerAsm PROC _iNum$:DWORD, _iPower$:DWORD MOV EAX, _iNum& MOV ECX, _iPower$ SHL EAX,
14、 CL; EAX = iNum * (2 iPower) RET; 结果在结果在 EAX 中中GetPowerAsm ENDP全局变量全局变量:名:名 类型类型 值表值表局部变量:局部变量:LOCAL 名名 / 名名:类型类型 / 名名长度长度:类型类型 ,.定义外部符号:定义外部符号:PUBLIC 标识符标识符 ,.使用外部符号:使用外部符号:EXTRN 标识符标识符:类型类型 , .16cdecl 与与STDCALL调用规则调用规则int addproc (int a, int b)return a+b;int r, s;void main ( )r = addproc (10, 20);
15、s = addproc (r, -1);00401000 PUSH EBP ; addproc 程序入口程序入口00401001 MOV EBP, ESP00401003 MOV EAX, DWORD PTR EBP+800401006 ADD EAX, DWORD PTR EBP+1200401009 POP EBP0040100A RET; STDCALL 用用 RET 80040100B PUSH EBP ; 主程序入口主程序入口0040100C MOV EBP, ESP0040100E PUSH 14H00401010 PUSH 0AH00401012 CALL 00401000004
16、01017 ADD ESP, 80040101A MOV 00405428, EAX ; r = EAX0040101F PUSH 0FFFFFFFFH00401021 MOV EAX, 0040542800401026 PUSH EAX00401027 CALL 004010000040102C ADD ESP, 80040102F MOV 0040542C, EAX ; s = EAX00401034 POP ESP00401035 RET17七、高级语法七、高级语法 函数原型声明函数原型声明子程序名子程序名 PROTO 距离距离 语言语言, 参数参数 : 类型类型 , 子程序调用伪操作符
17、子程序调用伪操作符INVOKE 子程序名子程序名 , 实参表实参表参数符合参数符合 PUSH 的操作数类型,可以使用的操作数类型,可以使用 ADDR 取得变量的地址(隐取得变量的地址(隐含地使用含地使用 LEA eax, Var) 定义局部变量定义局部变量LOCAL 变量名变量名重复数量重复数量:类型类型 , 定义和使用外部标识定义和使用外部标识PUBLIC 标识符标识符 , EXTERN 标识符:类型标识符:类型 , 1819例题例题 : :实现光标回车换行实现光标回车换行的子程序的子程序dpcrlfproc;子程序开始子程序开始push ax;保护寄存器保护寄存器AX和和DXpush dx
18、mov dl, 0dh;显示回车显示回车mov ah, 2int 21hmov dl, 0ah;显示换行显示换行mov ah, 2int 21hpop dx;恢复寄存器恢复寄存器DX和和AXpop axret;子程序返回子程序返回dpcrlfendp;过程结束过程结束20例题例题 : :实现实现alal内容内容( (两个十六进制数两个十六进制数) )的显示的显示的子程序的子程序ALdisp proc ;子程序开始子程序开始 push ax ;过程中使用了过程中使用了AX、CX和和DX push cx push dx push ax ;暂存暂存ax mov dl,al ;转换转换al的高的高4位
19、位 mov cl,4 shr dl,cl or dl,30h ;al高高4位变成位变成3 cmp dl,39h jbe aldisp1 add dl,7 ;是是0Ah0Fh,还要加上,还要加上7aldisp1: mov ah,2 ;显示显示 int 21h21例题例题 : :实现实现alal内容内容( (两个十六进制数两个十六进制数) )的显示的显示的子程序的子程序 pop dx ;恢复原恢复原ax值到值到dx and dl, 0fh ;转换转换al的低的低4位位 or dl, 30h cmp dl, 39h jbe aldisp2 add dl,7aldisp2: mov ah,2 ;显示显
20、示 int 21h pop dx pop cx pop ax ret;过程返回过程返回ALdispendp22例题例题 : :实现实现alal内容内容( (两个十六进制数两个十六进制数) )的显示的显示的子程序的子程序;主程序主程序mov bx,offset array ;调用程序段开始调用程序段开始mov cx,countdisplp:mov al,bxcall Aldisp;调用显示过程调用显示过程mov dl, ,;显示一个逗号,分隔数据显示一个逗号,分隔数据mov ah, 2int 21hinc bxloop displp;调用程序段结束调用程序段结束.exit 0.;过程定义过程定义
21、end23decihex segment ; 1016 assume cs: decihexmain proc far push ds sub ax, ax push axrepeat: call decibin ; 102 call crlf call binihex ; 216 call crlf jmp repeat retmain endp例例6.3 十进制到十六进制的转换程序十进制到十六进制的转换程序 (通过寄存器传送变量)通过寄存器传送变量)24decibin proc near ; 102 mov bx, 0 ; bx为传递参数为传递参数newchar: mov ah, 1 in
22、t 21h sub al, 30h jl exit ; 9退出退出 cbw xchg ax, bx mov cx, 10d mul cx xchg ax, bx add bx, ax jmp newcharexit: retdecibin endp例6.3 十进制到十六进制的转换程序25binihex proc near ; 216 mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl printit add al, 7h ; AF printit: mov dl, al
23、mov ah, 2 int 21h dec ch jnz rotate retbinihex endp例6.3 十进制到十六进制的转换程序26crlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h retcrlf endpdecihex ends end main例6.3 十进制到十六进制的转换程序27data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode segmentmain proc far assum
24、e cs:code, ds:datastart: push ds sub ax, ax push ax mov ax, data mov ds, ax call near ptr proadd retmain endp例6.4 累加数组中的元素(直接访问变量)28proadd proc near push ax push cx push si lea si, ary mov cx, count xor ax, ax例6.4 累加数组中的元素(直接访问变量)next: add ax, si add si, 2 loop next mov sum, ax pop si pop cx pop ax
25、retproadd endpcode ends end start29data segmentary dw 1,2,3,4,5,6,7,8,9,10count dw 10sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100count1 dw 10sum1 dw ?data ends如果数据段定义如下:如果数据段定义如下:*如果直接访问内存变量,那么累加数组如果直接访问内存变量,那么累加数组aryary和和数组数组ary1ary1中中的元素不能用同一个子程序的元素不能用同一个子程序proaddproadd例6.4 累加数组中的元素(直接访问变量)30 ta
26、ble dw 3 dup (?) ; 定义地址表 code segmentmain proc far assume cs:code, ds:datastart: push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary mov table+2, offset count mov table+4, offset sum mov bx, offset table call proadd ret main endp 例6.4 累加数组中的元素proadd proc near push ax push cx pus
27、h si push di mov si, bx mov di, bx+2 mov cx, di mov di, bx+4 xor ax, axnext: add ax, si add si, 2 loop next mov di, ax pop di pop si pop cx pop ax retproadd endpcode ends end start aryary 10 10 00000000 20 000220 0002 3030 4040 5050 6060 7070 8080 9090 100100 countcount 10 10 00140014 sum sum ? ? 00
28、160016 table table 00000000 0018 0018 ( (bxbx) )0014001400160016(si)(di)32例6.4 累加数组中的元素(通过堆栈传送变量地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ?data endsstack segment dw 100 dup (?) tos label wordstack ends code1 segmentmain proc far assume cs:code1, ds:data, ss:stackstart:
29、 mov ax, stack mov ss, ax mov sp, offset tos push ds sub ax, ax push ax mov ax, data mov ds, ax mov bx, offset ary push bx mov bx, offset count push bx mov bx, offset sum push bx call far ptr proadd retmain endpcode1 endscode2 segment assume cs: code2proadd proc far push bp mov bp, sp push ax push c
30、x push si push di mov si, bp+0ah mov di, bp+8 mov cx, di mov di, bp+6 (bp)+0a (bp)+0a 0000 0000 (sp) (sp) ( (didi) ) ( (sisi) ) ( (cxcx) ) (ax)(ax) ( (bpbp) ) ( (bpbp) ) ( (ipip) ) ( (cscs) ) (bp)+6(bp)+6 0016 0016 (bp)+8 (bp)+8 0014 0014 0 0 ( (dsds) ) xor ax, axnext: add ax, si add si, 2 loop next
31、 mov di, ax pop di pop si pop cx pop ax pop bp ret 6proadd endpcode2 ends end start堆栈示意35例:求ADDSUM PROC MOV AX,5 MOV DX,0 MOV CX,AXNEXTAX: PUSH CX CALL SUM ADD DX,AX POP CX LOOP NEXTAX MOV AH,4CH INT 21H RETADDSUM ENDP 511jjiiSUM PROC MOV AX,0NEXT: ADD AX,CX LOOP NEXT RETSUM ENDPEND ADDSUM36例例:判断闰年的
32、程序判断闰年的程序data segment ;定义数据段定义数据段 infon db 0dh,0ah,Please input a year: $ Y db 0dh,0ah,This is a leap year! $ N db 0dh,0ah,This is not a leap year! $ w dw 0 buf db 8 db ? db 8 dup(?)data endsstack_sg segment stack db 200 dup(0)stack_sg ends37例例:判断闰年的程序判断闰年的程序code segment assume ds:data,ss:stack_sg,c
33、s:code start:mov ax,data mov ds,ax lea dx,infon ;在屏幕上显示提示信息在屏幕上显示提示信息 mov ah,9 int 21h lea dx,buf ;从键盘输入年份字符串从键盘输入年份字符串 mov ah,10 int 21h 38例例:判断闰年的程序判断闰年的程序 mov cl, buf+1 ;取实际输入的字符数取实际输入的字符数 lea di,buf+2 ;DI指向输入串的起始地址指向输入串的起始地址 call datacate call ifyears jc a1 lea dx,n mov ah,9 int 21h jmp exita1:
34、lea dx,y mov ah,9 int 21hexit: mov ah,4ch int 21h39;十进制数转换成二进制 datacate proc near mov ch,0 mov si,di mov bl,10 mov bh,0 mov ax, ;累加器清累加器清“”l1: imul bx sub byte ptr si,30h add al,byte p tr si adc ah,0 inc si loop l1 mov w,ax ret datacate endp键盘输入字符串123 则, 40;判断闰年 ifyears proc near push bx push cx pus
35、h dx mov ax,w mov cx,ax mov dx,0 mov bx,4 div bx cmp dx,0 jnz lab1 mov ax,cx mov bx,100 div bx cmp dx,041将二进制数按位转换成相应的ASCII码字符串 将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。42将二进制数按位转换成相应的ASCII码字符串 入口参数:DX存放待转换的二进制数 CX存放待转换数的位数
36、(8位或16位) DI存放ASCII码首地址 出口参数:转换后的字符串存放在以DI作指针的字节存贮区中 程序如下: DATA SEGMENT NUM8 DB93H NUM16 DW0ABCDH ASCBUFDB20DUP(0) DATA ENDS43将二进制数按位转换成相应的ASCII码字符串CODESEGMENTASSUME DS:DATA,CS:CODE, SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址DICALLBTASC;调用子程序BTASCMOVDI,B
37、YTE PTR 0DHMOVDI+1,BYTE PTR 0AH44将二进制数按位转换成相应的ASCII码字符串 MOVDI+2,BYTE PTR $LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16 ;置位数16LEADI,ASCBUFCALL BTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE PTR ;显示转换后的字符串LEADX, ASCBUF MOVAH,9 INT21H45将二进制数按位转换成相应的ASCII码字符串BTASCPROCPUSHAX;保存;保存AXMOVAL,0CMPCX
38、,8;比较;比较8位数位数JNEL1;直接转换;直接转换16位数位数MOVDH,DL;8位数转换送位数转换送DHL1:ROLDX,,1;DX最高位移入最高位移入CFRCLAL,1;CF移入移入AL最低位最低位ADDAL,30HMOVDI,AL INCDILOOPL1POPAXRETBTASCENDPCODEENDSENDSTART46子程序的嵌套子程序的嵌套主程序主程序 子程序子程序A 子程序子程序B proc_A proc_B. . call proc_A call proc_B . ret ret递归子程序:递归子程序:n!6.2 嵌套与递归子程序47递归方法求n!(1n8).model
39、small;定义数据段和堆栈段data segment n dw0 result dw0data endsstack1 segmentdw200 dup (0)toslabel wordstack1 ends48主程序code segment assume cs:code,ds:data,ss:stack1main proc far mov ax,stack1 mov ss,ax mov sp,offsettos push ds xor ax,ax push ax mov ax,data mov ds,ax call near ptr decbin ;输入一个正整数输入一个正整数 call n
40、ear ptr crlf ;输出一个回车换行输出一个回车换行 49子程序factorialfactorial proc nearpushaxpushbpmovbp,spmovax,bp+6cmpax,0jnefact1incaxjmpexit1fact1:dec ax50子程序decbindecbin proc near movbx,0newchar: movah,1 int21h subal,30h jlexit cmpal,9d jgexit cbw add bx,ax jmpnewcharexit: retdecbin endp51子程序binhexbinhex proc near mo
41、v ch,4rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h52递推方法求n!(1n8)主代码段: call near ptr decbin call near ptr crlf mov n,bx mov ax,1 call near ptr factorial mov fact ,ax mov bx,ax call near ptr binhex53子程序factorialfactorial proc nearpushcxmovcx,bxxx:mul bxdec b
42、xloop xxpop cxretfactorial endp54mov bx, offset strpush bxcall reverspop bxmov dl, bxmov ah, 2int 21hrevers proc near push ax push bx push dx push bp mov bp, sp mov bx, bp+10 mov al, bx cmp al, $ jne re_call jmp returnre_call: inc bx push bx call revers pop bx mov dl, bx mov ah, 2 int 21h例:将字符串反序输出return: pop bp pop dx pop bx pop ax retrevers endp55例例6.8 十六进制到十进制的转换程序(十六进制到十进制的转换程序(通过寄存器传送变量通过寄存器传送变量)hexidec se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司雇佣个人合同范例
- 虾滑工艺流程汇报
- 产品委托代销合同范例
- 公司策划部门招工合同范例
- 两人打井合同范例
- 公司项目提成合同范例
- 到期结算合同范例
- 公司用工合同范例6
- 内墙涂料修补合同范例
- 【初中数学】用图像表示变量之间的关系(第2课时)教学设计 2024-2025学年北师大版数学七年级下册
- 《渡槽安全评价导则》
- 2025年园林绿化工(高级)考试题库及答案
- 2024春四年级上下册音乐测试专项测试题及答案
- 多发伤骨折护理查房
- 沙特阿拉伯2030年愿景
- 2023年软件评测师《基础知识》考试题库(浓缩500题)
- 中建预制构件吊装安全专项施工方案
- 《马化腾创业经历》课件
- 2023年湖北省生态环保有限公司招聘笔试真题
- 2023年新疆事业单位开展招聘考试真题
- 学校班主任谈心制度实施方案
评论
0/150
提交评论