第七章_DSP的汇编伪指令_第1页
第七章_DSP的汇编伪指令_第2页
第七章_DSP的汇编伪指令_第3页
第七章_DSP的汇编伪指令_第4页
第七章_DSP的汇编伪指令_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 汇编程序语法 TMS320TMS320的汇编程序包含:的汇编程序包含:1 .1 . 汇 编 语 言 指 令 (汇 编 语 言 指 令 ( a s s e m b l y l a n g u a g e a s s e m b l y l a n g u a g e instructionsinstructions)、)、2. 2. 汇编指令(伪指令,汇编指令(伪指令,assembler directivesassembler directives)、)、3. 3. 宏指令(宏指令(macro directivesmacro directives)4. 4. 注释(注释(comments

2、comments)。)。 1 汇编代码和数据到指定的段; 2 为未定义的变量保存空间; 3 控制列表文件; 4 分配存储器; 5 汇编条件块; 6 定义全局变量; 7 指定汇编器能得到的宏; 8 检查符号调试信息。 汇编伪指令为程序提供数据、控制汇编过程。汇编伪指令为程序提供数据、控制汇编过程。所作的工作包括:所作的工作包括:1. 伪指令前为小数点。2. 伪指令在运行时不起作用,汇编及调试时起作用。3. 伪指令是实质是指挥控制汇编器汇编。编译器编译器汇编汇编.asm不可执行不可执行.obj可执行可执行.out汇编器汇编器汇编语言工具TMS320的汇编语言工具是一个软件的汇编语言工具是一个软件包

3、,其中包括包,其中包括:1.汇编器汇编器2.连接器连接器3.归档器归档器4.交叉引用列表器交叉引用列表器5.十六进制转换公用程序十六进制转换公用程序汇编器(Assembler) 将汇编语言的源程序文件汇编成将汇编语言的源程序文件汇编成为机器语言的目标程序文件,其格为机器语言的目标程序文件,其格式为式为COFF(公用目标文件格式)。(公用目标文件格式)。汇编语言源程序可以包括汇编语言汇编语言源程序可以包括汇编语言指令(指令(instruction)、汇编指令)、汇编指令(assembler directives)和宏指)和宏指令(令(macro directives)。)。连接器(Linker)

4、 连接器的基本任务是将目标文件连接器的基本任务是将目标文件连接在一起,产生可执行模块。连连接在一起,产生可执行模块。连接器可以接受的输入文件包括汇编接器可以接受的输入文件包括汇编器产生的器产生的COFF目标文件、命令文件、目标文件、命令文件、库文件、以及已部分连接好了的文库文件、以及已部分连接好了的文件。它所产生的可执行件。它所产生的可执行COFF目标模目标模块可以装入各种开发工具块可以装入各种开发工具,或由或由TMS320器件来执行。器件来执行。归档器(Archiver) 归档器允许用户将一组文件归入归档器允许用户将一组文件归入一个档案文件(库)。例如,将若一个档案文件(库)。例如,将若干个

5、宏归入一个宏库,汇编器将搜干个宏归入一个宏库,汇编器将搜索这个库,并调用源文件中使用的索这个库,并调用源文件中使用的宏。也可以用归档器将一组目标文宏。也可以用归档器将一组目标文件收入一个目标文件库,连接器将件收入一个目标文件库,连接器将连接库内的成员,并解决外部引用。连接库内的成员,并解决外部引用。交叉引用列表器(Cross-Reference Lister) 交叉引用列表器是一个查错的工交叉引用列表器是一个查错的工具。它接受已经连接好的目标文件具。它接受已经连接好的目标文件作为输入,产生一个交叉引用列表作为输入,产生一个交叉引用列表作为输出。它列出符号、符号的定作为输出。它列出符号、符号的定

6、义、以及它们在已经连接的源文件义、以及它们在已经连接的源文件中的引用。中的引用。十六进制转换公用程序(Hex Conversion Utility)将将COFF目标文件转换成为若干种标准目标文件转换成为若干种标准的文件格式:的文件格式:1.ASCII-十六进制十六进制2.Extended Tektronix3.Intel MCS-864.Motorola Exorciser5.TI SDSMAC 公共目标文件格式 汇编器和链接器产生的目标文件,是一个可以在TMS320 DSP上执行的文件,称为公共目标文件格式(Common Object File Format),缩写为COFF。 由于COFF

7、在编写汇编语言程序时采用代码和数据块的形式,因此便于模块化的编程,这些代码和数据块称为段。所谓段是指连续占有存储空间的一个数据或代码块。 在编写汇编语言源程序时,程序按段组织,每行汇编语句都从属一个段。段是目标文件中可重新定位的最小单元,每个目标程序中的每个段通常是分开的和各不相同的。 COFF中至少包含以下三个默认段: .text段(文本段)通常包含可执行代码; .data段(数据段)通常包含己初始化的数据; .bss段(保留空间段)通常为未初始化的数据保留空间。 段有两种基本类型,已初始化段和未初始化段. 1.未初始化段仅仅在目标系统存储器中保留空间,以供程序运行过程的变量作临时存储空间使

8、用,可由汇编伪指令.bss和.uset创建。 2.己初始化段包含可执行代码或者已初始化数据,这些段的内容存储在目标文件中,当程序装入时存放在存储器中。每个己初始化段可独立地进行重定位,且可以访问在其他段中重定义的符号。 自定义段由用户自己定义,和默认段的使用相同,但它们被单独汇编,可由以下3个指令来创建自定义段: 符号.usect“段名”,字数 符号.sect“段名”,字数(建立的块可重定位) 符号.asect“段名”,地址(建立具有绝对地址的块) .usect建立的段是在RAM中为变量保留空间(类似于.bss段),.sect建立的是包含代码或数据的段(类似于.text段和.data段)。 汇

9、编器确定汇编语言程序的各个部分属于哪一个特定的段,汇编器有六个命令来完成这种功能,即:用于创建未初始化段.bss, .usect和用于创建已初始化.text, .data, .sect,.asect,如果程序未作说明,则统一汇编到.text段中。 链接器的主要功能是将段定位至目标存储器中。确定段地址的工作一般由链接器来完成,由于大部分系统一般包含多个不同类型的存储器(EPROM RAM等),采用段可以使用户更有效地利用目标存储器,所有的段可以独立进行定位。 因此可以将不同的段分配至各种目标存储器中,加强程序的灵活性和可移植性。伪指令(Assembler Directives)汇编伪指令汇编伪指

10、令段定义伪指令v.bss 在该段中保留若干字在该段中保留若干字v.data 汇编入已初始化的数据段汇编入已初始化的数据段v.sect “section name” 汇编入已命名的段汇编入已命名的段v.text 汇编入可执行的代码段汇编入可执行的代码段.bss page,128 在在 .bss段中为段中为page定义定义128个字。个字。初始化常数伪指令v.float 初始化一个初始化一个32-bit的浮点常数的浮点常数 初始化一个或多个初始化一个或多个16-bit的整数的整数v.string 初始化一个或多个字符串初始化一个或多个字符串v.word 初始化一个或多个初始化一个或多个1

11、6-bit的整数的整数.bss x, 4, 1.word 0012h格式化输出列表的伪指令v.list 开始源文件列表开始源文件列表v.nolist 停止源文件列表停止源文件列表v.length 设置源文件列表的页长度设置源文件列表的页长度v.title 在列表文件每一页打印文件名在列表文件每一页打印文件名引用其他文件的伪指令v.copy /.include 包含其他文件的源语句包含其他文件的源语句v.global 确认一个或多个全局确认一个或多个全局(外部外部)符号符号v.mlib 定义宏库定义宏库.include f240.h.global aa条件汇编伪指令v.if/.else/.end

12、if 条件汇编代码块条件汇编代码块v.loop/.endloop 循环汇编代码块循环汇编代码块v.break 终止循环汇编代码块终止循环汇编代码块汇编时的符号v.equ/.set 使一个符号等于一个值使一个符号等于一个值v.end 结束程序结束程序aa .equ 0012h宏语言vMacro: A user-defined routine that can be used as an instructionv汇编器支持宏语言,使用户可以建立自己的汇编器支持宏语言,使用户可以建立自己的“指令指令”。当程序要将特定的任务执行若干次。当程序要将特定的任务执行若干次时,尤其有用时,尤其有用。相当于子程

13、序。相当于子程序。宏语言可以使用户:l定义自己的宏,或重新定义正执行的宏定义自己的宏,或重新定义正执行的宏l简化长的或复杂的汇编代码简化长的或复杂的汇编代码l访问由归档器建立的宏库访问由归档器建立的宏库l在一个宏内定义条件块和可重复的块在一个宏内定义条件块和可重复的块l在一个宏内操作字符串在一个宏内操作字符串l 控制展开列表控制展开列表定义宏 在程序中使用宏之前,首先必须定义它。可在程序中使用宏之前,首先必须定义它。可以用两种方法来定义:以用两种方法来定义:( 1 ) 在 源 文 件 开 始 处 定 义 ;) 在 源 文 件 开 始 处 定 义 ; (2) .include/.copy文件中定

14、义;文件中定义;(3)在宏库中定义。)在宏库中定义。定义宏macname .macro parameter model statements .mexit .endm定义宏vmacname 宏的名字宏的名字v.macro 是一个伪指令,确认源语句为是一个伪指令,确认源语句为宏定义的第一行宏定义的第一行vparameters 选项,作为选项,作为.macro伪指令伪指令的操作数的操作数vModel statements 每次调用宏时执行的每次调用宏时执行的指令或伪指令指令或伪指令v.endm 终止宏定义终止宏定义定义宏举例* add3 p1, p2, p3 (形参)(形参)* p3 = p1 +

15、 p2 + p3 add3 .macro p1, p2, p3 lacc p1 add p2 add p3 .endm调用宏 在源程序中用宏的名字作为操作码在源程序中用宏的名字作为操作码来调用宏来调用宏. add3 x, y, z (实参)实参)展开宏 在源程序调用宏时,汇编器将其展开。在源程序调用宏时,汇编器将其展开。 在展开时,汇编器将变量传递给宏参数,用在展开时,汇编器将变量传递给宏参数,用宏定义取代宏调用语句,然后汇编其源代码。宏定义取代宏调用语句,然后汇编其源代码。 在省缺情况下,宏展开打印在列表文件中。在省缺情况下,宏展开打印在列表文件中。 可以用伪指令可以用伪指令 .mnolis

16、t 来停止其展开的列表。来停止其展开的列表。展开宏0000 2000 lacc x0001 0001 add y0002 0002 add z* Reserve space for vars0000 .bss x, 10001 .bss y, 10002 .bss z, 1宏库 定义宏的一种方法是建立一个宏库。定义宏的一种方法是建立一个宏库。宏库是包含有宏定义的文件的集合。宏库是包含有宏定义的文件的集合。 必须使用归档器来把这些文件收集到必须使用归档器来把这些文件收集到一个文件中。一个文件中。 宏库中的每一个成员都包含一个宏定宏库中的每一个成员都包含一个宏定义。该文件必须是未汇编的源文件。宏义

17、。该文件必须是未汇编的源文件。宏名字和文件名必须相同,且宏文件名的名字和文件名必须相同,且宏文件名的扩展名必须是扩展名必须是.asm访问宏库用伪指令用伪指令.mlib来访问宏库,其语法为来访问宏库,其语法为: .mlib macro library filename当汇编器识别到该伪指令时,就打开该宏当汇编器识别到该伪指令时,就打开该宏库,并建立该宏库内容的表。库,并建立该宏库内容的表。汇编器输出的列表文件汇编器输出的列表文件:1 *2 * Assemble into the .text section. *3 *4 0000 .text5 0000 e800 LD #0, A6 *7 * A

18、llocate 4 words in .bss for TEMP. *8 *9 0000 Var_1: .bss TEMP, 41011 *12 * Still in .text *13 *14 0001 f000 ADD #56h 0002 005615 0003 f066 MPY #73h 0004 00731617 *18 * Allocate 100 words in .bss for the *19 * symbol named ARRAY; this part of *20 * .bss must fit on a single page. *21 *22 0004 .bss AR

19、RAY, 100, 12324 *25 * Assemble more code into .text. *26 *27 0005 8000ADD Var_12829 *30 * Declare external .bss symbols. *31 *32 .global ARRAY, TEMP33 .end连接器连接器-m-m选择项建立映射列表文件选择项建立映射列表文件-m filename该连接器映射列表描述:该连接器映射列表描述: 存储器划分;存储器划分; 输入与输出段的位置;输入与输出段的位置; 外部符号重新定位后的地址。外部符号重新定位后的地址。 当没有发现错误时,连接器就建立一个当

20、没有发现错误时,连接器就建立一个输出模块,省缺名为输出模块,省缺名为a.out。也可以使用。也可以使用-o选择项,将输出模块写入另外的文件:选择项,将输出模块写入另外的文件:-o filename 其中:的文件名就是新的输出模块的其中:的文件名就是新的输出模块的文件名。文件名。lnk200 o run.out file1.obj file2.obj 将将ile1.obj 和和 file2.obj 连接起来,连接起来,建立一个名为建立一个名为run.out 的输出模块。的输出模块。写入一个命令文件link.cmd :a.obj /* First input filename */b.obj /*

21、 Second input filename */-o prog.out /* Option to specify output file */-m prog.map /* Option to specify map file */并用该命令文件来调用连接器:lnk200 link.cmd包含连接器伪指令的命令文件包含连接器伪指令的命令文件:a.obj b.obj c.obj /* Input filenames */-o prog.out -m prog.map /* Options */MEMORY /* MEMORY directive */RAM: origin = 100h leng

22、th = 0100hROM: origin = 01000h length = 0100h SECTIONS /* SECTIONS directive */.text: ROM.data: ROM.bss: RAMMEMORYPAGE 0 : name 1 (attr) : origin = constant , length = constant;PAGE n : name n (attr) : origin = constant , length = constant;PAGE 说明一个存储器空间。用户最多可以说说明一个存储器空间。用户最多可以说明明255页。通常,页。通常,page0是

23、程序存储器,是程序存储器,page1是数据存储器。是数据存储器。name 命名一个存储器范围。一个存储器的名字命名一个存储器范围。一个存储器的名字可以是可以是18个字符,其中包括个字符,其中包括AZ,az,$,.,_。Attr 存储器的属性:存储器的属性: R 存储器可读;存储器可读; W 存储器可写;存储器可写; X 存储器可包含可执行代码;存储器可包含可执行代码; I 存储器可以初始化。存储器可以初始化。 origin 指定存储器的开始地址;指定存储器的开始地址; length 指定存储器范围的长度;指定存储器范围的长度; fill 为存储器范围指定一个填入的字为存储器范围指定一个填入的字

24、符,其值是符,其值是2-byte的整常数。的整常数。TMS320TMS320省缺的地址配置:省缺的地址配置:MEMORYPAGE 0: PROG: origin = 0 x0080 length = 0 xFF00PAGE 1: DATA: origin = 0 x0080 length = 0 xFF80SECTIONS.text: PAGE = 0.data: PAGE = 0.cinit: PAGE = 0 ;cflag option only.bss: PAGE = 1连接器使用举例连接器使用举例 本例连接三个目标文件本例连接三个目标文件demo.obj、fft.obj和和 table

25、s.obj,并建立输出文,并建立输出文件件demo.out。符号。符号SETUP是程序是程序的输入点。的输入点。连接器命令文件连接器命令文件 demo.cmddemo.cmd/*/* Specify Linker Options */*/-e coeff /* Define the program entry point */-o demo.out /* Name the output file */-m demo.map /* Create an output map */*/* Specify the Input Files */*/demo.objfft.objtables.obj/*/

26、* Specify the Memory Configurations */*/MEMORYPAGE 0: RAM_PG: origin=00080h length=06F80hROM: origin=0C000h length=03F80hPAGE 1: ONCHIP: origin=00080h length=0F7FhEXT: origin=01000h length=0EFFFh/*/* Specify the Output Sections */*/SECTIONS.text: load = ROM, page = 0 /* link .text into ROM */var_def

27、s: load = ONCHIP, page=1 /* defs in RAM */.data: fill = 07A1Ch, load=ONCHIP, page=1t a b l e s . o b j ( . d a t a ) /* .data input */fft.obj(.data) /* .data input */. = 100h; /* create hole, fill with 07A1Ch */ /* and link with ONCHIP */. b s s : l o a d = R A M _ P G ,p a g e = 0 ,fill=0FFFFh/* Re

28、maining .bss; fill and link */映射文件映射文件demo.mapdemo.mapOUTPUT FILE NAME: ENTRY POINT SYMBOL: 0MEMORY CONFIGURATION Name origin length attributes fill - - - - PAGE 0: RAM_PG 00000080 000006f80 RWIX ROM 0000c000 000003f80 RWIXP A G E 1 : O N C H I P 0 0 0 0 0 0 8 0 000000f7f RWIX EXT 00001000 00000efff

29、 RWIXSECTION ALLOCATION MAPoutput attributes/section page origin lengthinput sections- - - - -.text 00000c000000000150000c000 00000008 demo.obj (.text)0000c008 00000007 fft.obj (.text)0000c00f 00000006 tables.obj (.text)var_defs 1 00000080 0000000200000080 00000002 demo.obj (var_defs).data 1 0000008

30、2 0000010800000082 00000000 tables.obj (.data)00000082 00000000 fft.obj (.data)00000082 00000100 fill = 7a1c00000182 00000008 demo.obj (.data).bss 0 00000080 0000007b00000080 00000013 demo.obj (.bss) fill=ffff00000093 00000000 fft.obj (.bss)00000093 00000068 tables.obj(.bss)fill=ffffxy 1 0000018a 00

31、000014 UNINITIALIZED0000018a 00000014 demo.obj (xy) GLOBAL SYMBOLSaddress name address name- -00000080 .bss 00000080 .bss00000082 .data 00000082 .data0000c000 .text 00000093 TEMP00000097 ARRAY 00000097 ARRAY00000093 TEMP 000000fb end0000018a edata 0000018a edata000000fb end 0000c000 .text0000c015 et

32、ext 0000c015 etext8 symbolsC语言来写程序 编译器 编译问题 输入是输入是C源文件。读入源语源文件。读入源语句,检查语法和语意错误,写出句,检查语法和语意错误,写出一个中间文件(一个中间文件(.if) 可选择项。其输入是分析器产生可选择项。其输入是分析器产生的中间文件(的中间文件(.if)。当运行优化器)。当运行优化器时,用户可以选择优化的层次。产时,用户可以选择优化的层次。产生一个与中间文件格式相同的高效生一个与中间文件格式相同的高效率版本。率版本。 输入是分析器或优化器产生的输入是分析器或优化器产生的中间文件(中间文件(.if或或.opt文件),产文件),产生一个

33、汇编语言源文件。生一个汇编语言源文件。内部列表公用程序内部列表公用程序 输入是输入是C编译器产生的汇编编译器产生的汇编语言源程序和语言源程序和C源程序。产生的源程序。产生的是按是按C文件的语句展开的汇编语文件的语句展开的汇编语言源文件。言源文件。C 优化编译器 TI 为其为其TMS320系列系列 DSP提供了系列提供了系列的的 C 编译器。将标准编译器。将标准 C 源文件编译成为源文件编译成为相应片种的汇编语言源代码文件,进而相应片种的汇编语言源代码文件,进而汇编和连接,产生可执行的目标文件。汇编和连接,产生可执行的目标文件。 这些这些 C 编译器符合编译器符合ANSI C 标准;有标准;有运

34、行支持库;一个外壳程序(运行支持库;一个外壳程序(shell program)可以)可以一步一步将将 C 源代码翻译成源代码翻译成为为TMS320的目标代码。的目标代码。C 优化编译器主要特点 1.完全符合完全符合ANSI C标准标准 2.带有一个完整的运行支持库,包括字带有一个完整的运行支持库,包括字符串操作,动态存储器分配,数据转换,符串操作,动态存储器分配,数据转换,三角、指数和双曲线函数等。可以对运三角、指数和双曲线函数等。可以对运行支持函数库和用户定义函数库作扩展行支持函数库和用户定义函数库作扩展C 优化编译器主要特点 使用多种先进技术来从使用多种先进技术来从 C 源代码产源代码产生

35、高效汇编代码。通用优化可用于生高效汇编代码。通用优化可用于任何任何 C 代码,而对各片种的专门优代码,而对各片种的专门优化更适应该片种的结构特点。通过化更适应该片种的结构特点。通过简化循环、重新安排语句和表达式、简化循环、重新安排语句和表达式、将变量安排入寄存器等方法来改善将变量安排入寄存器等方法来改善执行速度执行速度,减小减小 C 程序的大小。程序的大小。C 优化编译器主要特点 归档器公用程序(归档器公用程序(Archiver Utility),将文件归入单一的档案文),将文件归入单一的档案文件或库中,可以对库作文件的添加、件或库中,可以对库作文件的添加、删除、替换等。可以将目标文件库删除、

36、替换等。可以将目标文件库作为连接器的输入。作为连接器的输入。C 优化编译器主要特点 公用目标文件格式(公用目标文件格式(COFF,Common Object File Format)使)使用户能够在连接时定义自己系统的用户能够在连接时定义自己系统的存储器映射,将存储器映射,将 C 代码和数据连接代码和数据连接到特定的存储区域,从而最大限度到特定的存储区域,从而最大限度地改善其性能。地改善其性能。COFF还为源程序一还为源程序一级的查错提供强有力的支持。级的查错提供强有力的支持。C 优化编译器主要特点 包含一个外壳程序(包含一个外壳程序(Shell Program),只用一个命令,就可),只用一

37、个命令,就可以编译、汇编、和连接,直接从以编译、汇编、和连接,直接从C原原文件产生可执行的文件产生可执行的COFF文件。文件。C 优化编译器主要特点 多种列表文件:多种列表文件:(1)汇编语言源文件,可以有选择)汇编语言源文件,可以有选择地包括内部列表、地包括内部列表、C源代码及使用寄源代码及使用寄存器的信息;存器的信息;(2)预处理输出文件;)预处理输出文件;(3)带有行号和操作码的汇编列表)带有行号和操作码的汇编列表文件。文件。C 编译器的优化 C编译器的效率取决于所作的优化编译器的效率取决于所作的优化的范围和数量。的范围和数量。TMS320的的C编译器编译器能作很宽范围的多种优化,从而改

38、能作很宽范围的多种优化,从而改善其编译所得代码的效率。善其编译所得代码的效率。 TMS320的的C编译器所作的优化分为编译器所作的优化分为适用于所有处理器的通用优化和针适用于所有处理器的通用优化和针对特定片种的专门优化。对特定片种的专门优化。通用优化改变表达式,字符简化,常数合并改变表达式,字符简化,常数合并将表达式简化成为要求较少指令和较少寄将表达式简化成为要求较少指令和较少寄存器的等价形式:存器的等价形式:(a+b) - (c+d) - (a+b)-c)-d)a = (b+4) - (c+1) - a = b - c + 3通用优化数据流优化数据流优化 使用较少代价的表达式,检测出并使用较

39、少代价的表达式,检测出并去除不必要的赋值,避免再计算已去除不必要的赋值,避免再计算已经计算过的值。经计算过的值。通用优化优化转移优化转移/ /简化控制流简化控制流 分析程序的转移判断情况,重新安分析程序的转移判断情况,重新安排操作顺序,消去转移或多余的条件。排操作顺序,消去转移或多余的条件。通用优化优化循环相关变量,例如:优化循环相关变量,例如: 为数组元素设置下标的代码改为指针为数组元素设置下标的代码改为指针增量的代码;索引增量的代码;索引AR0AR0 用计数器控制的循环写成块循环,或用计数器控制的循环写成块循环,或使用高效的增使用高效的增/ /减量转移指令减量转移指令RPTRPT。 80%80%程序量用于控制,程序

温馨提示

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

评论

0/150

提交评论