收藏 分享(赏)

第四章 汇编语言及其程序设计.ppt

上传人:hyngb9260 文档编号:8160209 上传时间:2019-06-11 格式:PPT 页数:139 大小:1.26MB
下载 相关 举报
第四章  汇编语言及其程序设计.ppt_第1页
第1页 / 共139页
第四章  汇编语言及其程序设计.ppt_第2页
第2页 / 共139页
第四章  汇编语言及其程序设计.ppt_第3页
第3页 / 共139页
第四章  汇编语言及其程序设计.ppt_第4页
第4页 / 共139页
第四章  汇编语言及其程序设计.ppt_第5页
第5页 / 共139页
点击查看更多>>
资源描述

1、1,微机原理与测控接口技术,北京邮电大学自动化学院 叶 平Email: Ping.YETel: 62282571,2,第四章 汇编语言及其程序设计,3,本章教学目标,一、宏汇编1. 掌握常用的伪指令:DB,DW,DD,EQU,=,ORG,SEGMENT.ENDS,PROCENDP,ASSUME, MACROENDM,LOCAL,END等2. 如何汇编、连接生成 .EXE文件二、程序设计1. 能用汇编语言编写程序(一般约40条左右)。2. 能熟练运用各种伪指令,包括会用宏指令(宏定义中如何用LOCAL定义标号)。3. 能对程序改错,查错且会完善程序(程序填空)。4. 编程的题型可能有程序改错、查

2、错、完善、编程等。,4,第一节 x86系列汇编语言格式,5,用汇编语言编写的程序,汇编源程序必须翻译成机器码表示的程序,计算机才能运行。汇编程序是将汇编语言程序翻译成机器语言的一种系统程序 汇编格式指令与机器指令一一对应,用机器码编程:A0 00 2002 06 01 20A2 02 20,用汇编语言编写的程序段为: MOV AL , var1 ADD AL , var2 MOV var3 , AL,6,例 在内存中有一个数据块,其首地址为buffer (3000H:0200H),其中存放16位的符号数20个。现要找出其中的最大值,并将其存入MAX字单元(其偏移地址为0228H)。 借助808

3、6汇编指令,可以编写出如下程序:,MOV AX,3000HMOV DS,AXMOV SI,0200HMOV CX,14HDEC CXMOV AX,SI CHK: ADD SI,2,CMP SI,AXJLE NEXTMOV AX,SI NEXT: LOOP CHKMOV 0228H,AXINT 20H,7,存储器分段 code segmentcode ends伪指令:不是真正的指令代码;不产生机器代码;指示汇编程序做何种操作,定义代码段、数据段在何处。code segmentassume cs: codemov ax, 3000hmov ds, axmov si, 0200hmov cx, 14

4、h,段名 segment 定位类型 组合类型 类别 段名 ends ( Page135 段定义语句),dec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends,8,data segment data ends stack segment stack ends code segmentassume cs: code, ds: data, ss:stackmov ax, 3000hmov ds, axmov si, 0200hmov cx, 14h,dec

5、 cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends,1、定义数据段和堆栈段 2、定义变量,变量名 DB 表达式;,DB、DW、DD等,9,data segmentbuffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -1668,-32766dw 32765, -525, 300count dw 20 max dw ?data ends stack segment

6、 stack ends code segmentassume cs: code, ds: data, ss:stackmov ax, 3000hmov ds, axmov si, 0200hmov cx, 14h,dec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends,10,data segmentbuffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -166

7、8,-32766dw 32765, -525, 300count dw 20 max dw ?data ends stack segment stack ends code segmentassume cs: code, ds: data, ss:stackmov ax, datamov ds, axlea si, buffermov cx, count,dec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov max, axint 20hcode ends,11,data segmentbuffer

8、 dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -1668,-32766dw 32765, -525, 300count dw 20 max dw ?data ends stack segmentdb 100 dup (?) stack ends code segmentassume cs: code, ds: data, ss:stack start: mov ax, datamov ds, axlea si, buffermov cx, count,dec cxmov ax, sichk: add si,

9、 2cmp si, axjle nextmov ax, sinext: loop chkmov max, axint 20hcode endsend start,12,指令格式标号:(前缀指令) 助记符(操作数);(注释) 字符集 符号的第一个字符必须是字母、“_”(下划线)、“?”或“”; 从第二个字符起,除以上字符外,还可以是数字; 不使用汇编程序中的保留字; (如指令的助记符等) 对定义的符号不区分大小写; x,pos100,?date,fir都是合法符号; 10by,cas col是非法字符。 操作数: 常数、寄存器、内存操作数、标号名、过程名或表达式等,CHK: ADD SI,2 ;

10、 地址加2,REP MOVSB ;CX-1,13,data segmentbuffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -1668,-32766dw 32765, -525, 300count dw 20 max dw ?data ends stack segmentdb 100 dup (?) stack ends code segmentassume cs: code, ds: data, ss:stack start: mov ax, datamov ds, axlea si, buffe

11、rmov cx, count,dec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov max, axint 20hcode endsend start,;max.asm,14,汇编语言中的常量、变量和标号 1、常量常量可以是二、十、八或十六进制数,也可以是字符串。 10100101B ;二进常数 256D 或256 ;十进常数(缺省/默认) 356Q 或356O ;八进常数 2AFH ;十六进常数 0ABCDH ;十六进常数,但十六进常数的第一个字符必须是数字。 ABCD ;字符串常数,汇编后对应为

12、相应的ASCII码:41H44H 1234 ; 数字字符串常数,字符串需用单引号 ,汇编后为31H34H,15,2、变量变量实际上代表着内存单元,也称内存变量(内存操作数),它必然具有段基址和段内偏移量。变量有三个属性:段基址,段内偏移量及类型(字节数)。规定: 字节变量 1 字节 ; one DB 01h字变量 2 字节 ; two DW ?双字变量 4 字节 ; three DD 04030201h,16,3、标号实际上是代码段中某一指令的地址,同样具有三个属性:段基址、段内偏移量与类型。类型有:FAR、NEAR、SHORTFAR (段间引用)NEAR(段内引用)注意:常量、变量的名字以及

13、标号不能用汇编语言的保留字,即:(指令助记符,CPU的寄存器名,伪指令的符号等) 例如: AAA: MOV AX, DATA ;错误,AAA不能做标号DAA DB ? , ? ; 错误,DAA不能做变量名,CMP AX, BX JGE great XCHG AX, BX great: MOV max, AX,17, CS:0109 80FA3A CMP DL, 3AH CS:010C 7E03 JLE 0111CS:010E 80EA07 SUB DL, 07CS:0111 B104 MOV CL, 04CS:0113 D0E2 SHL DL, 1 ,MOV DL, 04,B204,18, C

14、S:0109 B204 MOV DL, 04CS:010B 80FA3A CMP DL, 3A CS:010E 7E03 JLE 0111CS:0110 80EA07 SUB DL, 07CS:0113 B104 MOV CL, 04CS:0115 D0E2 SHL DL, 1 ,jLess:,jLess,19,4、表达式 (page 129)由常量、标号、变量和一些操作符(运算符)构成。汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。据表达式所表示的内容分为:数字表达式、地址表达式。表达式是指令的操作数;表达式中的操作符由汇编程序完成计算。例 MOV AX, 12

15、- 4 ; MOV AX, 8 ; 数字表达式LEA BX, string + 4 ; 地址表达式,20,例: 1. 算术运算符 ( +、-、*、/、MOD(%) ) MOV AX, 6 8 MOV AX, 48 MOV AX, 100 MOD 13 MOV AX, 9 2. 逻辑运算符 (AND、OR、NOT、XOR) 位操作MOV AX, 80h OR 70h MOV AX,0F0h 3. 关系运算符 ( EQ、NE、GT、GE、LT、LE )真:FFFFH; 假: 0 MOV AX, 1 GE 2 MOV AX, 0,21,4. 分析运算符TYPE,LENGTH,SIZE ,OFFSET

16、,SEG操作数必须是内存操作数,即变量或标号 TYPE格式:TYPE variable 变量 或 label 标号 回送变量以字节数表示的类型(DB为1,DW为2,DD为4,DQ为8,DT为10) 回送标号类型数值(NEAR为,FAR为2)例: ARRAY DW 1,2,3ADD SI,TYPE ARRAY经汇编程序后的形式:ADD SI,2,; express.asm,22, LENGTH 格式:LENGTH variable对于变量中使用DUP,汇编回送分配给变量单元数,其他情况回送1。 例: FESS DD 100 DUP(1)对于 MOV CX,LENGTH FESS汇编后的形式:MO

17、V CX,100 SIZE 格式:SIZE variable回送分配给该变量的字节数 LENGTH * TYPE 例: FEES DD 100 DUP(1)MOV CX,SIZE FEES将形成:MOV CX,400,23,例如 M1 DW 1, 2, 3 汇编后形成指令:M2 DB ABCD MOV BL, LENGTH M1 MOV BL, 1 MOV AL, LENGTH M2 MOV AL, 1MOV CL, SIZE M1 MOV CL, 2 MOV CH, SIZE M2 MOV CH, 1,24,OFFSET 格式: OFFSET variable 变量 或 label 标号取出

18、变量或标号所在段的偏移地址例 MOV BX , OFFSET yy ; MOV BX, 100H 等价于LEA BX, yySEG 格式: SEG variable 变量 或 label 标号取出变量或标号所在段的段基址例 MOV AX , SEG yy,25,TYPE变量的返回值是类型的字节数:DB为1,DW为2,DD为4,DQ为8,DT为10; 2. TYPE标号的返回值是:NEAR为-1,FAR为-2。 3. LENGTH变量返回:DUP分配的单元数,对于其他情况则返回1。 SIZE返回值是: LENGTH和TYPE值的乘积,即变量的字节数。,26,27,5. 合成运算符 PTR、THI

19、S、HIGH、LOW、SHORTPTR用来给已分配的存储单元赋予新的属性,以保证操作数的匹配。例: F1 DB 16H,18HF2 DW 1234H MOV AX , WORD PTR F1 ;转换成字类型与AX匹配MOV BL, BYTE PTR F2 ;转换成字节类型与BL匹配,28,THIS 用来规定所指变量或标号的类型属性或距离属性;类型:BYTE,WORD,DWORD;距离:NEAR、FAR例 FIRST EQU THIS BYTE ;将字节属性赋予FIRSTTABLE DW 200 DUP(?)MOV AX, TABLE + 2MOV TABLE,0100HMOV byte ptr

20、 TABLE, 01hMOV FIRST,01h,与PTR类似,29,HIGH、LOW、SHORT (自学),30,第二节 伪指令语句,31, 宏汇编语言中包括如下伪指令语句 数据定义语句 (Data definition ) 符号定义语句 (Symbol definition) 过程定义语句 (Procedure definition) 段定义语句 (Segmentation definition) 分组定义语句 (Group) 结束定义语句 (Termination) 主要介绍常用的基本的一些伪指令:即符号、数据、段、过程、结束等伪指令。,32,1、数据定义语句格式:符号名 DB 表达式字

21、节 表达式可以是下列情况之一: 一个或多个字符的字符串(只限于DB类型); 重复子句:重复次数 DUP (表达式) (DUPlicate)ONE DB 1,2,3,4,5 ;定义了5个常数TWO DB A ; 定义了一个字符THREE DB Welcome you! ; 定义了一个字符串FOUR DB ?,? ; 预置两个不确定的值SIX DB 16 DUP (5,6,7) ;占用48个内存单元,33,BUF DW 1122,3344,5566 ;定义了3个字(16位)常数BUF1 DW 128*4 ; 定义了一个常数表达式,由汇编来运算BUF2 DW 100 DUP (?) 定义双字(DD)

22、,四个字(DQ),10个字节(DT)DD(Define Doubleword);定义双字(4个字节)DQ(Define Quadword ) ;定义4个字(8个字节)DT (Define Tenbyte) ;定义10个字节DD、DQ、DT与DB/DW语句类似,但不能定义字符串。THREE DB Welcome to Beijing! ; 定义了一个字符串,34,字节变量 1 字节 ; array DB 01h,02h,03h,04h字变量 2 字节 ; array DW 0201h,0403h双字变量 4 字节 ; array DD 04030201h,35,2、符号定义语句赋值语句: 符号名

23、 EQU 表达式给符号定义一个值或其他符号名,甚至定义一条可执行指令等。EQU对一个符号名只许定义一次。汇编时用语句中的表达式代替程序中符号所在的地方。例如 COUNT EQU 20 ;把常数 20 赋给 COUNTBLOCK EQU $-BUF ; 把$-BUF 的值赋给BLOCK,36,B EQU 2BX P8 EQU ES:2BX CBD EQU ADD定义符号常量,方便修改程序; 某表达式多次出现时,用等值操作可以方便编程; 汇编时不给符号常量分配内存。,37,等号语句(=)格式:符号名 = 表达式说明:此语句的功能与 EUQ 类似,但该语句在一个程序中可以对同一符号名多次再定义。例如

24、 A1 = 10 ; A1 定义为 10A1 = 100 ; A1重定义为100A1 EQU 20 ; 出错,因为A1已定义过, ; 不能再用EQU重新定义。,38,标号定义语句(LABEL)标号名 LABEL 属性(NEAR/FAR) 用冒号定义标号(标号名: ),只能定义NEAR属性 使用LABEL伪指令定义标号,可定义NEAR或FAR属性NEXT: CALL N-STEP ;定义NEXT为NEAR属性的标号。FIRST LABEL FAR ;定义FIRST为FAR标号。其地址为该MOV AX,CX ;语句的下一条语句的地址。,39,3、过程定义语句 (Page 139)格式:过程名 PR

25、OC ( NEAR /FAR ) ;缺省值为NEAR RET过程名 ENDP说明: 该语句的PROC与ENDP必须成对出现,过程名前后必须一致。 属性可以是NEAR或FAR,表示该过程可以被段内调用或段间调用。例如 SUBPROG PROC FAR 主程序如下 CODE SEGMENTRETF ASSUME CS:CODE,DS:DATA SUBPROG ENDP CALL SUBPROG CODE ENDS,40,4、段定义语句 (Page 135)格式:段名 SEGMENT 定位类型 组合类型 类别段名 ENDS 说明: 这两个伪操作总是一起出现。该语句将汇编语言源程序分成段,由该语句规定

26、哪个段是代码段,哪个段是数据段或堆栈段。 段名不能省略,由程序员指定段名,两处段名必须一致。 方括号中的三项是可选项,是赋给段名的属性。各项顺序不能错,且用空格分开。,41, 定位类型 表示此段的起始边界要求,可以是PAGE,PARA,WORD或BYTE之一。表示如下的地址要求:PAGE = 0000 0000 BPARA = 0000 B (默认值)WORD = 0BBYTE = B它们分别表示以页、节、字、字节为段的地址边界,若此 项省略,则默认值为PARA(paragraph)。,42, 类别 需用单引号括起来,可以是任何合法的名称;如STACK, DATA, CODEcode segm

27、ent CODEassume cs:code,ds:data,ss:stackmain proc farcall read mov si, offset lista mov di, offset listbmain endp code ends 若采用CodeView进行符号调试(源代码),则必须有 CODE,段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,data segment DATAlista db 55hlistb db 55h data ends,43, 组合类型 用来告诉连接程序(LINK)本段与其他段的关系。NONE:本段与其他段逻辑上没有关系,每段都有自己的基

28、地址。(默认值)PUBLIC 把本段与同名同类别的其他段连接成一个段。COMMON 为本段和同名同类型的其他段指定相同的基址。各段会产生覆盖。AT表达式 把本段放在表达式的值所指定的地址上(偏移量按 0 处理),STACK 此段为堆栈段,LINK要求被连接的程序至少有一个STACK段。MEMORY 把本段定位在所有其他段之上。,44,data segment DATAlistax db 55hlistbx db 55h data ends public read code segment CODEread proc farmov si, offset listax mov di, offset

29、 listbxmov cx,100retread endp code ends end,data segment DATAlista db 55hlistb db 55h data ends stack segment stack stackdw 6 dup(?) stack ends extrn read: far code segment CODEassume cs:code,ds:data,ss:stackmain proc farcall read mov si, offset listamov di, offset listbmain endp code ends end main,

30、4_2.asm,4_3.asm,45,data segment public DATAlistax db 55hlistbx db 55h data ends public read code segment CODEread proc farmov si, offset listax mov di, offset listbxmov cx,100retread endp code ends end,data segment public DATAlista db 55hlistb db 55h data ends stack segment stack stackdw 6 dup(?) st

31、ack ends extrn read: far code segment CODEassume cs:code,ds:data,ss:stackmain proc farcall read mov si, offset lista mov di, offset listbmain endp code ends end main,4_2.asm,4_3.asm,46,data segment common DATAlistax db 55hlistbx db 55h data ends public read code segment CODEread proc farmov si, offs

32、et listax mov di, offset listbxmov cx,100retread endp code ends end,data segment common DATAlista db 55hlistb db 55h data ends stack segment stack stackdw 6 dup(?) stack ends extrn read: far code segment CODEassume cs:code,ds:data,ss:stackmain proc farcall read mov si, offset listamov di, offset lis

33、tbmain endp code ends end main,4_2.asm,4_3.asm,47,段寻址语句(ASSUME)格式:ASSUME 段寄存器:段名, 由于段名是任意的 ,汇编程序并不知道哪个段名对应哪个 段,所以要用ASSUME伪指令来指明段寄存器与段名之间的关系。 必须写在代码段中,一般在段定义语句之后。 段寄存器可以是CS,DS,SS,ES 之一。ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA,48,code segment common DATAlistax db 55hlistbx db 55h code ends public re

34、ad data segment CODEread proc farmov si, offset listax mov di, offset listbxmov cx,100retread endp data ends end,code segment common DATAlista db 55hlistb db 55h code ends stack segment stack stackdw 6 dup(?) stack ends extrn read: far data segment CODEassume cs:data,ds:code,ss:stackmain proc farcal

35、l read mov si, offset listamov di, offset listbmain endp data ends end main,4_2.asm,4_3.asm,49,对DS和ES,需要使用寄存器赋值语句,例如: code segment assume cs: code , ds: data , es: edata , ss: stack start: mov ax , seg datamov ds , axmov ax , seg edatamov es , ax code ends,50,对于SS寄存器,有两种情况。一是在程序中定义了组合类型是STACK的段,并在AS

36、SUME语句中建立了该段与SS寄存器的联系。例如: stack segment stackdb 256 dup (?) stack ends code segmentassume cs: code , ds: data , ss: stack code ends在这种情况下,程序执行时,SS会自动装入STACK段的地址,SP也会自动装入,因此不必用指令语句进行赋值。,51,另一种情况,如果没有定义stack组合类型的段,就需要用与DS和ES段同样的方式进行赋值,而且,还要对SP进行赋值,如: stack segmentst db 256 dup (?) stack ends code segm

37、entassume cs: code , ds: data , ss: stack start: mov ax , seg stackmov ss , axmov sp , size st code ends,52,定义偏移地址语句(ORG-origin)格式:ORG 表达式该语句指定了在它之后的程序段或数据块存放的起始地址的偏移量,语句中表达式的值就是起始地址,从该地址连续存放程序或数据,除非遇到一个新的ORG语句。例如 DATA SEGMENTORG 1000HBUF DB 10 DUP (20H) DATA ENDS,53,地址记数器( $ )用来标识汇编程序当前的位置例 在数据段定义的

38、常量和变量如下W1 DW 0B3HC4 EQU $ - W1B1 DB ABCC0 EQU $-B1W2 DW -4,1234H,0F4ADH,923FHC1 EQU($-W2)/2 C2 EQU ($-W2),B3,00,41,42,43,W1,B1,FB,FF,34,12,F4,W2,000,001,002,003,004,005,3F,92,$,AD,54,5、分组语句格式:组名 GROUP 段名,段名,说明: 该语句又称为群伪指令。它可以将若干段说明为使用同一物理段,以组名表示其段基址。由段定义伪指令定义的各个逻辑段各有不同的物理段基址。 当段的数量较多时,而段寄存器只有四个,为避免进

39、行段寄存器的切换,用GROUP伪指令即可实现。 组名与段名具有相同的属性,且可以直接作为段超越符使用。段名可以是已定义的段名,也可以由“SEG 变量名”或 “SEG 标号”等表达式取代。,55,数据段:64K,data1,data2,data3,data1,data2,data3,64K,data GROUP data1,data2,data3,数据段:64K,数据段:64K,56,6、结束语句格式:END 表达式说明: 该语句表示整个源程序的结束,它告诉汇编程序汇编任务到此结束。 表达式必须是源程序的起始地址或入口地址。 如果几个模块连接在一起,则只能指定主模块的起始地址。 其他模块不能有起

40、始地址。 如果不使用选择项表达式,则没有起始地址传递给LINK。 程序就不知道从何处启动。例如END START ;START为源程序的起始地址。,57,data segment DATAlistax db 55hlistbx db 55h data ends public read code segment CODEread proc farmov si, offset listax mov di, offset listbxmov cx,100retread endp code ends end,data segment DATAlista db 55hlistb db 55h data

41、ends stack segment stack stackdw 6 dup(01) stack ends extrn read: far code segment CODEassume cs:code,ds:data,ss:stackmain proc farcall read mov si, offset listaa mov di, offset listbmain endp code ends end main,4_2.asm,4_3.asm,58,第三节 宏汇编和宏指令,59, code segment CODEassume cs:code,ds:data,ss:stack star

42、t: mov cl, 3shl bx, cland bx, 0fh mov cl, 2shl ax, cland ax, 0fh code ends ,名字 MACRO 参数,参数,语句(系列)ENDMshift macro x, y ; 定义的宏名shiftmov cl, x ; x,y为形式参数shl y, cland y, 0fhendm,60, code segment CODEassume cs:code,ds:data,ss:stack start: mov cl, 3shl bx, cland bx, 0fh mov cl, 2shl ax, cland ax, 0fh code

43、 ends , code segment CODEassume cs:code,ds:data,ss:stack start: shift 3, bxshift 2, ax code ends ,shift macro x, y ; 定义的宏名shiftmov cl, x ; x,y为形式参数shl y, cland y, 0fhendm,宏定义,宏调用,61, code segment CODEassume cs:code,ds:data,ss:stack start: shift 3, bxshift 2, ax code ends ,宏展开,shift 3, bxB1 03 1 mov

44、cl, 3 D3 E3 1 shl bx, cl 83 E3 0F 1 and bx, 0fh shift 2, axB1 02 1 mov cl, 2 D3 E0 1 shl ax, cl 25 000F 1 and ax, 0fh ,62,实参与形参 实参数目=形参数目,则一一对应 实参数目形参数目,多余的实参被忽略,shift macro x, y ; 定义的宏名shiftmov cl, x ; x,y为形式参数shl y, cland y, 0fhendm, code segment CODEassume cs:code,ds:data,ss:stack start: shift 3,

45、 bxshift 2, ax code ends ,63,形参不仅可以是操作数,还可以是指令。addec macro op, xmov al, xop alendmaddec inc, 3addec dec, 34H,宏定义,宏调用,64,宏运算符:&,!,%&: 宏替换运算符movereg macro x, y, zmov cl, ys&z x, clendmmovereg ax, 3, hlmovereg ax, 3, hr,mov cl, 3 shl ax, cl,mov cl, 3 shr ax, cl,65,标号, 把一个字节的十六进数转换成ASCII码放入内存中 hex2ascii macro x cmp x, 0ah jc lp1 lp1: add x, 30hjc lp2lp2: add x, 30h endm, code segment CODEassume cs:code start: hex2ascii bh code ends ,local lp1, lp2, code segment CODEassume cs:code start: hex2ascii bhhex2ascii bl code ends ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报