第四讲汇编语言

上传人:无*** 文档编号:217525821 上传时间:2023-06-13 格式:PPT 页数:76 大小:1.92MB
收藏 版权申诉 举报 下载
第四讲汇编语言_第1页
第1页 / 共76页
第四讲汇编语言_第2页
第2页 / 共76页
第四讲汇编语言_第3页
第3页 / 共76页
资源描述:

《第四讲汇编语言》由会员分享,可在线阅读,更多相关《第四讲汇编语言(76页珍藏版)》请在装配图网上搜索。

1、第四讲第四讲_汇编语言汇编语言本章内容本章内容l汇编语言源程序的格式汇编语言源程序的格式l伪操作命令伪操作命令lDOS及及BIOS功能调用功能调用计算机程序设计语言的演变计算机程序设计语言的演变 1.机器语言机器语言直接用机器指令来编制计算机程序的方法。直接用机器指令来编制计算机程序的方法。2.汇编语言汇编语言可以用助记符来表示指令的操作和操作数,也可以用标可以用助记符来表示指令的操作和操作数,也可以用标号和符号来代替地址、常量和变量。号和符号来代替地址、常量和变量。3.高级语言高级语言更接近于人们的自然语言和习惯的教学语言来描述算法更接近于人们的自然语言和习惯的教学语言来描述算法的执行过程,

2、从而使编写的过程更加直观和简练。的执行过程,从而使编写的过程更加直观和简练。为什么要用汇编语言为什么要用汇编语言l汇编语言非常接近机器语言程序,通过编制汇编语汇编语言非常接近机器语言程序,通过编制汇编语言程序,可以言程序,可以清楚清楚地了解计算机的工作过程。地了解计算机的工作过程。l现在的微机系统中,现在的微机系统中,底层底层的一些功能仍然靠汇编语的一些功能仍然靠汇编语言程序来实现。言程序来实现。l汇编语言程序的汇编语言程序的效率效率通常高于高级语言程序。通常高于高级语言程序。举例举例 data SEGMENTmsg DB Hello,World!$data ENDScode SEGMENTA

3、SSUME CS:code,DS:dataMAINPROC NEARstart:MOV AX ,data MOVDS ,AX LEA DX ,msg MOV AH ,9h INT 21h MOV AX ,4C00h INT 21hMAINENDPcode ENDSEND start数据段数据段代码段代码段l在屏幕上显示在屏幕上显示Hello,World!本例将在下文中多次提及,本例将在下文中多次提及,为方便计,下文简称其为为方便计,下文简称其为“Hello例例”。结束语句结束语句分析分析1分段结构分段结构l可以看出,汇编语言源程序是可以看出,汇编语言源程序是分段结构分段结构的形式。的形式。一个

4、汇编源程序由若干个段一个汇编源程序由若干个段(Segment)组成。组成。每个段以每个段以SEGMENT语句开始,以语句开始,以ENDS结束。结束。整个源程序以整个源程序以END语句结尾。语句结尾。l这里所说的汇编语言源程序的这里所说的汇编语言源程序的段段和第一章中的和第一章中的CPU管理的管理的存储器的存储器的段段是不同的概念。是不同的概念。汇编语言的段是逻辑段;汇编语言的段是逻辑段;8086CPU管理的存储器的段是物管理的存储器的段是物理段理段(共有共有4个:数据段、附加段、堆栈段、代码段,对应个:数据段、附加段、堆栈段、代码段,对应4个段寄存器:个段寄存器:DS、ES、SS和和CS)。一

5、个汇编语言源程序中可以有多个逻辑段。一个汇编语言源程序中可以有多个逻辑段。l上例中共有两个逻辑段:上例中共有两个逻辑段:data和和code。分析分析2注:注:功能号功能号09H的的int 21中断中断功能描述功能描述:输出一个字符串到标准输出设备上。输出一个字符串到标准输出设备上。入口参数入口参数:AH09H DS:DX待输出字符的地址待输出字符的地址说明说明:待显示的字符串以:待显示的字符串以$作为其结束标志作为其结束标志 代码段开头执行了一次功能号代码段开头执行了一次功能号09H的的21号号DOS中断,用于在中断,用于在屏幕上显示字符串。关于屏幕上显示字符串。关于DOS功能调用功能调用,

6、后文将有详细解释。,后文将有详细解释。此处先列出功能号此处先列出功能号09H的的21号号DOS中断的相关资料:中断的相关资料:最后两行最后两行(MOV AX,4C00h、INT 21h)也是一个也是一个DOS功能调用。功能调用。注:注:功能号功能号4CH的的int 21中断中断功能描述功能描述:终止程序的执行,并可返回一个代码终止程序的执行,并可返回一个代码 入口参数入口参数:AH4CH AL返回的代码返回的代码 汇编语言开发过程汇编语言开发过程 源程序源程序源程序源程序:文件名文件名文件名文件名.asm.asm目标程序目标程序目标程序目标程序:文件名文件名文件名文件名.obj.obj可执行文

7、件可执行文件可执行文件可执行文件:文件名文件名文件名文件名.exe.exeFinishFinish编辑器,如编辑器,如notepad.exe汇编程序,如汇编程序,如masm.exe链接程序,如链接程序,如link.exe调试程序,如调试程序,如debug.exe开发工具开发工具(了解了解)X86+Windows平台下常用的汇编编译器有:平台下常用的汇编编译器有:lMicrosoft公司的公司的 MASMlBorland公司的公司的 TASMl开源社区的开源社区的 NASMMASM是是微软微软推出的宏汇编语言,自发布以来已有多次版本更推出的宏汇编语言,自发布以来已有多次版本更新,下页表格中列出了

8、几个较为典型的版本。新,下页表格中列出了几个较为典型的版本。注:注:容易与之混淆的是容易与之混淆的是MASM32,它是,它是Steve Hutchesson以个人以个人名义发布、基于名义发布、基于MASM而构建的软件包。其版本号和而构建的软件包。其版本号和MASM的版本号是不同的,比如的版本号是不同的,比如MASM32V8使用的汇编编使用的汇编编译器是译器是MASM6。MASM32的最新版本为的最新版本为MASM32V12。MASM版本历史版本历史(了解了解)MASM 4.00 最先广泛使用的一个最先广泛使用的一个MASM版本,适用于版本,适用于DOS下的汇编编程下的汇编编程MASM 5.00

9、 开始支持开始支持.code .data写法的段定义格式写法的段定义格式(即即“简化段定义格式简化段定义格式”)MASM 6.00 1992年发布年发布,可执行文件名从可执行文件名从Masm.exe改为改为Ml.exe 开始支持开始支持.if/.endif这样的高级语法这样的高级语法 开始支持开始支持invoke伪指令来简化带参数的子程序调用伪指令来简化带参数的子程序调用MASM 6.152000年年4月发布月发布MASM 8.00随随VS2005一起发布,是目前为止最新的版本一起发布,是目前为止最新的版本开发工具开发工具(了解了解)Masm5适合进行适合进行DOS程序开发;程序开发;Masm

10、6以后的版本开始支持以后的版本开始支持Win32程序开发。程序开发。(微软官方发布的微软官方发布的Masm6所附的所附的link.exe是是Segmented Executable Linker,只能开发,只能开发DOS程序;要进行程序;要进行Win32开发必须配备开发必须配备Incremental Linker,该类型的,该类型的link.exe可以从可以从Visual Studio中获取。开发中获取。开发Win32程序推荐使用程序推荐使用MASM32开发包开发包)开发开发DOS程序的程序的Masm下载地址:下载地址:Masm5.00 罗云彬的编程乐园罗云彬的编程乐园 http:/211.9

11、0.241.130:22366/view.asp?file=51Masm615 For Dos aogo汇编小站汇编小站 http:/ 5.0开发步骤演示开发步骤演示(了解了解)使用使用MASM 6.15 For DOS语句的类型语句的类型l汇编语言源程序中的语句主要有以下两种类型:汇编语言源程序中的语句主要有以下两种类型:指令性语句指令性语句指示性语句指示性语句指令性语句指令性语句主要由主要由CPU指令组成,对应实际的机器指令;指令组成,对应实际的机器指令;(比如比如“Hello例例”中的中的 MOV DS,AX )指示性语句指示性语句又称伪操作语句,主要由伪操作指令组成。又称伪操作语句,主

12、要由伪操作指令组成。(比如比如“Hello例例”中的中的 code SEGMENT )语句的组成语句的组成l汇编语言的语句可以有汇编语言的语句可以有14个组成部分,如下所示:个组成部分,如下所示:名字名字 操作码操作码/伪操作码伪操作码 操作数操作数 ;注释注释带方括号的部分表示可选项。以带方括号的部分表示可选项。以“Hello例例”中的几条语句为例:中的几条语句为例:名字名字 操作码操作码/伪操作码伪操作码 操作数操作数注释注释dataSEGMENTmsg DBHello,World!$start:MOVAX,dataENDstart语句的组成语句的组成名字名字l名字名字在在指令性语句指令性

13、语句中,名字是一个标号,实际上就是指令的符号中,名字是一个标号,实际上就是指令的符号地址。比如地址。比如“start:MOV AX,data”中的中的 start:。并非每条指令。并非每条指令性语句都必须有标号。但如果有了这个标号,程序中其他地方性语句都必须有标号。但如果有了这个标号,程序中其他地方就可引用这个标号,比如执行跳转或者就可引用这个标号,比如执行跳转或者CALL调用。指令性语句调用。指令性语句中的标号后面通常有一个冒号。中的标号后面通常有一个冒号。标号有三种属性:标号有三种属性:段段、偏移量偏移量和和类型类型。段段属性是定义标号的程序段的段地址。属性是定义标号的程序段的段地址。偏移

14、量偏移量表示标号所在段的起始地址到定义该标号的地址之间表示标号所在段的起始地址到定义该标号的地址之间的字节数。的字节数。标号的标号的类型类型有两种:有两种:NEAR和和FAR。前者可以在段内被引用,。前者可以在段内被引用,地址指针为两个字节;后者可以在其他段中被引用,地址指针地址指针为两个字节;后者可以在其他段中被引用,地址指针为为4个字节。个字节。语句的组成语句的组成名字名字在在指示性语句指示性语句中,名字可以是变量名、段名、过程名。中,名字可以是变量名、段名、过程名。比如比如“Hello例例”中中“data SEGMENT”中的中的data是段名,是段名,“msg DB Hello,Wor

15、ld!$”中的中的msg是变量名。是变量名。指示性语句中的标号后面通常没有冒号。指示性语句中的标号后面通常没有冒号。变量也有三种属性:变量也有三种属性:段段、偏移量偏移量和和类型类型。段段属性是变量所代表的数据所在段的段地址。属性是变量所代表的数据所在段的段地址。偏移量偏移量表示变量所在段的起始地址与变量的地址之间的字节数。表示变量所在段的起始地址与变量的地址之间的字节数。变量的变量的类型类型有:有:BYTE、WORD、DWORD(四字节)、(四字节)、QWORD(八字(八字节)和节)和TBYTE(十字节)等,表示数据区中存取操作对象的大小。(十字节)等,表示数据区中存取操作对象的大小。语句的

16、组成语句的组成操作码操作码/伪操作码伪操作码l操作码操作码/伪操作码伪操作码在汇编语言中在汇编语言中操作码操作码以助记符的形式存在。以助记符的形式存在。8086/8088 CPU的助的助记符总共约有记符总共约有90多种,比如多种,比如MOV、ADC等。等。关于所有的助记符,参见第二章指令系统。关于所有的助记符,参见第二章指令系统。指示性语句中的指示性语句中的DB、SEGMENT、ENDS、ASSUME、END等等都是都是伪操作码伪操作码,而不是,而不是CPU指令的助记符。指令的助记符。它们在程序中的作用是它们在程序中的作用是定义变量的类型、定义段以及命令汇编定义变量的类型、定义段以及命令汇编程

17、序程序(masm.exe)结束汇编结束汇编 等。它们是等。它们是指示汇编程序指示汇编程序(masm.exe)完成汇编完成汇编,本身不产生对应的机器码。,本身不产生对应的机器码。关于伪操作码的具体作用和使用方法,下文有专门章节讨论。关于伪操作码的具体作用和使用方法,下文有专门章节讨论。语句的组成语句的组成操作数操作数l操作数操作数对于对于CPU指令,可能有单操作数和双操作数,也可能无操作数;指令,可能有单操作数和双操作数,也可能无操作数;伪指令可能有更多个操作数。伪指令可能有更多个操作数。可以用作操作数的有:可以用作操作数的有:常数、寄存器、标号、变量常数、寄存器、标号、变量和和表达式表达式。常

18、数常数十进制数,如十进制数,如99D或或99。后面加字母。后面加字母“D”,或者什么也不加。,或者什么也不加。十六进制数,如十六进制数,如64H,0F800H,后面加一个字母,后面加一个字母“H”;如果最;如果最高位数值不是高位数值不是09,前面要再加一个数字,前面要再加一个数字0。(以避免和寄存器名以避免和寄存器名称如称如“AH”冲突冲突)ASCII常数,例如常数,例如A、8、cat,字符应该放在单引号中。,字符应该放在单引号中。语句的组成语句的组成操作数操作数寄存器寄存器8086/8088的寄存器可以用作指令的操作数。的寄存器可以用作指令的操作数。8086/8088 CPU的的寄存器有:寄

19、存器有:8位寄存器:位寄存器:AH、AL、BH、BL、CH、CL、DH、DL。16位寄存器:位寄存器:AX、BX、CX、DX、SI、DI、BP、SP、DS、ES、SS、CS。标号标号标号代表一条指令的符号地址,因此可以作为转移、过程调用标号代表一条指令的符号地址,因此可以作为转移、过程调用CALL 以及循环控制以及循环控制 LOOP 等指令的操作数。等指令的操作数。比如比如“HELLO例例”中中“END start”,start就是一个标号。就是一个标号。语句的组成语句的组成操作数操作数变量变量变量是存储器中某个数据区的名字,因此在指令中可以作为存变量是存储器中某个数据区的名字,因此在指令中可

20、以作为存储器操作数。储器操作数。如如“Hello例例”中的:中的:LEA DX ,msg 其中其中 msg 就是一个在数据区定义的变量(就是一个在数据区定义的变量(msg DB Hello,World!$)。)。表达式表达式汇编语言中的表达式按其性质可以分为两种:数值表达式和地汇编语言中的表达式按其性质可以分为两种:数值表达式和地址表达式。址表达式。数值表达式数值表达式产生一个数值结果,只有大小,没有属性。产生一个数值结果,只有大小,没有属性。地址表达式地址表达式的结果不是一个单纯的数值,它有三种属性:段、的结果不是一个单纯的数值,它有三种属性:段、偏移量和类型。偏移量和类型。语句的组成语句的

21、组成操作数操作数构成表达式必然有构成表达式必然有运算符运算符。表达式中常用运算符有以下几种:。表达式中常用运算符有以下几种:算术运算符,如算术运算符,如+、-、*、/和和MOD(模除模除)这些算术运算符可用于数值表达式,运算结果是一个数值。在这些算术运算符可用于数值表达式,运算结果是一个数值。在地址表达式中通常只使用其中的地址表达式中通常只使用其中的+和和 两种运算符两种运算符。逻辑运算符逻辑运算符,如,如 AND、OR、XOR和和NOT逻辑运算符只用于数值表达式中对数值进行按位逻辑运算。对逻辑运算符只用于数值表达式中对数值进行按位逻辑运算。对地址进行逻辑运算是没有意义的。地址进行逻辑运算是没

22、有意义的。不要把逻辑运算符如不要把逻辑运算符如AND、OR、XOR和和NOT等与同样名称等与同样名称的的CPU指令相混淆。前者可对整常数进行按位逻辑运算,是在汇指令相混淆。前者可对整常数进行按位逻辑运算,是在汇编时进行;后者的操作数可以是寄存器、存储器和立即数,是在编时进行;后者的操作数可以是寄存器、存储器和立即数,是在程序运行时由程序运行时由CPU执行。比如:执行。比如:ANDAL,01011010B;这里的这里的AND是指令助记符是指令助记符MOVAL,01011010B AND 11110000B;这里的;这里的AND是逻辑运算符是逻辑运算符语句的组成语句的组成操作数操作数关系运算符关系

23、运算符 如如 EQ(等于等于)、NE(不等不等)、LT(小于小于)、GT(大于大于)、LE(小于或等于小于或等于)、GE(大于或等于大于或等于)等。等。参与关系运算的必须是两个数值,或同一段中的两个存储参与关系运算的必须是两个数值,或同一段中的两个存储单元地址,但运算结果只能是两个特定的数值之一。当关系不单元地址,但运算结果只能是两个特定的数值之一。当关系不成立(假)时,结果为成立(假)时,结果为0;当关系成立(真)时,结果为;当关系成立(真)时,结果为0FFFFH(-1)。例如:例如:MOV AX,4 EQ 3 ;关系不成立,故关系不成立,故(AX)0MOV AX,4 NE 3;关系成立,故

24、关系成立,故(AX)0FFFFH语句的组成语句的组成操作数操作数分析运算符和合成运算符分析运算符和合成运算符 如如 OFFSET、SEG、TYPE、SIZE和和LENGTH等;合成运算符有等;合成运算符有PTR、THIS、SHORT等。等。分析运算符用以分析一个在存储器操作数的属性,如段、分析运算符用以分析一个在存储器操作数的属性,如段、偏移量或类型等。合成运算符则可以规定存储器操作数的某个偏移量或类型等。合成运算符则可以规定存储器操作数的某个属性,例如类型。属性,例如类型。OFFSET用于获取一个标号或变量的偏移地址,如:用于获取一个标号或变量的偏移地址,如:MOV SI ,OFFSET D

25、ATA1是将变量是将变量DATA1的偏移地址送至的偏移地址送至SI寄存器。寄存器。其效果等同于:其效果等同于:LEA SI,DATA1 语句的组成语句的组成操作数操作数SEG用于获取标号或变量的段址,如:用于获取标号或变量的段址,如:MOV AX ,SEG ARRAYMOV DS ,AX是将变量是将变量ARRAY的段地址送入的段地址送入DS寄存器。寄存器。TYPE的运算结果是一个数值,这个数值与存储器操作数类型的运算结果是一个数值,这个数值与存储器操作数类型属性的关系如下:属性的关系如下:TYPE返回值返回值操作数类型操作数类型TYPE返回值返回值操作数类型操作数类型1BYTE1NEAR2WO

26、RD2FAR4DWORD语句的组成语句的组成操作数操作数TYPE运算符的例子运算符的例子VAR DW?ARRAY DD 10 DUP(?)STRDB This is a testMOV AX ,TYPE VAR;(AX)2MOV BX ,TYPE ARRAY;(BX)4MOV CX ,TYPE STR;(CX)1LENGTH 如果一个变量已用重复操作符如果一个变量已用重复操作符DUP说明其变量的个说明其变量的个数,则利用数,则利用LENGTH获取这个变量的个数。如果未用获取这个变量的个数。如果未用DUP说明,说明,则得到的结果为则得到的结果为1。比如上例中比如上例中,LENGTH ARRAY

27、运算结果为运算结果为10。语句的组成语句的组成操作数操作数SIZE 如果一个变量已用重复操作符如果一个变量已用重复操作符DUP说明,则利用说明,则利用SIZE运运算符可得到分配给该变量的字节总数。如果未用算符可得到分配给该变量的字节总数。如果未用DUP说明,则说明,则得到的结果是得到的结果是TYPE运算的结果。运算的结果。比如上例中比如上例中,SIZE ARRAY 运算结果为运算结果为10440。由此。由此可知,可知,SIZE的运算结果等于的运算结果等于LENGTH的运算结果乘以的运算结果乘以TYPE的的运算结果。运算结果。PTR 是一个合成运算符,用于指定存储器操作数的类型。是一个合成运算符

28、,用于指定存储器操作数的类型。比如比如 INC BYTE PTR BX SI,指令中利用指令中利用PTR运算符明确规定存储器操作数的类型为运算符明确规定存储器操作数的类型为BYTE(字节字节),因此,本指令将一个,因此,本指令将一个8位存储器的内容加位存储器的内容加1。语句的组成语句的组成操作数操作数THIS 也可以指定存储器操作数的类型。使用也可以指定存储器操作数的类型。使用THIS运算符可以运算符可以使标号或变量的类型具有灵活性。例如要求对同一个数据区,既使标号或变量的类型具有灵活性。例如要求对同一个数据区,既可以字节作为单位,又可以字作为单位进行存取,则可以用以下可以字节作为单位,又可以

29、字作为单位进行存取,则可以用以下语句:语句:AREAW EQU THIS WORDAREAB DB 100 DUP(?)上面的上面的AREAW和和AREAB代表同一个数据区,其中共有代表同一个数据区,其中共有100个字个字节,但节,但AREAW的类型为的类型为WORD,而,而AREAB的类型为的类型为BYTE。SHORT 指定一个标号的类型为指定一个标号的类型为SHORT(短标号),即标号到(短标号),即标号到引用标号的指令间的距离在引用标号的指令间的距离在-128127之间。短标号可用于无条之间。短标号可用于无条件转移和条件转移指令中。使用短标号的指令比使用默认的近标件转移和条件转移指令中。

30、使用短标号的指令比使用默认的近标号的指令少一个字节。号的指令少一个字节。语句的组成语句的组成操作数操作数方括号方括号 间接寻址指令的存储器操作数要在寄存器名间接寻址指令的存储器操作数要在寄存器名BX、BP、SI或或DI外面加上方括号,以表示存储器地址。又如,变址寻址外面加上方括号,以表示存储器地址。又如,变址寻址指令的存储器操作数既要用算术运算符将指令的存储器操作数既要用算术运算符将SI或或DI与一个位移量与一个位移量做运算,又要在外面加上方括号来表示存储器地址。做运算,又要在外面加上方括号来表示存储器地址。MOV CL ,BXMOV AL ,SI+5段超越运算符段超越运算符“:”是是“:”(

31、冒号)跟在段寄存器名(冒号)跟在段寄存器名(DS、ES、SS或或CS)之后表示段超越,用以给一个存储器操作数指定一个)之后表示段超越,用以给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么。例如:段属性,而不管其原来隐含的段是什么。例如:MOV AX ,ES:DIHIGH和和LOW 获取一个数值或地址表达式的高位和低位字节。获取一个数值或地址表达式的高位和低位字节。STUFF EQU 0ABCDH MOV AH ,HIGH STUFF ;(AH)0ABH MOV AL ,LOW STUFF ;(AL)0CD H语句的组成语句的组成操作数操作数如果一个表达式中同时具有多个运算符,那么按

32、照如果一个表达式中同时具有多个运算符,那么按照以下规则进行运算:以下规则进行运算:优先级高的先运算,优先级低的后运算;优先级高的先运算,优先级低的后运算;同一优先级按表达式中从左到右的顺序进行运算;同一优先级按表达式中从左到右的顺序进行运算;圆括号可提升运算优先级,圆括号内的运算符总是在其任何圆括号可提升运算优先级,圆括号内的运算符总是在其任何相邻的运算之前进行。相邻的运算之前进行。各种运算符的优先级顺序如下页图表所示。表中同一行的各种运算符的优先级顺序如下页图表所示。表中同一行的运算符具有同等优先级。运算符具有同等优先级。语句的组成语句的组成操作数操作数优先级优先级运算符运算符优先级优先级运

33、算符运算符1LENGTH,SIZE,WIDTH,MASK,(),8,(二元运算符),(二元运算符)2(结构变量名后面的运算符)(结构变量名后面的运算符)9EQ,NE,LT,LE,GT,GE3:(段超越预算符)(段超越预算符)10NOT4PTR,OFFSET,SEG,TYPE,THIS11AND5HIGH,LOW12OR,XOR6,(一元运算符),(一元运算符)13SHORT7*,/,MOD,SHL,SHR高高低低语句的组成语句的组成注释注释l注释注释和其他语言一样,汇编语言中的注释仅用于提高程序的和其他语言一样,汇编语言中的注释仅用于提高程序的可读性可读性。汇编语言中的注释前面要求加上分号(汇

34、编语言中的注释前面要求加上分号(;)。)。如果注释内容较多,超过一行,则换行以后前面还要加上分号。如果注释内容较多,超过一行,则换行以后前面还要加上分号。注释也可以从一行的最前面开始。注释也可以从一行的最前面开始。汇编程序汇编程序(masm.exe)对注释不予理会,即注释对汇编后产生的对注释不予理会,即注释对汇编后产生的目标程序目标程序没有任何影响。没有任何影响。伪操作指令伪操作指令l指示性语句中的伪操作指令,因其表示形式类似于指示性语句中的伪操作指令,因其表示形式类似于CPU指令,故称其为指令,故称其为“伪指令伪指令”。l伪指令与伪指令与CPU指令的区别:指令的区别:CPU指令是给指令是给

35、CPU 的指令,对应的指令,对应CPU的特定操作,如加法运算;的特定操作,如加法运算;而伪指令是给而伪指令是给 汇编程序汇编程序(masm.exe)的指令,指示汇编程序进行的指令,指示汇编程序进行操作,比如定义段、定义数据。操作,比如定义段、定义数据。CPU指令在汇编后产生一一对应的指令在汇编后产生一一对应的 目标代码目标代码,伪指令不产生与,伪指令不产生与之对应的目标代码。之对应的目标代码。l下面列出下面列出“Hello例例”的汇编源码及其对应的机器码的汇编源码及其对应的机器码 对比体会伪指令的作用。对比体会伪指令的作用。Hello,World!的汇编源代码的汇编源代码Hello,World

36、!的机器代码的机器代码Hello,World!机器代码的分析机器代码的分析可以看到,编译后的机器代码中,可以看到,编译后的机器代码中,伪指令伪指令都已经不见了。原来都已经不见了。原来的代码段中每条指令性语句都对应一条机器码。的代码段中每条指令性语句都对应一条机器码。汇编源代码中的第一句汇编源代码中的第一句MOV AX,data经编译后变成经编译后变成MOV AX,1449。这是因为编译器。这是因为编译器(masm.exe)将数据段放在将数据段放在 1449:0000 1449:0000 的位的位置。然后将置。然后将DS:DX指向该位置,通过指向该位置,通过INT21的的09H中断将其显示中断将

37、其显示出来。出来。资料回顾:资料回顾:功能号功能号09H的的int 21中断中断功能描述功能描述:输出一个字符串到标准输出设备上。输出一个字符串到标准输出设备上。入口参数入口参数:AH09H DS:DX待输出字符的地址待输出字符的地址说明说明:待显示的字符串以:待显示的字符串以$作为其结束标志作为其结束标志 Hello,World!机器代码的分析机器代码的分析l下图使用下图使用 d 1449:0000显示了数据段中的内容:显示了数据段中的内容:伪操作指令伪操作指令l宏汇编程序宏汇编程序MASM提供了数十种伪操作。提供了数十种伪操作。(这里也揭示了操作码和伪操作码的另一个区别:这里也揭示了操作码

38、和伪操作码的另一个区别:伪操作码随伪操作码随编译器编译器的不同而不同;的不同而不同;而操作码随而操作码随CPU的不同而不同。的不同而不同。)l根据伪操作的功能,大致可以分为下列几类:根据伪操作的功能,大致可以分为下列几类:伪操作指令分类伪操作指令分类伪操作类型伪操作类型举例举例处理器方式伪操作处理器方式伪操作.8086、.386数据定义伪操作数据定义伪操作DB、DW、DD、RECORD符号定义伪操作符号定义伪操作EQU、LABEL段定义伪操作段定义伪操作SEGMENT/ENDS、ASSUME过程定义伪操作过程定义伪操作PROC/ENDP模块定义与连接伪操作模块定义与连接伪操作NAME、END、

39、PUBLIC宏处理伪操作宏处理伪操作MACRO/ENDM、PURGE条件伪操作条件伪操作IF、IFE、IFDEF列表伪操作列表伪操作.LIST、TITLE、PAGE其他伪操作其他伪操作COMMENT、.RADIX处理器方式伪操作处理器方式伪操作(了解了解)l处理器方式伪操作处理器方式伪操作用于指示用于指示汇编编译器汇编编译器使用何种使用何种CPU的指令系统。的指令系统。l常用的有以下几种:常用的有以下几种:.8086 指示汇编程序只汇编指示汇编程序只汇编8086/8088的指令系统。程序中若出现的指令系统。程序中若出现80286或或80386的指令,则编译会出错。的指令,则编译会出错。如果程序

40、中不定义任何处理器方式伪操作,则汇编程序默认即如果程序中不定义任何处理器方式伪操作,则汇编程序默认即是是.8086方式。方式。.386P指示汇编程序汇编指示汇编程序汇编8086/8088以及所有以及所有80286和和80386(包括保护(包括保护方式和非保护方式)的指令。方式和非保护方式)的指令。数据定义伪指令数据定义伪指令l数据定义伪操作数据定义伪操作用于定义变量类型、给变量赋值。用于定义变量类型、给变量赋值。l常用的有以下几种:常用的有以下几种:数据定义伪操作的一般格式是数据定义伪操作的一般格式是:变量名变量名 伪操作伪操作 操作数操作数 ,操作数操作数 操作数可以是常数、表达式或字符串,

41、但每项操作数的值操作数可以是常数、表达式或字符串,但每项操作数的值不能超过伪操作所定义的数据类型限定的范围。不能超过伪操作所定义的数据类型限定的范围。操作符操作符DBDWDDDQDT定义定义字节字节(1B)字字(2B)双字双字(4B)四字四字(8B)十字节十字节(10B)数据定义伪指令数据定义伪指令l举例:举例:DATA DB 100,0FFH;存入存入64H,FFHEXPR DB 2*3+7;存入存入0DHSTR DB WELCOME!;存入存入8个字节个字节ABDB AB;存入存入41H,42HBADW AB;存入存入42H,41HABDDDD AB;存入存入42H,41H,00,00 O

42、FFABDW AB;存入变量存入变量AB的偏移地址的偏移地址TOTALDD AB;依次存入变量依次存入变量AB的偏移地址和段地址的偏移地址和段地址NUMDQ 0011223344556677H;依次存入依次存入77H,66H00H见教材见教材 P148数据定义伪指令数据定义伪指令l也可以使用也可以使用“?”作为操作数,此时仅仅保留相应的存作为操作数,此时仅仅保留相应的存储单元,而不赋予变量某个确定的初值。储单元,而不赋予变量某个确定的初值。l当同样的操作数重复多次时,可使用重复操作符当同样的操作数重复多次时,可使用重复操作符DUP,形式为,形式为:n DUP(初值初值 ,初值初值 )圆括号内为

43、重复的内容,圆括号内为重复的内容,n为重复的次数。为重复的次数。例如例如:ZERO DW 30 DUP(0 )BUF DB 10 DUP(?)DAT DB 5 DUP(OK!);存入存入5个个OK!,共共15字节字节符号定义伪操作符号定义伪操作l符号定义伪操作符号定义伪操作用于给一个用于给一个符号符号重新命名,或定义新重新命名,或定义新的类型属性等。这里的符号可以是汇编语言中所用的的类型属性等。这里的符号可以是汇编语言中所用的变量名、标号名、过程名、记录名、寄存器名以及指变量名、标号名、过程名、记录名、寄存器名以及指令助记符等。令助记符等。l常用的常用的符号定义伪操作有符号定义伪操作有EQU、

44、LABELlEQU格式:格式:名字名字 EQU 表达式表达式作用:作用:用名字代替一个数值,或一个较长的表达式。用名字代替一个数值,或一个较长的表达式。举例举例:HPIXEL EQU 1024VPIXEL EQU 768SCREENEQU HPIXEL*VPIXEL符号定义伪操作符号定义伪操作l格式:格式:名字名字 =表达式表达式作用:作用:类似类似 EQU,区别在于,区别在于“=”可以对一个名字重复定义。可以对一个名字重复定义。举例举例:COUNT =10MOV CX,COUNT;(CX)10COUNT =COUNT-1MOV BX,COUNT;(BX)9lLABEL格式:格式:名字名字 L

45、ABEL 表达式表达式作用:作用:定义标号或变量的类型。定义标号或变量的类型。举例举例:AREAW LABEL WORDMOV AREAW,AX ;AX送送AREAW的第的第1、2字节中字节中段定义伪操作段定义伪操作l段定义伪操作段定义伪操作用于在汇编语言源程序中定义逻辑段。用于在汇编语言源程序中定义逻辑段。l常用的段常用的段定义伪操作有定义伪操作有SEGMENT/ENDS、ASSUMElSEGMENT/ENDS格式:格式:段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别作用:作用:定义一个逻辑段定义一个逻辑段举例举例:STACK SEGMENT DB 100 DUP(?

46、)STACK ENDS“定位类型定位类型”告诉编译器如何确定逻辑段的边界在存储器中的位置,告诉编译器如何确定逻辑段的边界在存储器中的位置,即对齐方式。有即对齐方式。有PARA、BYTE、WORD和和PAGE四种。四种。“组合类型组合类型”告诉编译器在装入程序时各个逻辑段如何组合。告诉编译器在装入程序时各个逻辑段如何组合。“类别类别”的作用是在连接时决定各逻辑段的装入顺序。的作用是在连接时决定各逻辑段的装入顺序。段定义伪操作段定义伪操作lASSUME格式:格式:ASSUME 段寄存器段寄存器:段名段名 ,段寄存器段寄存器:段名段名 ,说明:说明:将某一个将某一个段寄存器段寄存器和某一个和某一个逻

47、辑段逻辑段进行关联。进行关联。“段名段名”可以是曾用可以是曾用 SEGMENT 操作符定义过的一个段操作符定义过的一个段名,或是在一个标号或变量前面加上名,或是在一个标号或变量前面加上 SEG 构成的表达式,构成的表达式,还可以是关键字还可以是关键字NOTHING。需要注意的是,需要注意的是,ASSUME仅仅是通知编译器有关段寄存仅仅是通知编译器有关段寄存器和逻辑段的关系,并没有为段寄存器赋予实际的初值。器和逻辑段的关系,并没有为段寄存器赋予实际的初值。举例举例:ASSUME CS:CODE ,DS:DATA1 ,SS:STACK ASSUME DS:SEG AREA1 ASSUME ES:N

48、OTHING ;取消前面取消前面ASSUME对对ES的设置的设置 过程定义伪操作过程定义伪操作l过程定义伪操作过程定义伪操作命令为命令为PROC/ENDP。lPROC/ENDP格式:格式:过程名过程名 PROC NEAR/FAR RET 过程名过程名 ENDP作用:作用:定义一个过程,赋予过程一个名字,并指出过程的类型,定义一个过程,赋予过程一个名字,并指出过程的类型,并指出该过程的类型是并指出该过程的类型是NEAR或或FAR。如果没有特别指明,则认。如果没有特别指明,则认为过程类型是为过程类型是NEAR。伪操作码。伪操作码ENDP标志过程定义结束。标志过程定义结束。当定义一个过程后,程序中其

49、他地方可以用当定义一个过程后,程序中其他地方可以用CALL指令调用指令调用这个过程,或用转移指令转向这个过程,另外也可以顺序执行。这个过程,或用转移指令转向这个过程,另外也可以顺序执行。调用的格式为:调用的格式为:CALL 过程名过程名。过程定义伪操作过程定义伪操作过程名实际上是过程入口的符号地址,它和标号一样,也有三种过程名实际上是过程入口的符号地址,它和标号一样,也有三种属性:属性:段、偏移量段、偏移量 和和 类型类型。类型属性可以是类型属性可以是NEAR或或FAR。类型为。类型为NEAR的过程可以在段内的过程可以在段内调用,类型为调用,类型为FAR的过程可以被其他段调用。的过程可以被其他

50、段调用。过程的定义和调用均可嵌套。例如:过程的定义和调用均可嵌套。例如:NAME1 PROC FARCALL NAME2RETNAME2 PROC NEARRETNAME2 ENDPNAME1 ENDP 模块定义与连接伪操作(了解)模块定义与连接伪操作(了解)l在编写规模较大的汇编语言程序时,可将程序划分成几在编写规模较大的汇编语言程序时,可将程序划分成几个独立的源程序模块,分别进行汇编,最后统一连接。个独立的源程序模块,分别进行汇编,最后统一连接。各个模块之间可以相互进行各个模块之间可以相互进行符号符号访问。访问。l命令为命令为NAME、END、PUBLIC 和和 EXTRN。lNAME格式

51、:格式:Name 模块名模块名作用:作用:指定源文件汇编后的目标文件名称指定源文件汇编后的目标文件名称lEND格式:格式:END 标号标号作用:作用:表示源程序到此结束,对于表示源程序到此结束,对于END后面语句不予理会后面语句不予理会模块定义与连接伪操作(了解)模块定义与连接伪操作(了解)lPUBLIC格式:格式:PUBLIC 符号符号 ,作用:作用:说明本模块中的某些符号是公共的,即这些符号可以供将说明本模块中的某些符号是公共的,即这些符号可以供将被连接在一起的其他模块使用被连接在一起的其他模块使用说明:说明:“符号符号”可以是本模块中定义的变量、标号或数值的名字,可以是本模块中定义的变量

52、、标号或数值的名字,包括用包括用PROC定义的过程名等。定义的过程名等。lEXTRN格式:格式:EXTRN 名字:类型名字:类型,作用:作用:说明本模块中所用的某些符号是外部的,即这些符号在将说明本模块中所用的某些符号是外部的,即这些符号在将被连接在一起的其他模块中定义(定义这些符号的模块中还必须被连接在一起的其他模块中定义(定义这些符号的模块中还必须用用PUBLIC说明)。说明)。宏处理伪操作宏处理伪操作l如果在程序中需要多次使用一个程序段,可将其定义为如果在程序中需要多次使用一个程序段,可将其定义为宏宏。每次需要时,直接进行调用,称为。每次需要时,直接进行调用,称为宏调用宏调用。【利用【利

53、用过程过程(PROC)可以实现类似功能。)可以实现类似功能。区别在于:区别在于:宏宏在编译在编译时就插入每个宏调用处(这称为时就插入每个宏调用处(这称为“宏扩展宏扩展”);而);而过程过程是在执行时是在执行时进行跳转。进行跳转。过程过程具有更优的具有更优的空间空间效率,而效率,而宏宏则具有更优的则具有更优的时间时间效效率。】率。】MACRO/ENDM格式:格式:宏指令名宏指令名 MACRO ;(宏定义体宏定义体)ENDM作用:作用:将将宏指令名宏指令名定义为定义为宏定义体宏定义体中包含的程序段。中包含的程序段。宏处理伪操作宏处理伪操作l宏定义伪操作宏定义伪操作允许带允许带参数参数,从而具有更强

54、的通用性。,从而具有更强的通用性。l例:定义一个宏,用于两个压缩的例:定义一个宏,用于两个压缩的BCD数相加,结果放数相加,结果放在第一个操作数中。在第一个操作数中。DECADDMACRO OPR1,OPR2MOV AL,OPR1ADD AL,OPR2DAAMOV OPR1,ALENDMl下面使用下面使用debug来观察该例中来观察该例中“宏扩展宏扩展”是如何进行的:是如何进行的:源文件源文件反汇编并执行观察结果反汇编并执行观察结果DOS和和BIOS调用(了解)调用(了解)lDOS 和和 BIOS为用户提供了两组系统服务程序。为用户提供了两组系统服务程序。lBIOS是是 IBM PC的基本的基

55、本IO系统,包括系统测试程序、系统,包括系统测试程序、初始化引导程序、一部分中断矢量装入程序以及部分外初始化引导程序、一部分中断矢量装入程序以及部分外设的服务程序。这些程序都固化在主板上的设的服务程序。这些程序都固化在主板上的ROM中。中。lDOS是是 IBM PC的操作系统,负责管理系统的所有资源。的操作系统,负责管理系统的所有资源。其中包括大量可供用户调用的服务程序。其中包括大量可供用户调用的服务程序。lDOS和和BIOS调用不是使用调用不是使用CALL命令,而采用软中断指命令,而采用软中断指令令 INT n。DOS和和BIOS调用调用l用户程序控制用户程序控制PC机硬件的方式机硬件的方式

56、使用高级语言提供的功能控制硬件使用高级语言提供的功能控制硬件调用方便,但灵活性较低、速度较慢。调用方便,但灵活性较低、速度较慢。使用使用DOS提供的程序控制硬件提供的程序控制硬件调用较为方便,程序可移植性好,编程简单。调用较为方便,程序可移植性好,编程简单。使用使用BIOS提供的程序控制硬件提供的程序控制硬件这种控制比较低层,因而可移植性差,但效率更高。这种控制比较低层,因而可移植性差,但效率更高。直接访问硬件直接访问硬件要求用户对硬件非常熟悉。此种方式只用于两种情况:为了获得要求用户对硬件非常熟悉。此种方式只用于两种情况:为了获得高效率,或是为了获得高效率,或是为了获得DOS和和BIOS不支

57、持的功能。不支持的功能。DOS调用调用l8086指令系统中,有一条软中断指令指令系统中,有一条软中断指令 INT n。当当n=51FH时,调用时,调用BIOS服务程序;服务程序;当当n=203FH时,调用时,调用 DOS服务程序。服务程序。l下表列出了部分下表列出了部分DOS软中断的功能:软中断的功能:中断号中断号功能功能INT 20H程序正常退出程序正常退出INT 21H系统功能调用系统功能调用INT 22H结束退出结束退出INT 28H-2FHDOS专用专用INT 21H调用调用l其中其中 INT 21H是一个具有完整功能的服务程序,一般称之是一个具有完整功能的服务程序,一般称之为为DOS

58、系统功能调用系统功能调用。是。是最最常用的常用的DOS中断。中断。lINT 21H中断具有近中断具有近90个子功能,大致分为个子功能,大致分为4个方面:个方面:设备管理、目录管理、文件管理和其他。设备管理、目录管理、文件管理和其他。l系统功能调用系统功能调用(INT 21H)的使用步骤如下:的使用步骤如下:置系统功能号置系统功能号n(放入放入AH)置入口参数置入口参数执行执行INT 21H分析出口参数分析出口参数INT 21H调用示例调用示例l例例:从键盘读入一个字符从键盘读入一个字符,判断是判断是 Y 还是还是 N,以执行对应操作。以执行对应操作。资料:资料:功能号功能号01H的的int 2

59、1H中断中断功能描述功能描述:从标准输入设备:从标准输入设备(如:键盘如:键盘)读入一个字符读入一个字符入口参数入口参数:AH 01H,过滤掉控制字符,并回显,过滤掉控制字符,并回显出口参数出口参数:AL 输入字符的输入字符的ASCII码码 KEY:MOV AH ,1INT 21H;执行调用执行调用CMP AL ,YJE YESCMP AL ,NJE NOJMP KEY;输入其他字符,退回继续等待输入输入其他字符,退回继续等待输入YES:NO:BIOS调用调用l下面列出了部分下面列出了部分BIOS中断:中断:中断号中断号功能功能INT 09H键盘输入键盘输入INT 10H显示服务显示服务INT

60、 0EH磁盘驱动器输入磁盘驱动器输入/输出输出INT 13H直接磁盘服务直接磁盘服务 INT 16H键盘服务键盘服务 INT 19H重启系统重启系统关于关于BIOS中断的所有中断号内容(从中断的所有中断号内容(从05H1FH),参见书附录),参见书附录3.3BIOS调用调用lBIOS调用的使用步骤如下:调用的使用步骤如下:置系统功能号置系统功能号n(放入放入AH)置入口参数置入口参数执行执行 INT n分析出口参数分析出口参数l举键盘输入服务(举键盘输入服务(INT 16H)为例。其主要功能有三个,)为例。其主要功能有三个,分别用于分别用于读键盘读键盘、读扩展键盘读扩展键盘和和读取功能键,读取

61、功能键,分别对应功分别对应功能号能号0、1、2(AH0、1、2)。)。下面一段程序的功能是:下面一段程序的功能是:按下按下F1和和F2键,分别执行两段不键,分别执行两段不同的程序,按其他键则转至错误处理。同的程序,按其他键则转至错误处理。INT 16H调用示例调用示例资料:资料:功能号功能号00H的的int 16H中断中断功能描述功能描述:从键盘读入字符从键盘读入字符 入口参数入口参数:AH00H 出口参数出口参数:AH键盘的扫描码键盘的扫描码 AL字符的字符的ASCII码码 MOV AH ,0INT 16H;执行调用执行调用CMP AL ,0JNE ERROR;若为字符键,转若为字符键,转

62、ERRORCMP AH ,3BH;F1 键码为键码为 3BHJE TT1CMP AH ,3CH;F2 键码为键码为 3CHJE TT2JMP ERRTT1:;处理;处理 F1 键功能键功能TT2:;处理;处理 F2 键功能键功能ERR:资料:资料:键码键码又称又称键盘扫描码键盘扫描码,F1 键码为键码为 3BHF2 键码为键码为 3CHINT 10H调用示例调用示例l从上页的例子中,可以看出,从上页的例子中,可以看出,同样的功能,往往既可以用同样的功能,往往既可以用BIOS中断调用来实现,也可以用中断调用来实现,也可以用DOS中断调用来实现。中断调用来实现。比比如磁盘服务、键盘服务、显示字符等

63、。差别在于:如磁盘服务、键盘服务、显示字符等。差别在于:BIOS中中断调用往往功能更强大、控制更灵活。断调用往往功能更强大、控制更灵活。l例:例:INT 10H功能号功能号09H,“在当前光标位置显示字符在当前光标位置显示字符”。MOV AH ,9;显示字符显示字符MOV AL ,a;字符字符MOV BL ,0Ch;0表示背景黑色,表示背景黑色,0Ch表示字符红色表示字符红色MOV BH ,0;第第0页页MOV CX ,8;字符重复个数字符重复个数INT 10hINT 10H调用示例调用示例运行结果运行结果提示提示:由于程序运行在由于程序运行在“虚拟虚拟”的的8086模式下,模式下,在操作硬件

64、时跟纯在操作硬件时跟纯DOS仍存在一定差异。仍存在一定差异。如果程序直接双击运行时结果跟预期不符,如果程序直接双击运行时结果跟预期不符,(比如窗口一闪而过)(比如窗口一闪而过)可使用可使用debug加载然后输入加载然后输入g运行。运行。汇编语言设计举例汇编语言设计举例l字符串查找字符串查找 内存中已经存有一张内存中已经存有一张表表,要求从键盘上输入一,要求从键盘上输入一个个字符串字符串,然后在表中查找该字符串,如有,则在屏幕上显,然后在表中查找该字符串,如有,则在屏幕上显示示“OK!”;如果没有,则显示;如果没有,则显示“NO!”;若输入字符串长度;若输入字符串长度超过内存中表的长度,则显示超

65、过内存中表的长度,则显示“Wrong!The string is too long!”逻辑分析:逻辑分析:查找可以分两步进行,先在表中搜索字符串的查找可以分两步进行,先在表中搜索字符串的第一个字符第一个字符,如有,再比较字符串的如有,再比较字符串的其他字符其他字符是否一致。是否一致。功能可行性分析:功能可行性分析:在屏幕上显示字符串可以使用功能号在屏幕上显示字符串可以使用功能号 09H的的21号中断;号中断;从键盘上接受字符串可以使用功能号从键盘上接受字符串可以使用功能号0AH的的21号中断。号中断。教材教材 P213流程图流程图显示提示符显示提示符从键盘接收提示符从键盘接收提示符字符串首址送

66、字符串首址送SI,表首址送,表首址送DI字符串长度送字符串长度送BX,表长度送,表长度送CX表长表长=串长串长搜索、匹配等工作搜索、匹配等工作开始开始返回返回显示显示“串太长串太长”具体见教材具体见教材P214资料资料1:功能号功能号09H的的int 21H中断中断功能描述功能描述:显示字符串:显示字符串 (串尾字符为串尾字符为$,但不显示但不显示)入口参数入口参数:AH09HDS:DX被显示字符串的首地址被显示字符串的首地址出口参数出口参数:无:无data SEGMENTmsg DB Hello,World!$data ENDScode SEGMENTASSUME CS:code,DS:dataMAINPROC NEARstart:MOV AX ,data MOVDS ,AX LEA DX ,msg MOV AH ,9hINT 21hMOV AH ,4ChINT 21hMAINENDPcode ENDSEND start例如例如:资料资料2:功能号功能号0AH的的int 21H中断中断功能描述功能描述:从标准输入设备:从标准输入设备(如:键盘如:键盘)读入一个字符串,遇到读入一个字符

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!