linux嵌入式-国嵌4-7chapter1.ARM处理器寻址方式_第1页
linux嵌入式-国嵌4-7chapter1.ARM处理器寻址方式_第2页
linux嵌入式-国嵌4-7chapter1.ARM处理器寻址方式_第3页
linux嵌入式-国嵌4-7chapter1.ARM处理器寻址方式_第4页
linux嵌入式-国嵌4-7chapter1.ARM处理器寻址方式_第5页
免费预览已结束,剩余199页可下载查看

下载本文档

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

文档简介

第4ARM7TDMI(-S)简ARM处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。指令集,ARM指令集效率高,但是代码密度低;而Thumb指令集具有较高的代码密度,却仍然保持ARM的大多数性能上的优势,它是ARM指令集的程序和Thumb程序可相用,相互之间的状态切第4ARM7TDMI(-S)ARM指令集与Thumb指令集的关ARM处理器寻址方寻址方式分寻址方式是根据指令中给出的地址码字段来实现寻找真作数地址的方式。ARM处理器具有9 3.寄存器移位寻址 4.寄存器间接寻址5.基址寻址 6.多寄存器寻址7.堆栈寻址 8.块拷贝寻址ARM处理器寻址方寻址方式分类——寄存器寻的是寄存器 SUB 到MOVARM处理器寻址方寻址方式分类——立即寻这B 这BMOVMOV

从代码中获得数据MOVARM处理器寻址方寻址方式分类——寄存器移位寻寄存器移位寻址是ARM当第2个操作数是寄存器移位方式时,第2。VD。VD MOVR0,R2,LSLARM处理器寻址方寻址方式分类——寄存器间接寻寄存器间接寻址指令中的地址码给出的是一个通用寄存器的,所需的操作数保存在寄存器指 。R。RPLDRARM处理器寻址方寻址方式分类——基址寻基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻 RLDR据LDRARM处理器寻址方寻址方式分类——多寄存器寻器LDRR1!,{R2-MM0x4000000x400000ARM处理器寻址方寻址方式分类——堆栈寻堆栈是一个按特定顺序进行存取的区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块区域(堆栈),指针所指向的单元即是堆栈的栈顶。ARM处理器寻址方寻址方式分类——堆栈寻增堆栈压增堆栈压增堆栈压堆栈栈 储 栈栈 栈顶ARM处理器寻址方寻址方式分类——堆栈寻压SP→栈SP→压SP→栈SP→栈栈栈压满满堆空堆ARM处理器寻址方寻址方式分类——堆栈寻满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA满递减:堆栈向下增长,堆栈指针指向内含有效空递减:堆栈向下增长,堆栈指针向堆栈下的第ARM处理器寻址方寻址方式分类——块拷贝寻多寄存器传送指令用于将一块数据 器STMIAR0!,{R1-R7};将R1~R7的数据保存 ;增长方向为向上增STMIBR0!,{R1-R7};将R1~R7的数据保存 ARM处理器寻址方寻址方式分类——相对寻相对寻址是基址寻址的一种变通。由程序计数量,两者相加后得到的地址即为操作数的有效地址。;调用到SUBR1子程;条件跳转到LOOP标号第42. 现两 器明简单的ARM程 现两 器明 使用“;”进行注 仿真调 Example1,CODE,READONLY;代码段 START 实际代码 ADD_SUB标号顶格 ;R0=R0+ 文件结简单的ARM程 Example1,CODE,READONLY; 代码段 START

;R0=R0+ 第42.ARM指令 指ARMARM指令 指ARM指令集介ARM指令集——指令格<opcode><opcode>{<cond>} <Rd>其中<>号内的项是必须的,{}号内的项是可选的。S:是否影响CPSR寄存器的值Rd:目标寄存器Rn:第1个操作数的寄存器指令集介ARM指令集——第2个操作<opcode><opcode>{<cond>} <Rd>灵活的使用第2个操作数“operand2”能够提高代指令集介ARM指令集——第2个操作该常数必须对应8位位图,即一个8位的常数通过循环右移10000000000000000000000000000100108位常00000100100000000000000000000000指令集介ARM指令集——第2个操作该常数必须对应8位位图,即一个8位的常数通过 指令集介ARM指令集——第2个操作 指令集介ARM指令集——第2个操作将寄存器的移位结果作为操作数,但RmASRRORLSL逻辑左移n带扩展的循环右移1LSR逻辑右移nType指令集介ARM指令集——第2个操作00ASR移位操作00CRRX移位操作C指令集介ARM指令集——第2个操作R1,R1,R1,LSLR1,R1,R2,LSR;R1=R1-ARM指令 指ARM指令集介ARM指令集——条件<opcode><opcode>{<cond>} <Rd>使用条件码“cond”可以实现高效的逻辑所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标指令条件码无条件执行(指令默认条件指令集介ARM指令集——条件C代码C代码If(a>对应的汇编代码ADDHIADDLS;R0与R1比;若R0>R1,则;若R0≤1,则ARM指令 指ARM指令集介ARM指令集— 指ARM处理器是典型的RISC处理器,对器的只能使用加载和指令实现。ARM 结构,程序空间、RAM空间及I/O映射空间统一编址,除对RAM操作以外,对IO、程序数据的均要通过加载/指令进行。器指令分为单寄存器操作指令和存器操作指令 指令——单寄存器加 LDRBTRd, Rd,LDRSBRd,LDRSHRd, 指令——单寄存 Rd, 以用户模式字据 以用户模式字节 [addressing]LDR/STR指令用于对内存变量的 、内存缓冲区数据的 、查表、部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序 指令” 指令——单寄存LDR和STR——字和无符号字节加载/指令LDR指令用于从内存中单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字Rd,<地址;将指定地址上的字数据读入Rd,<地址;将Rd中的字数据存入指定地Rd,<地址;将指定地址上的字节数据读入Rd,<地址;将Rd中的字节数据存入指定地理器是在模式下,系统也将看成是在用户模式下进行的。T在用户模式下无效,不能与W表示回Rn为基址寄存位立W表示回Rn为基址寄存位立即数,为1时,偏移量为寄存器移为指令的寻址方Rd为源/目标寄存U表示 (L为或L用于区别加载(L为(L为或L用于区别加载(L为为0表示B为1表示字指令执行的条件P表示前/后变 指令——单寄存 LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:立即数。立即数可以是一个无符号的数值。这个数据可以到基址寄存器,也可以从基址寄存器中减去这个如:LDR寄存器。寄存器中的数值可以加到基址寄存器,也可以从址寄存器中减去这个数如:LDR寄存器及移位常数也可以从基址寄存器中减去这个数如:LDRR1,[R0,R2,LSL 指令——单寄存 从寻址方式的地址计算方法分,加载 指令有以下种格式零偏移如前索引偏移如程序相对偏移如后索引偏移如注意:大多数情况下,必须保证字数据操作的地址是32位齐的 指令——单寄存 这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/字和无符号字节指令相同。Rd,<地址;将指定地址上的有符号字节读入Rd,<地址;将指定地址上的有符号半字读入Rd,<地址;将指定地址上的半字数据读入Rd,<地址;将Rd中的半字数据存入指定地注意有符号位半字/字节加载是指用符号位加载扩展到32符号半字加载是指用零扩展到32位半字读写的指定地址必须为偶数,否则将产生不可靠的结果(L为或L用于区别加载(L为Rn为基址寄存U表示加(L为或L用于区别加载(L为Rn为基址寄存U表示加位立即数,为1时,偏移量为寄存器移为指令的寻址方Rd为源/目标寄存指令执行的条件P表示前/后变为0表示无符,指令执行的条件P表示前/后变为0表示无符,H为1表示半0表示字W表示W表示回S为1表示有符, 指令——单寄存LDR和STR加载 字和无符号字节指 R1,[R0,#0x04];将R1的数 到R0+0x04地 加载 半字和有符号字节指LDRSB ;高24位用符号扩 ;将R2指向地址的半字数据存入R6,高16位用0扩;读出后 R1,[R0,#2]!;将R1的半字数据保存到R0+2 指令——多寄存器存LDM{mode}STM{mode}[Rn...]←reglist,Rn多寄存器加载/ 指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为 多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据 、常数传递等。 指令——多寄存器存多寄存器加载 指令格式如下LDM{cond}<模式STM{cond}<模式cond:指令执行的条件模式:控制地址的增长方式,一共有8种模式!:表示在操作结束后,将最后的地址写回Rn中reglist:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开{R1,R2,R6-R9},寄存器由小到大排列^:加入该后缀后,进行数据传送且寄存器列表不包含PC时,加的寄存器是用户模式下的,而不是当前模式的寄存器。若在LDM指令且寄存器列表中包含有PC时使用,那么除了正常的多寄存器传送外,还将SPSR也拷贝到CPSR中,这可用于异常处理返回。注意:该后缀不允许在用户模式或系统模式下使用。(L为或L用于区别加载(L为Rn为基址寄存寄存(L为或L用于区别加载(L为Rn为基址寄存寄存器列P表示前/后变U表示加 指令执行的条件S对应于指令中的”^”符W表示回 指令——多寄存器存多寄存器加载 指令的8种模式如下表所示,右边四种为堆操作、左边四种为数据传送操作每次传送后地址加每次传送后地址减每次传送前地址减进行数 时,先设置好源数据指针和目标指针,然后使用拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDALDMDB/STMDB进 进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFASTMEA/LDMEA实现堆栈操作 指令——多寄存器存数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址

R1’R1

R1’R1

指令STMIAR1!,{R5- 指令STMIBR1!,{R5-R1R1’

R1

→指令STMDAR1!,{R5- 指令STMDBR1!,{R5-......堆栈操作(详见 寻址方式堆栈寻址”)和数据块传送指类似,也有4种模式,它们之间的关系如下表所两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈 器交换指 寄存器和器字Rd←[Rn],[Rn]←Rm(Rn≠Rd或 寄存器和器字Rd←[Rn],[Rn]←Rm(Rn≠Rd或SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元SW指令格式如下 其中,B为可选后缀,若有B,则交换字节,否则交换2位字;Rd用于保存从器中读入的数据;Rm的数据用于到器中,若Rm与Rn相同,则为寄存器与器内容进行交换;Rn为要进行 的器RnRm相。 器交换指 Rn为基址寄存指令执行Rn为基址寄存指令执行的条件B用于区别无符号字节(B为1)或字(BRm源寄存Rd目标寄存 ;将R0指向 单元内的 ARM指令 指ARM指令集介ARM指令集——ARM数据处理指数据处理指令大致可分为3数据处理指令只能对寄存器的内容进行操作,ARM数据处理指令——指令编第二操作指令执行的条件第二操作指令执行的条件操作指令助说逻辑与操作指逻辑异或操作指减法运算指逆向减法指加法运算指带进位加存带进位减法指与指令带进位逆向减法指位测试指相等测试指比较指负数比较指逻辑或操作指数据传位清除指数据非传I用于区别立即数为1)和寄存器移位(I为opcode数据处理指令操作ARM数据处理指令——数据传 ARM数据处理指令——数据传 MOV指令将8位图立即数(参“第操作数:#immed_r——常数表式 ”或寄存器传送到标寄存器d,可用于位运算等操作。指令格式如下: MOV指令举例如下;R3=R1<<2,并影响标志;PC=LR,子程序返ARM数据处理指令——数据传 MVN指令将8位图立即数(参看“第2操作数:#immed_8r——常表达 ”)或寄存器(operand2)按位取反后传送到目标寄存(Rd),因为其具有取反功能,所以可以装载范围更广的立即数。指令式如下 MVN指令举例如下;将R2取反,结果存到ARM数据处理指令——算术运Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,ARM数据处理指令——算术运Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,加法运算指令——DD指令将opernd2的值与n的值相加,结果保存到寄存器。指令格式如下: 应用示例 ;R1=R1+1,并影响标志 减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存减法运算指令——SUB指令用寄存器Rn减去operand2,结果保存到中。指令格式如下应用示例Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,;R0=R0-1,并影响标志;R2=R1-R2,并影响标志逆向减法运算指令——RSB指令将operand2的值减去RnRd中。指令逆向减法运算指令——RSB指令将operand2的值减去RnRd中。指令格式如下应用示例Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,;R3=0xFF00-R1,R2,R2,LSL;R1=(R2<<2)-ARM数据处理指令——算术运Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,带进位加法指令——ADC将operand2的值与Rn的值相加,再加上 应用示例(使用ADC实现64位加法,结果存于R1、R0中;R0等于低32位相加,并影响标志;R1等于高32位相加,并加上低位进ARM数据处理指令——算术运Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,带进位减法指令——SBC用寄存器Rn减去operand,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存到Rd中。指令格式如下: 应用示例(使用SBC实现64位减法,结果存于R1、R0中;低32位相减,并影响标志;高32位相减,并减去低位借ARM数据处理指令——算术运Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,带进位逆向减法指令——RSC指令用寄存器operand2减去Rn,再减CPSR中的C条件标志位,结果保存到Rd中。指令格式如RSC{cond}{S}Rd,Rn,operand2应用示例(使用RSC指令实现求64位数值的负数):RSBSR2,R0,#0RSCARM数据处理指令——逻辑运算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnARM数据处理指令——逻辑运算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn逻辑与操作指令——AND指令将operand2的值与寄存器Rn的值按位作逻辑“与”操作,结果保存到Rd中。指令格式如下 应用示例;R0=R0&0x01,取出最低位数ARM数据处理指令——逻辑运算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn逻辑或操作指令——ORR指令将operand2的值与寄存器Rn的值按位逻辑“或”操作,结果保存到Rd中。指令格式如下 Rd,Rn,应用示例 ;将R0的低4位置R1,R2,LSRR3,R1,R3,LSL;使用ORR指令将R2的高8;数据移入到R3低8位逻辑异或操作指令——EOR指令将operand2的值与逻辑异或操作指令——EOR指令将operand2的值与寄存器Rn作逻辑“异或”操作,结果保存到Rd中。指令格式如Rd,Rn,应用示例Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn;将R1的低4位取;将R5和0x01进行逻辑异或;结果保存到R0,并影响标志ARM数据处理指令——逻辑运算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn位清除指令——BIC指令将寄存器Rn的值与operand2的值的反码按作逻辑“与”操作,结果保存到Rd中。指令格式如下 Rd,Rn,应用示例 ;将R1的低4位清零,其它位不 ;将R3的反码和R2相逻辑“与;结果保存到R1ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←RnARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn比较指令——CMP指令将寄存器n的值减去operand的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,应用示例 ;R1与10比较,设置相关标志 ;R1与R2比较,设置相关标志ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn比较指令——CMP指令将寄存器n的值减去operand的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,注意:CMP指令与SBS指令的区别在于CM指令不保存运算结果。在进行两个数据的大小判断时,常用CM指令及相应的条件码来操作。ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn负数比较指令——CMN指令使用寄存器Rn的值加上operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,应用示例 ;R0+1,判断R0是否为1的补;如果是,则设置Z标志ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn负数比较指令——CMN指令使用寄存器Rn的值加上operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,注意:CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较,比如CMNR0,#1指令则表示R0与-1比较,若ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn位测试指令——TST指令将寄存器Rn的值与operand2的值按位作逻辑“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,应用示例 ;判断R0的最低位是否为 ;判断R1的低4位是否为ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn位测试指令——TST指令将寄存器Rn的值与operand2的值按位作逻辑“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,注意:TST指令与NDS指令的区别在于TST指令不保存运算结果。TST指令通常与EQ、NE条件码配合使用,当所有测试位均为0时,EQ有效,而只要有一个测试位不为0,则NE有效。ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn相等测试指令——TEQ指令将寄存器Rn的值与operand2的值按位作逻辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,应用示例 ;比较R0与R1是否相等(不影响V位和C位ARM数据处理指令——比较指 Rn,标志N、Z、C、V←Rn- Rn,标志N、Z、C、 Rn,标志N、Z、C、V←Rn Rn,标志N、Z、C、V←Rn相等测试指令——TEQ指令将寄存器Rn的值与operand2的值按位作逻辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: Rn,注意:TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用TEQ进行相等测试时,常与EQ、NE条件码配合使用。当两个数据相等时,ARM指令 指ARM指令集介ARM指令集——乘法指ARM7TDMI32×3232323232位结果为64ARM指令——乘法指Opcode乘Opcode乘法指令操作Rm为被乘数寄存指令执行的条件opcode操s码功指令执行的条件S设置条件码,与指令中的S位对

操作

指令助记

说令32位乘法指 相令32位乘加指 乘器或64位乘法指令的目标寄存器(

64位无符号乘法指令(64位无符号乘加指64位有符号乘法指64位有符号乘加指ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLALARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL32位乘法指令——MUL指令将Rm和Rs中的值相乘,结果的低32位保存到中。指令格式如下: 应用示例;R0=R3×R7,同时影响CPSR中的N位和ZARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL32位乘加指令——MLA指令将Rm和Rs中的值相乘,再将乘积加上第个操作数,结果的低32位保存到Rd中。指令格式如 应用示例 ;ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位无符号乘法指令——UMULL指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 应用示例 (R1、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位无符号乘加指令——UMLAL指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 应用示例 ;(R1、R0)=R5×R8+(R1、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位有符号乘法指令——SMULL指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 应用示例 (R3、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位有符号乘加指令——SMLAL指令将Rm和Rs中的值作有符64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 应用示例 ;(R3、R2)=R7×R6+(R3、ARM指令 指ARM4.2指令集介ARM指令集——分支指寄存器赋值实现跳转。分支指令有以下三种: 带状态切换的分支指令BXARM分支指令——指令编指指令执行的条件24位有符号立即(偏移量L区别B指令(L为0)指令指令执行的条件Rm目标地址寄存器,ARM指令——分支指 带的分支指LR←PC- ARM指令——分支指 带的分支指LR←PC- 分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下 应用示例 ;跳转到WAITA标号 ;跳转到绝对地址0x1234ARM指令——分支指 带的分支指LR←PC- 带的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运 BL2.程序跳转到目标地址BL2.程序跳转到目标地址 MOVMOVARM指令——分支指 带的分支指LR←PC- 带的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运 应用示例 用子程序ARM指令——分支指 带的分支指LR←PC- 带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内(RM指令为字对齐,最低20)。指令格式如下: 0011ARM指令——分支指 带的分支指LR←PC- 带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内(RM指令为字对齐,最低20)。指令格式如下: 应用示例 R0,ThumbFun+1;将Thumb程序 地址加1存入 ;跳转到R0指定的地址;并根据R0的最低位来切换处理器状ARM指令 指ARM4.2指令集介ARM指令集——协处理器指协处理器协处理器…ARM内核协处理器协处理器…ARM指令——协处理器指 coprocCRd,协处理器数据指 coprocCRd, ARM 协处理器寄存器到ARMARM协处理器指令——数据操作指RM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异DPcd的协处

放第1个源操作数{,pcde存放第2个源操作数 数据操作指令编ARM协处理器指令——数据操作指RM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异应用示例 ;对协处理器7操作,操作码为;可选操作码为 ;对协处理器6操作,操作码为 ARM协处理器指令——数据存取指协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功执行该操作,将产生未定义指令异 coproc,CRd,<地址数 coproc,CRd,<地址 coproc,CRd,<地址数 coproc,CRd,<地址ARM协处理器指令——数据存取指协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功W执行该操作,将产生未定义指令异W8P数据操作指令编8PL(为0)还是写入协处理器中的目标ARM协处理器指令——数据存取指协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功执行该操作,将产生未定义指令异数据操作指令编应用示例 R2+4指向的内存单元的数;传送到协处理器p5的c2寄存器 ;将协处理器p5的C1寄存器内数;传送到R0指向的内存单ARM协处理器指令——寄存器传送指如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用M RC指令。MC指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中。 MCR指令格式(ARM→协 MRC指令格式(协处理器→ 存放第1个操作数的可选的协处理器特ARM协处理器指令——寄存器存放第1个操作数的可选的协处理器特如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用M RC指令。MC指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中。存放第2个操作数寄存器传送指存放第2个操作数L表示数据是传入ARM(为0)还是传ARM协处理器指令——寄存器传送指如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用M RC指令。MC指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中。寄存器传送指令编应用示例;将ARM中的R7寄存器内容传;到协处理器6的C1和C2寄存;将协处理器5的C3和C2寄存;内容传递到ARM中的R2寄存ARM指令 指ARM4.2指令集介ARM指令集——杂项指 ARM杂项指令——软中断指SWI指令用于产生软中断,从而实现在从户模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常。在其它模式下也可使用SW指令,处理器同样地切换到管理模式。该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。SWI指令格 SWI指令编指令传递的参数(24位立即数指令传递的参数(24位立即数ARM杂项指令——软中断指根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24器传递 ;设置子功能号为 ;调用12号软中指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。;调用12号软中;设置子功能号为0ARM杂项指令——软中断指在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可过对 得到然后取得该SWI指令的地址,这可通 LR寄存器得到接着读出该SWI指令,分解出立即数SP!,{R0-;现场保R0,;SP!,;保存R0,;测试T标志R0,[LR,#-;若是Thumb指令 指令码(16位ER0,ER0,R0, 取得Thumb指令的8位立即LDREQR0,[LR,#- ;若是ARM指令 指令码(32位BICEQR0,R0, 取得ARM指令的24位立即 SP{R0-R3,R12,PC}^SWI异常中断返ARM杂项指令——状态寄存器读指在ARM处理器中,只有MRS指令可以对状态寄存器CSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。目标寄存器,不能为区别CPSR(为目标寄存器,不能为区别CPSR(为0)指指令对应编ARM杂项指令——状态寄存器读指在ARM处理器中,只有MRS指令可以对状态寄存器CSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。 MRS指令 应用示例 ;将CPSR状态寄存 ,保存到R1 ;将SPSR状态寄存 ,保存到R2ARM杂项指令——状态寄存器写指在ARM处理器中,只有MSR指令可以对状态寄存器CSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/ RQ/FQ中断等。MSR指令格式 psr_fields,#immedMSR指令格式保存要传送到状态寄存器指定域数据要传送到状态寄存x扩展域x扩展域cssfARM杂项指令——状态寄存器写指在ARM处理器中,只有MSR指令可以对状态寄存器CSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/ RQ/FQ中断等。MSR指令2要传送到状态寄存ccx扩展域x扩展域 ssf4.返回上一层函数3.将修改后的值写回CPSR寄存4.返回上一层函数3.将修改后的值写回CPSR寄存的对应控制域2.修改对应于CPSR中的I控制位1.将CPSR寄存器内容读出到在ARM处理器中,只有MSR指令可以对状态寄存器CSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/ RQ/FQ中断等。应用示例;子程序:使能IRQ中应用示例;子程序:禁能IRQ中R0,R0R0,R0,ARM指令 指ARM4.2指令集介ARM伪指ARM伪指令不属于ARM指令集中的指令,是ARM伪指令——小范围的地ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该DADR伪指令格 地址表达式expr的取指范围当地址值不是字对齐时,其取指范围为-当地址值是字对齐时,其取指范围为-当地址值是16字节对齐时,其取指范围ARM伪指令ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该D应用示例(源程序使用伪指令将程序标号Delay的地址存入ARM伪指令——小范围的地ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该D应用示例(源程序 编译后的反汇编代码 Delay的地址存入

地 程序代ARM伪指令——小范围的地ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该D应用示例(源程序 使用伪指令将程序标号Delay的地址存入

编译后的反汇编代码0x200x20 0x64 ADR伪指令被汇编成一条指ARM伪指令——小范围的地ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该D应用示例2(查表;加载转换表地;使用R2作为参数,进行查… 0xC0,0xF9,0xA4,0xB0,0x99,ARM伪指令——中等范围的地ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中,比ADR伪指令可以更大范围的地址译器编译源程序时,DRL伪指令被编译器替换成两条合适的指令。若不能ADRL伪指令格地址表达式expr的取指范围当地址值不是字对齐时,其取指范围为-当地址值是字对齐时,其取指范围为-当地址值是16字节对齐时,其取指范围ARM伪指令——中ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中,比ADR伪指令可以更大范围的地址译器编译源程序时,DRL伪指令被编译器替换成两条合适的指令。若不能应用示例(源程序使用伪指令将程序标号Delay的地址存入ARM伪指令——中等范围的地ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中,比ADR伪指令可以更大范围的地址译器编译源程序时,DRL伪指令被编译器替换成两条合适的指令。若不能应用使用伪指令将程序标号Delay的地址存入

编译后的反汇编代码 地 程序代ARM伪指令——中等范围的地ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值到寄存器中,比ADR伪指令可以更大范围的地址译器编译源程序时,DRL伪指令被编译器替换成两条合适的指令。若不能应用示例(源程序 使用伪指令将程序标号Delay的地址存入

编译后的反汇编代码0x20 0x24 0x68 ADRL伪指令被汇编成两条指令,尽管第2条指令并没有意ARM伪指令——大范围的地LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。LDR伪指令格 基于基于PC的地址表达式R0,ARM伪R0,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(源程序使用伪指令将程序标号InitStack的地址存入ARM伪指令——大范围的地LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(源程序 编译后的反汇编代码 R0,

R0, 使用伪指令将程序标号InitStack的地址存入

地 程序代R0,ARM伪指令R0,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(源程序 编译后的反汇编代码 R0,使用伪指令将程序标号并在文字池中定义了一个常量,该ARM伪指令——大范围的地LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。注意从指令位置到文字池的偏移量必须小于与ARM指令的LDR相比,伪指令的LDR的参数有“=”号ARM伪指令——空操作伪指NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延时操作。NOP伪指令格应用示例(延时子程序第42.4.2指令集介Thumb指子集,它是为减小代码量而 ,具有16位的代说明:Thumb指令的格式与使用方式与ARM指令集类似,而且使用并不是很频繁,建议这部分内简单的Thumb程功能:使用BX

在Thumb程序段之要用 ;R0= ;R1= ;R0=R0+R1 Thumb指令 指Thumb指令 指4.2指令集介Thumb指令集与ARM指令集的区Thumb指令集较ARM分支指令的跳转范围 限制单寄存 Thumb指令 指4.2指令集介 指单寄存 指助记 说 操 影响标

加载 字数加载 无符号

Rd←[Rn,#immed_5×4],Rd、Rn为 Rd←[Rn,#immed_5×2],Rd、Rn为 Rd←[Rn,#immed_5×1],Rd、Rn为 Rd←[Rn,Rm],Rd、RnRm为 Rd←[Rn,Rm],Rd、RnRm为 4.2指令集介 指LDR和STR——加载 指PC或SP单寄存 指令——立即数偏移寻以这种寻址方式对器时,器的地址以 ] Rd,[Rn,#immed_5×4];将Rd中的字数据 Rd,[Rn,#immed_5×2];加载内存中的半字数据到寄存器Rd的低16位中 Rd,[Rn,#immed_5×2]; Rd,[Rn,#immed_5×1];加载内存中的字节数据到寄存器Rd中 Rd,[Rn,#immed_5×1] 其中:Rd表示加载 Rn表示基址寄存器。必须为R0~R7immed_5×N表示立即数偏移量,其取值范围为(0~31)×NImmed_5:5位无符立即数偏指令执行的条件码0110b:LDR/STR指Immed_5:5位无符立即数偏指令执行的条件码0110b:LDR/STR指令1000b:LDRH/STRH指令0111b:LDRB/STRB指令Rn:基址寄存Rd:源或目标寄存L用于区别加载(L为或(L为单寄存 指令——立即数偏移寻应用示例 注意:进行字数据时,必须保证传送地址为32位对齐。进行半字数据时,必须保证传送地址为16位对单寄存 指令——寄存器偏移寻一个寄存器的内容为偏移量,两者相加作为器的地 ;加载一个字 其中:Rd表示加载或 Rn表示基址寄存器。必须为R0~R7。Rm表示内含数偏移量的寄存器,必须为R0~R7Rm:偏移量寄存指令执行的条件码00b:LDR/STR指令Rm:偏移量寄存指令执行的条件码00b:LDR/STR指令01b:LDRH/STRH指令10b:LDRB/STRB指令Rn:基址寄存Rd:源或目标寄存L用于区别加载(L为或(L为说说明:当opcode位为11bL位为0代表指令“LDRSB“,L位为1代表单寄存 指令——寄存器偏移寻应用示例LDRSTRLDRHSTRHLDRBSTRBR1,[R3,R2]LDRSHR7,[R6,R3]LDRSB注意:进行字数据时,必须保证传送地址为32位对齐。进行半字数据时,必须保证传送地址为16位对单寄存 指令——相对偏移寻一个立即数为偏移量,两者相加作为器的地址。指 其中:Rd表示加载 immed_8×4表示偏移量,取值范围是(0~255)×4Rd:目标或源寄存单寄存 指令——相Rd:目标或源寄存PC相对偏移LDR指令编(L为为1)L:用于区别加载(L为为1)L:用于区别加载(immed8:偏移单寄存 指令——相对偏移寻应用示例 R0,[PC,#0x08]; PC+0x08地址上的字数;保存到R0 LOCALDAT地址上 ;保存到R3 R2寄存器的数据到;指向 单元(偏移量为注意:以PC作 址的相对偏移寻址指令只有而没有STR4.2指令集介 指PUSH和POP——实现低寄存器和可选的LR寄存器入栈及低寄存L用于区别出栈(L为或入栈(L为指令格reglist入栈/出栈低寄存器列表,即R0~R7 指令编寄存器入栈及出栈指应用示例{R0-;将低寄存器R0~R7全部入栈{R0-;LR也入;将堆栈中的数据弹出;低寄存器R0~R7及PC4.2指令集介 指LDMIA和STMIA——多寄存器加载 指可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDMIA为加载多个寄存器;STMIA为多个寄存器。使用它们允许一条指令传送8多寄存器加载 指指令格 其中:Rn加载 reglist加载 指令编L用于区别加载(L为还(L为多寄存器加载 指LDMIA/STMIA的主要用于数据 、参数传送等。进行数据传送时,若Rn在寄存器列表中对于LDMIA指令,Rn的最终值是加载的值,而不是增加后的地对于STMIA指令,若Rn是寄存器列表中的最低数字的寄存器,则Rn的值为Rn在初值,其它情况不可应用示例R0!,{R2-;加载R0指向的地址上的多字数R1!,{R2-;保存到R2~R7中,R0的值更新;将R2~R7的数据到R1指向;地址上,R1值更Thumb指令 指4.2指令集介Thumb数据处理指数操作。大部分的Thumb数据处理指令采用2地址更少,并且寄存器R8~R15受到限制。数据处4.2指令集介Thumb数据处理指令——数据传送指Rd←expr,Rd为影响N、Rd←(~RmRd、Rm均为影响N、Rd←(-RmRd、Rm均为影响N、Z、C、数据传送指令——MOV指令将8位立即数或寄存器传送到目标寄存器中。其指令格式如下 其中:Rd目标寄存器。MOVRd,#expr时,Rd必须在R0~R7之间。exper8位立即数,即0~255。Rm源寄存器。为R0~R15指令编码(立即数传送指令编码(寄存器传送数据传送指令——注意“MOVRd,#expr”指令会更新N和Z标志,对标志C和V无影响“MOVRd,Rm”指令,若Rd或Rm是高寄存器(R8~R15),则标志不受影响,若R或m都是低寄存器(0~7),则更新标志N和Z,且清CV。应用示例;;;PC=LR,子程序返数据传送指令——MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd中。指令的执行会更新NZ标志,对标志CV无影响。其指令格式如下:其中:Rd目标寄存器。MOVRd,#expr时,Rd必须在R0~R7Rm源寄存器。为R0~R15指令编数据传送指令——MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd中。指令的执行会更新NZ标志,对标志CV无影响。其指令格式如下:其中:Rd目标寄存器。MOVRd,#expr时,Rd必须在R0~R7Rm源寄存器。为R0~R15应用示例 ;将R2取反,结果存于数据传送指令——NEG指令将寄存器Rm乘以-1后传送到目标寄存器Rd中指令会更新N、Z、C和V标志。其指令格式如下其中:Rd目标寄存器,必须在R0~R7Rm源寄存器。为R0~R15指令编数据传送指令——NEG指令将寄存器Rm乘以-1后传送到目标寄存器Rd中指令会更新N、Z、C和V标志。其指令格式如下其中:Rd目标寄存器,必须在R0~R7Rm源寄存器。为R0~R15应用示例 ;R1=-4.2指令集介Thumb数据处理指令——算术逻辑运算指算术运算指令——ADD指令将两个数据相加,结果保存到Rd其中:Rd目标寄存器,必须在R0~R7Rn其中:

温馨提示

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

评论

0/150

提交评论