3tms320c54指令系统详解_第1页
3tms320c54指令系统详解_第2页
3tms320c54指令系统详解_第3页
3tms320c54指令系统详解_第4页
3tms320c54指令系统详解_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

第三章TMS320C54X指令系统

本章内容包括:(1)存储器寻址方式(2)汇编语言指令系统(3)伪指令系统。主讲人:陈德宏立即数寻址:指令中有一个操作数为固定的数(加#)绝对地址寻址:指令中有一个操作数为固定的地址累加器寻址:用累加器的值作为地址去访问程序存储器直接寻址:指令中的地址和所在的数据页指针DP或SP

决定了操作数在数据存储器中的实际地址间接寻址:按照辅助寄存器中的地址访问存储器存储器映射寄存器寻址:修改存储器映射寄存器中的值,而不影响当前DP或SP的值堆栈寻址:把数据压入和弹出系统堆栈。寻址方式:当硬件执行指令时,寻找指令所参与运算的操作数的方法3.1存储器寻址方式符号含义Smem16位单寻址操作数Xmem16位的双寻址操作数,从DB总线读出Ymem16位的双寻址操作数,从CB总线读出dmad16位立即数,数据存储器的地址pmad16位立即数,程序存储器的地址PA16位立即数,I/O的地址src源累加器dst目的累加器lk16位的长立即数部分寻址的缩写语在立即数寻址中,指令里包括了立即操作数(常数,用#k表示,#用来区分地址的表示方法)。立即数可包含在单字或双字指令中。3-,5-,8-或9-bit立即数在单字指令中16-bit立即数在双字指令中例如:LD #80h, A1.立即数寻址3或5bit立即数8bit立即数9bit立即数16bit立即数LDFRAMELDADDORMADDMRPTANDRPTZANDMSTBITFSTMCMPMSUBLDXORMACXORMOR表、支持立即数寻址的指令2.绝对寻址指令中有一个操作数为所要寻址存储单元16位地址术语解释:dmad-数据存储地址;pmad-程序存储地址;PA-口地址;lk-长整数。只有四种类型指令可以使用16bits的绝对地址寻址:dmad寻址pmad寻址PA寻址*(lk)寻址(1)dmad寻址

dmad寻址用一标号标记数据空间地址,这类指令有:MVDKSmem,dmadMVDMdmad,MMRMVKDdmad,SmemMVMDMMR,dmad如:MVKDSAMPLE,*AR5此处SAMPLE即是dmad

(2)pmad寻址

pmad寻址用一标号标记程序空间地址,这类指令有:

FIRSXmem,Ymem,pmadMACDSmem,pmad,srcMACPSmem,pmad,srcMVPDpmad,Smem(3)PA寻址PA寻址用一标号标记外部I/O口地址,这类指令有:

PORTRPA,SmemPORTWSmem,PA如:PORTRFIFO,*AR5

此处FIFO即为PA

(4)*(lk)寻址:适用于支持单数据存储器操作数(Smem)的指令:例如:LDSmem,dst

则可以有LD*(Buffer),A;将Buffer符号所指的数据存储单元的数装载到累加器A,

Buffer是一个符号常数

在直接寻址中,指令代码包含了数据存储器地址的低七位。这7bit(dma)作为偏移地址与数据页指针(DP),当ST1中的CPL位=0

堆栈指针(SP),

当ST1中的CPL位=1相结合共同形成16位的数据存储器实际地址。当偏移地址为变量时,变量前加@符号。例如:X.set5LD#20hDPLD@X,A3.直接寻址CPL=0:dma与9-bit的DP相结合形成数据存储器地址。以DP为基准的直接寻址DP9-bit9-bit的DP指向数据存储空间的512个数据页中的一页012510511注意的是:用DP直接寻址,操作对象需处于同一页用DP直接寻址CPL=0地址计算公式:例如:SSBXCPL;状态寄存器置位LD@1,AADD@2,A;A的结果:1500024010000503404SPSP方式,以SP中内容作为dmad基地址,指令中地址标号作为正向偏移量,二者相加构成dmad地址。用SP直接寻址CPL=1:READASmemWRITASmem

READA是把累加器A所确定的程序存储器单元中的一个字,传送到单数据存储器(Smem)操作数所确定的数据存储器单元中。WRITA是把Smem操作数所确定的数据单元中的一个字,传送到累加器A确定的程序存储器单元中去。上述两条指令,在重复的方式下执行,搬移连续的数据(以A的值为起始地址)到连续的DM中,能够对累加器A自动增量4.累加器寻址累加器寻址是用累加器中的数作为一个地址。这种寻址方式可用来对存放数据的程序存储器寻址。地址由累加器的低16位决定,共有两条指令可以采用累加器寻址:DM的地址:0206h15141312111098765432100000001000000110累加器寻址和直接寻址举例5.间接寻址

在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的16-bit地址进行访问。‘C54x有8个16-bit辅助寄存器(AR0-AR7)。两个辅助寄存器算术单元(ARAU0和ARAU1),根据辅助寄存器的内容进行操作,完成无符号的16-bit算术运算。间接寻址很灵活,不仅能从存储器中读或写一个单16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。*ARx:

ARx包含了数据存储器地址*ARx-/*ARx+:访问后,

ARx中的地址减1/加1*+ARx:在寻址之前,ARx中的地址加1*ARx-0B/*ARx+0B:访问后,从ARx中以位倒序进位的方式减去/加上AR0*ARx-0/*ARx+0

:访问后,从ARx中减去/加上AR0*ARx-%/*ARx+%:

访问后,ARx中的地址以循环寻址的方式减1/加1*ARx-0%/*ARx+0%:访问后,从ARx中以循环寻址的方式减去/加上AR0*ARx(lk):

ARx和16-bit的长偏移(lk)的和用来作为数据存储器地址。ARx本身不被修改单操作数间接寻址类型:*+ARx(lk):在寻址之前,把一个带符号的16-bit的长偏移(lk)加到ARx中,然后用新的ARx的值作为数据存储器的地址*+ARx(lk)%:在寻址之前,把一个带符号的16-bit的长偏移以循环寻址的方式加到ARx中,然后再用新的ARx的值作为数据存储器的地址有B符号,倒序进位有%符号,循环寻址有0符号,与AR0有关间接寻址编程:

.mmregs .bssx,4,1 .dataa .word1,2,3,4 .sect“program” STM#a,AR1 STM#x,AR2 LD#0,A LD*AR1+,T MAC*AR2+,A LD*AR1+,T MAC*AR2+,A LD*AR1+,T MAC*AR2+,A LD*AR1,T MAC*AR2,A …..编程举例:在卷积、相关、FIR中要用到循环缓冲区。循环缓冲区长度R由BK决定

STM#lk,BK;设置循环缓冲区长度循环缓冲区从N位的地址边界(N位0)开始,R<2N,若R=40,则N=6,开始地址为:

xxxxxxxxxx000000。循环寻址时用一个ARx指向缓冲区。地址变化规则:循环寻址(有%符号)

.sect “fir-prog”

STM#255,BRC ;BlockRepeatCounter,

;Repeat256times

RPTBDfir_filter_loop STM#16,BK ;FIRcircularbuffersize

LD*AR7+,A ;loadtheinputvalue

STLA,*AR4+% ;replaceoldestsamplewith

;newestsample

RPTZA,#15

MAC*AR4+0%,*AR3+0%,A ;filtering

STHA,*AR5+ ;replacetheoldestbuffervaluefir_filter_loop应用举例:计算16阶的FIR滤波器输出256个点0001000101100011010111118点的FFT蝶型结运算FFT中混序就是位倒序FFT运算时输出/输入序列中必有其一要混序。倒序,10100101,用于FFT中蝶型变换位倒序进位:进位不是加到左边一位,而是加到右边的那位。例如:进位加到左边进位加到右边

11001100+1000+1000101000010如果AR2中存放X(0)的地址,AR0的值为8(FFT长度的一半),则下列程序向PA口输出倒序:0000,1000,0100,1100,0010,…,0111,1111。RPT#15PORTW*AR2+0B,PA倒序进位(有B符号)位倒序寻址的执行

设FFT长度N=16,则AR0赋值为8,位倒序方式读入数据情况如下:存储器映射寄存器只有8条指令能使用存储器映射寄存器寻址:LDMMMR,dstMVDMdmad,MMRMVMDMMR,dmadMVMMMMRx,MMRyPOPMMMRPSHMMMRSTLMsrc,MMRSTM#lk,MMR

存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针(DP)或堆栈指针(SP)的值。存储器映射寄存器寻址直接寻址中利用操作数中的低7位访问MMR间接寻址中利用ARx访问MMR,Arx高位被置0。MVDM300H,BKLDAR4,AMVMMSP,AR16.存储器映射寄存器寻址共有四条使用堆栈寻址方式访问堆栈的指令:

PSHD把一个数据存储器的值压入堆栈。

PSHM把一个存储器映射寄存器的值压入堆栈。 POPD把一个数据存储器的值弹出堆栈。

POPM把一个存储器映射寄存器的值弹出堆栈。7.堆栈寻址系统堆栈用来在中断和子程序期间自动存放程序计数器(PC)。它也能用来存放额外的数据项或传递数据值。处理器使用一个16-bit的存储器映射寄存器—堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。0001001000110100010101100001001000110100010101100011sp操作前的堆栈和SP0010sp操作后的堆栈和SPX1X1X2图、堆栈操作对堆栈指针的影响(1)立即寻址运行速度慢,但需要较多的程序存储空间,而且数值不能改变,主要用于表示常数和初始化。(2)绝对寻址可以访问任何的数据空间,但速度慢,要求较多的存储空间,用于对速度没有苛求的场合。(3)累加器寻址主要是在程序空间和数据空间传送数据。(4)间接寻址类似于高级语言中的指针,较为灵活,主要是针对数字信号处理的算法而设计的。(5)直接寻址中寻址速度较快,利用并行流水线操作,用于时间要求较高的场合。(6)MMR是基地址为零(不考虑SP、DP、CPL)的直接寻址方式,寻址速度较快,可以直接快速访问数据存储器的0页资源。7种寻址方式不同的用途

TMS320C54x的指令集有129条指令,由寻址方式不同衍生至216条,按功能分为如下几类:

算术运算指令 逻辑运算指令

程序控制指令

装入和存储指令P98表2-1列出了指令系统的符号和意义TMS320C54x的指令集

当它表示一个整数时,其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。

如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。

当需要表示小数时,小数点的位置始终在最高为后,而最高位(D15)表示符号位。这样次高位(D14)表示0.5,然后是0.25,。所以4000H表示小数0.5,2000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。小数或整数由FRCT位决定:

SSBXFRCT;将FRCT置1,下面是以小数方式运算定点DSP中数据表示方法1、算术运算指令算术运算指令用于完成加减乘除等算术运算。按照功能的不同可以将算术运算类指令分为7组:(1)加法指令(ADD)(2)减法指令(SUB)(3)乘法指令(MPY)(4)乘加指令(MAC)(5)乘减指令(MAS)(6)双数/双精度(32比特操作数)(DADD、DSUB)(7)专用指令(Application-specific)(1)加法指令将16比特的值与累加器内容或另一个数据存储单元内容相加,并把结果放进累加器。ADDSmem,src

;src=(Smem)+(src)ADDSmem,TS,src

;src=(Smem)<<TS+(src)ADDSmem,16,src[,dst];src

or[,dst]=(Smem)<<16+(src)ADDSmem,[SHIFT],src[,dst];src

or[,dst]=(Smem)<<[SHIFT]+src

2ADDXmem,SHFT,dst

;src=(Xmem)<<SHFT+(src)ADDXmem,Ymem,dst

;dst=((Xmem)+(Ymem))<<16ADD#1k,[SHFT],src[,dst];src

or[,dst]=lk<<SHFT+(src)2ADD#1k,16,src[,dst];src

or[,dst]=lk<<16+(src)2ADDsrc[,SHIFT][,dst];dst=(srcor[,dst])+(src)<<SHIFTADDsrc,ASM[,dst];src

or[,dst]=(srcor[,dst])+(src)<<ASMADDCSmem,src;src=src+Smem+CADDM#lk,Smem;Smem=#lk+(Smem)2其中:Smem为16比特的单数据存储器操作数;

Xmem和Ymem为双数据存储器操作数;

src和dst为源(目的)操作数,这里是指C54x的累加器A和B

lk为整数,范围-32768到32767;SHIFT为移位位数,范围-16到15;

SHFT为移位位数,范围0到15;执行该指令时可能会影响的状态位有进位标志C和目的累加器溢出标志Ovdst;另外,影响该指令执行的状态位有符号扩展模式位SXM和溢出模式位OVM;算术运算指令大部分都只需要一个指令周期,只有个别指令需要2~3指令周期。(2)减法指令是将累加器的内容或另一个数据存储单元的内容与一个16比特的值相减,并把结果放进累加器。SUBSmem,src

;src=(src)-(Smem)SUBSmem,TS,src

;src=(src)-(Smem)<<TSSUBSmem,16,src[,dst];src

or[,dst]=(src)-(Smem)<<16SUBSmem[,SHIFT],src[,dst];src

or[,dst]=(src)-(Smem)<<SHIFTSUBXmem,SHFT,src

;src=(src)-(Xmem)<<SHFTSUBXmem,Ymem,dst

;dst=(Xmem)<<16-(Ymem)<<16SUB#1k[,SHFT],src[,dst];src

or[,dst]=(src)-1k<<SHFTSUB#1k,16,src[,dst];src

or[,dst]=(src)-1k<<16SUBsrc[,SHIFT][,dst];dst=(dst)-(src)<<SHIFTSUBsrc,ASM[,dst];src

or[,dst]=(dst)-(src)<<ASMSUBB Smem,src ;src-Smem-CSUBCSmem,src;if(src-Smem<<15)>=0;src=(src-Smem<<15)<<1+1Elsesrc=src<<!SUBSSmem,src;src=src-uns(Smem)(3)乘法指令在‘C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B累加器中。乘数在‘C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B累加器的高16位。如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。状态位:影响该指令执行的状态位有:分数模式位FRCT和溢出模式位OVM;执行该指令会产生的状态位:目的累加器溢出标志OVdst3、乘法指令rsbx FRCT ;清FRCT标志,准备整数乘ld temp1,T ;将变量temp1装入T寄存器mpy temp2,A ;完成temp2*temp1,结果放;入A寄存器(32位)整数乘法举例在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。实现小数乘法

ssbxFRCT ;FRCT=1,准备小数乘法

ld temp1,16,a ;将变量temp1装入累加器A的高16位

mpyatemp2 ;完成temp2乘累加器A的高16位,结

;果在B中,同时将temp2装入T寄存器

sth b,temp3 ;将乘积结果的高16位存入变量temp3如:0.1(0x0ccd)x0.7(0x599a)

=0.06997680664063(0x08f5)注:可以使用MPYR完成四舍五入。比较如下结果

mpyrtemp1,b

;T*temp1->b(4)乘加指令乘加指令是将临时寄存器T或一个数据存储单元的内容与一个立即数或另一个数据存储单元的内容相乘并把乘积与源累加器的内容相加,然后把结果放进累加器中。MAC[R]Smem,src;src=(T)*(Smem)+(src)MAC[R]Xmem,Ymem,src[,dst];src

or[dst]=(Xmem)*(Ymem)+(src),T=(Xmem)MAC#1k,src[,dst];dst=(T)*1k+(src)MACSmem,#1k,src[,dst];dst=(Smem)*1k+(src),T=(Smem)影响该指令执行的状态位有:分数模式位FRCT和溢出模式位OVM;执行该指令会产生的状态位:目的累加器溢出标志OVdst.(5)乘减指令乘减指令MAS,将临时寄存器T或一个数据存储单元的内容与另一个数据存储单元的内容相乘并把乘积与源累加器的内容相减,然后把结果放进累加器中。MAS[R]Smem,src;src=(src)-(T)*(Smem)MAS[R]Xmem,Ymem,src[,dst];

src

or[dst]=(src)-(Xmem)*(Ymem),T=(Xmem)影响该指令执行的状态位有:分数模式位FRCT和溢出模式位OVM;执行该指令会产生的状态位:目的累加器溢出标志Ovdst乘加和乘减指令汇集(6)双字指那些有一个操作数为双字长(32比特)的指令。以DADD为例,其语法及完成的操作如下所示,它在C16的控制下完成一个32比特的加或两个16比特的加;DADDLmem,src[,dst];If(C16)=0Thendst=(Lmem)+(src);Elsedst(39-16)=(Lmem(31-16))+(src(31-16))dst(15-0)=(Lmem(15-0))+(src(15-0))Lmem为双字(32比特)数据存储器操作数;src和dst为源(目的)操作数,这里是指C54x的累加器A和累加器B。影响该指令执行的状态位有:符号扩展模式位SXM和溢出模式位OVM(当C16=0时);执行该指令会产生的状态位:进位标志C和目的累加器溢出标志OVdst;双精度/双数操作指令(七)特殊指令2.逻辑运算指令按照功能的不同可以将逻辑运算指令分为5组:与(AND)指令或(OR)指令异或(XOR)指令移位(SHIFT)指令测试(TEST)指令(1)与指令Smem为16比特的数据存储器操作数;src和dst为源(目的)操作数,一般为累加器A和累加器B;1k为整数,范围-32768到32767;SHIFT为移位位数,范围-16到15;SHFT为移位位数,范围0到15;(2)或指令src(39-16)不变影响该指令执行的状态位:无执行该指令会产生的状态位:无(3)异或指令影响该指令执行的状态位:无执行该指令会产生的状态位:无(4)移位和测试指令

测试(TEST)指令可以测试操作数的比特位的值,也可以比较两个数是否相等。BITFSmem,#1k;如果(Smem&&1k)=0,则TC=0;否则TC=1CMPMSmem,#1k;如果Smem等于#1k,则TC=1;否则TC=0;TC为测试结构比特;其中影响该指令执行的状态位:无执行该指令会产生的状态位:测试控制比特TC3、程序控制指令程序控制指令用于控制程序的流程,也就是指令的执行顺序。按照功能的不同可以将程序控制类指令分为7组:跳转(Branch)指令;调用(Call)指令;中断(Interrupt)指令;返回(Return)指令;重复(Repeat)指令;堆栈操作指令;混合程序控制指令;(1)跳转指令

跳转指令可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。这种跳转可以是无条件的跳转,也可以是有条件的跳转。以BC为例:BCpmad,cond[,cond[,cond]];

if(cond(s))ThenPC=pmad(15-0),elsePC=PC+2其中pmad为16比特的程序地址,范围0到65535;Cond为跳转的条件,包括:条件说明条件说明BIOBIO为低NBIOBIO为高CC=1NCC=0TCTC=1NTCTC=0AEQ(A)=0BEQ(B)=0ANEQ(A)<>0BNEQ(B)<>0AGT(A)>0BGT(B)>0AGEQ(A)>=0BGEQ(B)>=0ALT(A)<0BLT(B)<0ALEQ(A)<=0BLEQ(B)<=0ALVA溢出BOVB溢出ANOVA没有溢出BNOVB没有溢出UNC无条件

采用延迟方式,紧接着该指令的两条单指令或一条双字指令从程序存储器中取出先执行,但如果条件满足,那么这两字将从流水中冲掉,程序从pmad开始;如果条件不满足,PC加2且紧接着该指令的两个字继续执行。例:STM#3FFFH,@xBCD2000H,AGTBC2000H,AGT;(4/2)STM#3FFFH,@X;2(2)调用指令

调用指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与跳转指令不同的是,DSP在执行完被调用的程序段后要返回起跳处继续执行原来的程序。同样,这种调用也可以是无条件的或有条件的。下面以CALL为例:CALLpmad;SP=(SP-1),TOS=(PC+2),

PC=pmad(15-0)

其中pmad为目的程序地址;

SP为堆栈指针;TOS为堆栈的顶端;(3)中断指令中断指令同样可以改变程序指针PC的值,使程序从一个地址跳转到另一个地址执行。但与调用指令一样,DSP在执行完中断服务程序后要返回发生中断的地方继续执行原来的程序。当发生中断时,DSP会置INTM为1,屏蔽所有可屏蔽中断,并在中断标志寄存器IFR中设置相应的中断标志。下面以INTR为例:

INTRK;SP=(SP-1),TOS=(PC+1),PC=IPTR(15-7)+K<<2,INTM=1其中K为C54xDSP的中断号码,范围0到31;

IPTR为9比特长的中断向量指针;执行该指令会产生的状态位:INTM和中断标志寄存器IFR中相应的位INTR3例:(4)返回指令返回指令用于在执行完被调用的程序段或中断服务程序后,返回到调用指令或发生中断的地方,使DSP能继续执行原来的程序。快速返回寄存器SP++允许中断下面以RETE为例:RETE;PC=TOS,SP=(SP+1),INTM=0影响该指令执行的状态位:无执行该指令会产生的状态位:中断屏蔽位INTM(5)重复指令重复指令可以使DSP重复执行一条指令或一段指令;RPT#K;单指令重复,RC=#K举例:累加器清零,循环执行下一条n+1次(6)堆栈操作指令

堆栈操作指令可以对堆栈进行压入(PUSH)和弹出(POP)操作,相应的操作数可以是数据存储单元Smem或存储映射寄存器MMR。下面以PSHD和POPM为例:PSHDSmem;SP=(SP-1),TOS=SmemPOPMMMR;MMR=TOS,SP=(SP+1)其中,Smem为16比特的数据存储器操作数;

MMR为存储映射寄存器空指令实现一个非屏蔽的软件复位对状态寄存器ST0和ST1特定位清零对状态寄存器ST0和ST1特定位置1修改辅助寄存器保持空闲状态直到有中断产生条件执行(7)混合程序控制指令举例:(1)XC1,ALEQMAR*AR1+ADDA,DAT100(2)LOOP1:XC2,BIOB LOOP1PORTRPA0,@y1……FFFFFFFFFFA执行前FFFFFFFFFFA执行后AR10032AR100334、装载与存储指令装载和存储指令用于完成数据的读入和保存,按照功能可以为:装入和存储指令包括:

一般的装入

温馨提示

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

评论

0/150

提交评论