【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植

上传人:仙*** 文档编号:172077461 上传时间:2022-11-30 格式:PPT 页数:164 大小:1.60MB
收藏 版权申诉 举报 下载
【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植_第1页
第1页 / 共164页
【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植_第2页
第2页 / 共164页
【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植_第3页
第3页 / 共164页
资源描述:

《【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植》由会员分享,可在线阅读,更多相关《【培训课件】ARM嵌入式系统基础教程—ARM7TDMI(S)指令系统寻址方式和嵌入式程序设计、操作系统移植(164页珍藏版)》请在装配图网上搜索。

1、1.ARM程序的文件类型:ARM开发中大部分程序使用C语言编写,文件类型为“”;:涉及到硬件底层操作的代码有时必须使用汇编语言编写,文件类型为“”。2.为什么学习ARM指令系统:1.ARM处理器的寻址方式;2.ARM指令的特点;3.ARM指令的种类,它能完成哪些功能。本章学习重点目录q1.ARM处理器寻址方式q2.指令集介绍 ARM指令集 Thumb指令集目录q1.ARM处理器寻址方式q2.指令集介绍 ARM指令集 Thumb指令集第3章 ARM7TDMI(-S)指令系统 简介 ARM处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。ARM7TDMI(-S)具有

2、32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代码密度低;而Thumb指令集具有较高的代码密度,却仍然保持ARM的大多数性能上的优势,它是ARM指令集的子集。所有的ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。第3章 ARM7TDMI(-S)指令系统 ARM指令集与Thumb指令集的关系Thumb指令集具有灵活、小巧的特点ARM指令集支持ARM核所有的特性,具有高效、快速的特点3.1 ARM处理器寻址方式 寻址方式分类 寻址方式是根据指令中给出的地址码字段来实现寻找真实操

3、作数地址的方式。ARM处理器具有8种基本寻址方式。1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.相对寻址。操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOV R1,R2 ;将R2的值存入R1 SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0 0 xAA0 x55R2R13.1 ARM处理器寻址方式 寻址方式分类寄存器寻址MOV R1,R2MOV R1,R20 xAA 立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是

4、说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1 ;R0减1,结果放入R0,并且影响标志位MOVR0,#0 xFF000 ;将立即数0 xFF000装入R0寄存器 0 x55R0MOV R0,#0 xFF00程序存储3.1 ARM处理器寻址方式 寻址方式分类立即寻址MOV R0,#0 xFF00MOV R0,#0 xFF000 xFF00从代码中获得数据 寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指

5、令举例如下:MOVR0,R2,LSL#3 ;R2的值左移3位,结果放入R0,;即是R0=R28 ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R10 x55R0R20 x013.1 ARM处理器寻址方式 寻址方式分类寄存器移位寻址MOV R0,R2,LSL#3MOV R0,R2,LSL#30 x080 x08逻辑左移3位 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中

6、SWPR1,R1,R2;将寄存器R1的值和R2指定的存储;单元的内容交换 0 x55R0R2 0 x400000000 xAA0 x400000003.1 ARM处理器寻址方式 寻址方式分类寄存器间接寻址LDR R0,R2LDR R0,R20 xAA 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDRR2,R3,#0 x0C ;读取R3+0 x0C地址上的存储单元 ;的内容,放入R2 STRR1,R0,#-4!;先R0=R0-4,然后把R1的值寄存 ;到保存到

7、R0指定的存储单元 3.1 ARM处理器寻址方式 寻址方式分类基址寻址0 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0CLDR R2,R3,#0 x0C0 xAA将R3+0 x0C作为地址装载数据 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,R2-R7,R12 ;将R1指向的单元中的数据读出到 ;R2R7、R12中(R1自动加1)STMIAR0!,R2-R7,R12 ;将寄存器R2R7、R12的值保 ;存到R0指向的存储;单元中 ;(R0自动加1)0

8、x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器3.1 ARM处理器寻址方式 寻址方式分类多寄存器寻址LDMIA R1!,R2-R4,R6 LDMIA R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上

9、生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈3.1 ARM处理器寻址方式 寻址方式分类堆栈寻址3.1 ARM处理器寻址方式 寻址方式分类堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0 x123456780 x12345678堆栈压栈堆栈压栈栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。3.1 ARM处理器寻址方式 寻址方式分类堆栈寻址0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈所以可以组合出四种类型的堆栈

10、方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。STMFD SP!,R1-R7,LR LDMFD SP!,R1-R7,LR 3.1 ARM处理器寻址方式 寻址方式分类堆栈寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地

11、址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处.LOOPMOVR6,#1.SUBR1.3.1 ARM处理器寻址方式 寻址方式分类相对寻址1.ARM处理器的寻址方式 8种寻址方式;2.ARM指令的特点;3.ARM指令的种类,它能完成哪些功能。本章学习重点目录q1.ARM处理器寻址方式q2.指令集介绍 ARM指令集 Thumb指令集 简单的ARM程序;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1

12、 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 使用“;”进行注释标号顶格写实际代码段声明文件结束;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明3

13、2位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 简单的ARM程序目录q1.ARM处理器寻址方式q2.指令集介绍 ARM指令集 Thumb指令集ARM指令小节目录1.指令格式2.条件码3.ARM指令ARM指令小节目录1.指令格式2.条件码3.ARM指令 ARM指令的基本格式如下:3.2 指令集介绍 ARM指令集指令格式 S ,其中号内的项是必须的,号内的项是可选的。各项的说明

14、如下:opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数;ARM指令的基本格式如下:3.2 指令集介绍 ARM指令集第2个操作数 S ,灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:#immed_8r常数表达式;Rm寄存器方式;Rm,shift寄存器移位方式;3.2 指令集介绍 ARM指令集第2个操作数#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。循环右移10位0 x120 0 0 1 0 0 1 0

15、0 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常数0 x12移位后得到的常数0 x048000003.2 指令集介绍 ARM指令集第2个操作数#immed_8r常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。例如:MOVR0,#1ANDR1,R2,#0 x0FMOVR1,#0 xC000;0 xC000可由0

16、x03循环右移16位得到可以由0 x4A循环右移10位得到2.请列举2个8位图立即数?思考与练习?1.以下8位图立即数是否合法?0 x0103C0000 x128000000 x4000003B(0 xED循环右移2位)0 x0016C000(0 x5B循环右移18位)3.2 指令集介绍 ARM指令集第2个操作数Rm寄存器方式 在寄存器方式下,操作数即为寄存器的数值。例如:SUBR1,R1,R2MOVPC,R03.2 指令集介绍 ARM指令集第2个操作数Rm,shift寄存器移位方式 将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下:操作码说明操作码说明ASR#n算术右移n位ROR

17、#n循环右移n位LSL#n逻辑左移n位RRX带扩展的循环右移1位LSR#n逻辑右移n位Type RsType为移位的一种类型,Rs为偏移量寄存器,低8位有效。3.2 指令集介绍 ARM指令集第2个操作数LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C3.2 指令集介绍 ARM指令集第2个操作数Rm,shift寄存器移位方式例如:ADDR1,R1,R1,LSL#3;R1=R1+R1*8=9R1SUBR1,R1,R2,LSR R3;R1=R1-(R2/2R3)ARM指令小节目录1.指令格式2.条件码3.ARM指令 ARM指令的基本格式如下:3.2 指令集介绍

18、ARM指令集条件码 S ,使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。绝大部分的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行 功能。如果指令不标明条件代码,将默认为无条件(AL)执行。操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于 1011

19、LTN!=V有符号数小于 1100GTZ=0,N=V有符号数大于 1101LEZ=1,N!=V有符号数小于或等于 1110AL任何无条件执行(指令默认条件)1111NV任何从不执行(不要使用)指令条件码表3.2 指令集介绍 ARM指令集条件码C代码:if(a b)a+;elseb+;对应的汇编代码:CMPR0,R1 ;R0与R1比较ADDHI R0,R0,#1 ;若R0R1,则R0=R0+1ADDLS R1,R1,#1 ;若R0R1,则R1=R1+1示例:1.ARM处理器的寻址方式 8种寻址方式;2.ARM指令的特点可条件执行、可选择影响标志位、具有非常灵活的第二操作数;3.ARM指令的种类,

20、它能完成哪些功能。本章学习重点ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令 为什么要掌握部分常用ARM指令?通过指令的学习可以更深入的了解ARM硬件结构的特点;启动代码为了满足大部分系统的顺利运行,通常将系统硬件配置在最低性能,通过调整启动代码中的参数使其更适合自己的硬件系统;通过观察反汇编代码了解程序执行情况,比如某个变量的操作是否被编译器优化掉了。ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令ARM指令集表指令集表3.2 指令集介绍 ARM指令集存储

21、器访问指令 ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM处理器是冯诺依曼存储结构,程序空间、RAM空间及I/O映射空间统一编址,除对RAM操作以外,对外围IO、程序数据的访问也要通过加载/存储指令进行。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令。3.2 指令集介绍 ARM存储器访问

22、指令单寄存器存取3.2 指令集介绍 ARM存储器访问指令单寄存器存取装载指令:存储指令:存储器源地址目标寄存器存储器目标地址源寄存器3.2 指令集介绍 ARM存储器访问指令单寄存器存取装载指令:存储指令:xxLDR/STR指令搭配不同的后缀实现不同方式的单寄存器存取操作:字/半字/字节数据控制是/否用户模式控制无/有符号控制助记符助记符说明说明操作操作条件码位置条件码位置LDR Rd,addressing 加载字字数据Rdaddressing,addressing索引LDRcondLDRB Rd,addressing 加载无符号字节字节数据Rdaddressing,addressing索引LD

23、RcondBLDRT Rd,addressing以用户模式用户模式加载字数据Rdaddressing,addressing索引LDRcondTLDRBT Rd,addressing 以用户模式用户模式加载无符号无符号字节数据Rdaddressing,addressing索引LDRcondBTLDRH Rd,addressing 加载无符号半字无符号半字数据Rdaddressing,addressing索引LDRcondHLDRSB Rd,addressing 加载有符号字节有符号字节数据Rdaddressing,addressing索引LDRcondSBLDRSH Rd,addressing加

24、载有符号半字有符号半字数据 Rdaddressing,addressing索引 LDRcondSH ARM存储器访问指令装载指令助记符助记符说明说明操作操作条件码位置条件码位置STR Rd,addressing 存储字字数据addressingRd,addressing索引STRcondSTRB Rd,addressing 存储字节字节数据addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用户模式用户模式存储字数据addressingRd,addressing索引STRcondTSTRBT Rd,addressing 以用户模式用户模式存

25、储字节字节数据addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存储半字半字数据addressing Rd,addressing索引STRcondH ARM存储器访问指令保存指令 ARM存储器访问指令地址形式装载指令:保存指令:立即数:立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,#0 x12 寄存器:寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,R0,R2 寄存器及移位常数:寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器

26、中减去这个数值。如:LDR R1,R0,R2,LSL#2 ARM存储器访问指令寻址方式装载指令:保存指令:零偏移:如:LDR Rd,Rn前索引偏移:如:LDR Rd,Rn,#0 x04!程序相对偏移:如:LDR Rd,labe1 后索引偏移:如:LDR Rd,Rn,#0 x04注意注意:大多数情况下,必须保证字数据操作的地址是32位对齐的。LDR/STR字数据加载/存储指令 cond:指令执行的条件编码 I、P、U、W:用于区别不同的地址模式(偏移量)。I为0时,偏移量为12位立即数;I 为1时,偏移量为寄存器移位。P表示前/后索引,U表示加/减,W表示地址回写。L:L为1表示加载,L为0表示

27、存储。B:B为1表示字节访问,B为0表示字访问 Rd:源/目标寄存器 Rn:基址寄存器 addr_mode:表示偏移量,是一个12位的无符号二进制数,与Rn一起构成地址 addr。0 x55R2R5 0 x400000000 x123456780 x40000000存储器地址应用示例:LDRR2,R5 ;将R5指向地址的字数据存入R20 x12345678 ARM存储器访问指令单寄存器转载应用0 x12345678R1R2 0 x400000000 x?0 x40000004存储器地址应用示例:STRR1,R2,#0 x04 ;将R1的数据存储到R0+0 x04地址0 x12345678+4

28、ARM存储器访问指令单寄存器保存应用 课堂练习:指令的正误LDR R1,R2,R5!STR R2,R3,#0 xFFFF8STREQ R4,R0,R4,LSL R5LDR R4,R0,R1,LSL#32STREQ R3,R6,#-0 x08LDR R0,R2!,-R6LDR R4,STARTLDR R1,SP,#-0 x04 STR R1,START LDR PC,R6LDR PC,R6 LDR R1,R3,R15;错误,R15不可作为偏移寄存器 ;正确;错误,超出了立即数的范围;错误,不能用寄存器表示移位的位数;错误,超出了移位的范围;正确;错误,后索引不用!后缀;正确;正确;格式正确,但必

29、须保证标号处可以存储数据;错误,R6不表示一个存储地址;正确中断向量代码3.2 指令集介绍 ARM存储器访问指令多寄存器存取 多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。3.2 指令集介绍 ARM存储器访问指令多寄存器存取装载指令:存储指令:存储器源地址目标寄存器1目标寄存器n存储器目标地址源寄存器1源寄存器n3.2 指令集介绍 ARM存储器访问指令多寄存器存取装载指令:存储指令:xxLDM/STM指令搭配不同的后缀实现

30、不同方式地址增长方式:IA:每次传送后地址加4IB:每次传送前地址加4DA:每次传送后地址减4DB:每次传送前地址减4 ARM存储器访问指令多寄存器存取数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H40

31、0CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH3.2 指令集介绍 ARM存储器访问指令多寄存器存取多寄存器存取指令与堆栈操作指令的关系如下表所示。模式说明模式说明IA每次传送后地址加4FD满递减堆栈IB每次传送前地址加4ED空递减堆栈DA每次传送后地址减4FA满递增堆栈DB每次传送前地址减4EA空递增堆栈数据块传送操作堆栈操作3.2 指令集介绍 ARM存储器访问指令多寄存器存取多寄存器存取指令与堆栈操作指令的关系如下表所示。数据块传送存储存储堆栈操作压栈压栈说明数据块传送加载加载堆栈操作出栈出栈说明STMDASTME

32、D空递减LDMDALDMFA满递减STMIASTMEA空递增LDMIALDMFD满递增STMDBSTMFD满递减LDMDBLDMEA空递减STMIBSTMFA满递增LDMIBLDMED空递增0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器0 x010 x020 x030 x040 x40000010应用示例:LDMIA R1!,R2-R4,R6 将R1指向的内存数据读取到R0-R4和R6寄存器中 ARM存储器访问指令多寄存器存取应用示例

33、:STMFD SP!,R0-R7,LR ARM存储器访问指令满递减压栈操作 栈 顶0 x010 x07ARM7内核内部寄存器存储器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x01230 x?0 x3FF8LR1.压栈操作前寄存器和堆栈区的状态;2.压栈操作前堆栈指针指向栈顶;应用示例:STMFD SP!,R0-R7,LR ARM存储器访问指令满递减压栈操作0 x010 x

34、07ARM7内核内部寄存器存储器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x01230 x?0 x3FF8LR1.压栈操作前寄存器和堆栈区的状态;2.压栈操作前堆栈指针指向栈顶;3.执行压栈操作指令保存R0-R7和LR0 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x3FFC 栈 顶应用示例:LDMFD SP!,R0-R7

35、,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶;栈 顶0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?应用示例:LDMFD SP!,R0

36、-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶;栈 顶0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?3.执行出栈操作指令恢复R0

37、-R7和PC0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x0123带状态寄存器恢复的出栈操作:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶;栈 顶0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?

38、0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x?栈 顶带状态寄存器恢复的出栈操作:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶;0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018

39、地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x?0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x01233.执行出栈操作指令恢复R0-R7和PC3.2 指令集介绍 SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的

40、内容写入到该内存单元中。使用SWP可实现信号量操作。ARM存储器访问指令寄存器和存储器交换指令3.2 指令集介绍 ARM存储器访问指令寄存器和存储器交换指令装载指令:存储器目标地址读入寄存器输出寄存器3.2 指令集介绍 ARM存储器访问指令寄存器和存储器交换指令装载指令:助记符助记符说明说明操作操作条件码位置条件码位置SWP Rd,Rm,Rn 寄存器和存储器字字数据交换RdRn,RnRm(RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存储器字节字节数据交换RdRn,RnRm(RnRd或Rm)SWPcondB0 x12345678R1R20 x?0 x112233440 x4

41、0000000存储器地址R0 0 x400000003.2 指令集介绍 ARM存储器访问指令寄存器和存储器交换指令应用示例:SWPR2,R1,R0将R1的内容与R0指向的存储单元的内容进行交换0 x123456780 x11223344ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令3.2 指令集介绍 ARM指令集ARM数据处理指令 数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志

42、。cond:指令执行的条件码指令执行的条件码 I:用于区别第二操作数是立即数:用于区别第二操作数是立即数(I=1)还是寄存器还是寄存器移位移位(I=0)opcode:数据处理指令操作码数据处理指令操作码 S:用于设置条件码,用于设置条件码,S=0,条件码不改变,条件码不改变,S=1,条件码根据具体指令的结果修改条件码根据具体指令的结果修改 Rn:第一操作数寄存器第一操作数寄存器 Rd:目标寄存器:目标寄存器Operand2:第二操作数,该数可以是立即数或寄存器移:第二操作数,该数可以是立即数或寄存器移位数。位数。机器码格式机器码格式3.2 指令集介绍 数据传送指令 MOV指令将8位图立即数或寄

43、存器传送到目标寄存器(Rd),可用于移位运算等操作。装载指令:目标寄存器操作数3.2 指令集介绍 数据传送指令 MOV指令将8位图立即数或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。同类型的指令还有MVN,它可以实现数据的非传递,即把操作数取反后送至目标寄存器。目标寄存器操作数取反3.2 指令集介绍 数据传送指令应用示例:MOV R3,R1,LSL#3 ;R3=R180 x55R3R10 x010 x080 x08逻辑左移3位 思考与练习?1.MOV指令与LDR指令都是往目标寄存器中传送数据,但是它们有什么区别吗?思考与练习?1.MOV指令与LDR指令都是往目标寄存器中传送数据,但是

44、它们有什么区别吗?MOV指令用于将数据从一个寄存器传送到另一个寄存器中,或者将一个常数传送到一个寄存器中,但是不能访问内存。LDR指令用于从内存中读取数据放入寄存器中。3.2 指令集介绍 算术逻辑运算指令 算术逻辑运算指令包括“加/减”以及“与/或/异或”等指令,它们的格式如下:运算寄存器第二操作数运算符结果寄存器3.2 指令集介绍 算术逻辑运算指令部分算术运算符:ADD:加法运算ADC:带进位加法运算SUB:减法运算RSB:逆向减法运算SBC:带进位减法运算RSC:带进位逆向减法运算3.2 指令集介绍 算术逻辑运算指令部分逻辑运算符:AND:逻辑“与”运算ORR:逻辑“或”运算EOR:逻辑“

45、异或”运算BIC:位清除运算3.2 指令集介绍 算术逻辑运算指令应用示例:ADD R3,R1,#0 x08 ;R3=R1+80 x000000050 x08加法0 x?R1第二操作数R30 x0000000D3.2 指令集介绍 算术逻辑运算指令应用示例:AND R3,R1,#0 xFF ;R3=R1&0 x000000FF0 x123456780 x000000FF与0 x?R1第二操作数R30 x000000783.2 指令集介绍 算术逻辑运算指令应用示例:ORR R3,R1,R2 ;R3=R1|R20 x001122330 xAA000000或0 x?R1R2R30 xAA1122330

46、x000000FF0 x00000011异或0 x?R1R2R30 x?操作数3.2 指令集介绍 算术逻辑运算指令应用示例:EOR R3,R1,R2,LSL 0 x03 ;R3=R1 (R2 8)0 x00000077逻辑左移3位0 x00000088 思考与练习?1.用R1寄存器的最低字节替换掉R2寄存器的最低字节,并不影响条件标志位?R1R2BYTE2BYTE3BYTE1 BYTE0BYTE2BYTE3BYTE1 BYTE0BYTE0BYTE0 思考与练习?1.用R1寄存器的最低字节替换掉R2寄存器的最低字节,并不影响条件标志位?AND R1,R1,#0 x000000FFAND R2,R

47、2,#0 xFFFFFF00ORR R2,R2,R13.2 指令集介绍 比较指令 比较指令将两个数值进行的特定运算,根据运算结果影响CPSR的相关标志位,用于后面程序的条件执行,但是运算结果不予保存。运算寄存器操作数运算符影响标志位3.2 指令集介绍 比较指令比较运算符:CMP:数值比较CMN:负数比较TST:位测试TEQ:相等测试0 x000000050 x08减法条件标志R1R33.2 指令集介绍 比较指令应用示例:CMP R3,R1 ;R3减R1并影响标志位无符号小于3.2 指令集介绍 比较指令应用示例:TSTR3,#0 x02 ;测试R3的第2位并影响标志位0 x000000050 x

48、02相与条件标志R3操作数为13.2 指令集介绍 比较指令应用示例:TEQ R3,R2 ;R3与R2是否相等并影响标志位0 x000000AA0 x000000CC异或条件标志R3R2不等 与CMP的区别在于TEQ不影响C和V位,也就是只能判断是否相等,而不能判断是否大于,或小于。ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令3.2 指令集介绍 ARM指令集乘法指令 ARM7TDMI具有三种乘法指令,分别为:3232位乘法指令;32 32位乘加指令;32 32位结果为64位的乘/乘加指令。3.2 指令集介绍 ARM指令集乘法

49、指令助记符助记符说明说明操作操作条件码位置条件码位置MUL Rd,Rm,Rs 32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn(RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi)Rm*RsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSML

50、AL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondS3.2 指令集介绍运算寄存器第二操作数乘法目标寄存器 ARM指令集3232位乘法指令3.2 指令集介绍应用示例:MUL R3,R2,R1 ;R3=R2R1 ARM指令集3232位乘法指令0 x000000020 x00000008乘法0 x?R1R2R30 x000000103.2 指令集介绍 ARM指令集3232位乘加法指令运算寄存器1运算寄存器2乘法中间结果加法第二操作数目标寄存器3.2 指令集介绍应用示例:MLA R3,R2,R1,R0 ;R3=R2R1+R

51、0 ARM指令集3232位乘加法指令0 x000000020 x00000008乘法中间结果加法0 x00000005?R2R1R0R30 x000000100 x00000015ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令3.2 指令集介绍 ARM指令集程序如何跳转在ARM中有两种方式可以实现程序的跳转:1.直接向PC寄存器赋值实现跳转;例:MOV PC,R142.使用分支指令直接跳转。3.2 指令集介绍 ARM指令集分支指令程序代码跳转指令跳转目标程序代码跳转指令跳转目标3.2 指令集介绍 ARM指令集分支指令分支指令

52、种类:B:分支指令BL:带链接的分支指令BX:带状态切换的分支指令 ARM指令分支指令因为用来表示目标地址的位数有限,所以B/BL指令无法实现无法实现4G4G(3232位)范围内的任意跳转位)范围内的任意跳转3.2 指令集介绍指令为简单的跳转指令,不附带其它功能。跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。程序代码B mainxxmain ARM指令集分支指令程序代码BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC ARM指令分支指令 带链接的分支指令BL指令除了具有跳转功能,还能在跳转之前将下一条

53、指令的地址拷贝到R14(即LR)链接寄存器中,它适用于子程序调用。跳转范围限制在当前指令的32M字节地址内。指令格式如下:Addr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行例如:BL DelayNS;调用子程序DelayNS ARM指令分支指令 带状态切换的分支指令BX指令除了具有跳转功能,还能在跳转的同时切换处理器状态。其跳转范围不受限制。指令格式如下:最低位为1?YN切换到状态切换

54、到状态 ARM指令分支指令 带状态切换的分支指令BX指令除了具有跳转功能,还能在跳转的同时切换处理器状态。其跳转范围不受限制。指令格式如下:例如:ADRL R0,T_Fun+1 ;将Thumb程序的入口地址加1存入R0BXR0 ;跳转到R0指定的地址,;并根据R0的最低位来切换处理器状态ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令3.2 指令集介绍 ARM指令集协处理器指令 ARM内核支持协处理器操作,协处理器的控制要通过协处理器命令实现。ARM内核与协处理器的关系ARM内核协处理器A协处理器B握手信号数据地址总线助记符说

55、明操作条件码位置CDP coproc,opcode1,CRd,CRn,CRm,opcode2协处理器数据操作指令取决于协处理器CDPcondLDCLcoproc,CRd,协处理器数据读取指令取决于协处理器LDCcondLSTCL coproc,CRd,协处理器数据写入指令取决于协处理器STCcondLMCR coproc,opcode1,Rd,CRn,CRm,opcode2ARM寄存器到协处理器寄存器的数据传送指令取决于协处理器MCRcondMRC coproc,opcode1,Rd,CRn,CRm,opcode2协处理器寄存器到ARM寄存器到的数据传送指令取决于协处理器MCRcond ARM

56、指令协处理器指令ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令 在ARM指令集中杂项指令共有3条,它们非常重要,特别是与操作系统的使用息息相关:1.软件中断产生指令:SWI2.程序状态寄存器读指令:MRS3.程序状态寄存器写指令:MSR3.2 指令集介绍 ARM指令集杂项指令3.2 指令集介绍 ARM指令集软中断指令 SWI指令用于产生软中断,主要用于用户程序调用操作系统的系统服务。执行该指令后,处理器将完成以下动作:1.切换到管理模式2.将CPSR备份到管理模式下的SPSR寄存器3.程序跳转到软件中断入口用户模式管理模式任

57、务1任务2其它代码功能1:打开中断功能2:关闭中断功能n:任务调度CPSR寄存器SPSR寄存器1.使用操作系统后,为了防止出错的任务影响其它任务的执行,通常将任务放在用户模式执行,以限制其权限;2.对于一些重要的操作,如中断的开关,必须由操作系统完成。使用软件中断指令即可完成系统功能调用;ARM杂项指令软中断指令3.2 指令集介绍 ARM指令集软中断指令 SWI指令格式如下所示:可以利用指令中的这个24位立即数向软中断服务程序传递参数,比如请求的服务类型 ARM杂项指令软中断指令 根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24位立即

58、数指定了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#34;设置子功能号为34 SWI 12;调用12号软中断 指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。MOV R0,#12;调用12号软中断 MOV R1,#34;设置子功能号为34 SWI 0 ARM杂项指令软中断指令 在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出该SWI指令,分解出立即数。SWI_Han

59、dler STMFD SP!,R0-R3,R12,LR;现场保护 MRS R0,SPSR ;读取SPSR STMFD SP!,R0 ;保存SPSR TST R0,#0 x20 ;测试T标志位 LDRNEH R0,LR,#-2 ;若是Thumb指令,读取指令码(16位)BICNE R0,R0,#0 xFF00;取得Thumb指令的8位立即数 LDREQ R0,LR,#-4 ;若是ARM指令,读取指令码(32位)BICEQ R0,R0,#0 xFF000000 ;取得ARM指令的24位立即数 .LDMFD SP!,R0-R3,R12,PC;SWI异常中断返回 3.2 指令集介绍 ARM指令集状态寄

60、存器读指令 在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。指令格式如下所示:目标寄存器3.2 指令集介绍 ARM指令集状态寄存器读指令 应用示例:MRS R1,CPSR ;读取CPSR状态寄存器到R1 MRS R2,SPSR ;读取SPSR状态寄存器到R2 ARM杂项指令状态寄存器写指令 在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式等操作。操作数分

61、为两种:1.寄存器2.8位图立即数PSR寄存器被分为四个8位的域:1.状态位域:用 表示2.扩展位域:用 表示3.条件标志位域:用 表示4.控制位域:用 表示3.2 指令集介绍 ARM指令集状态寄存器写指令示例,将R0的内容写入CPSR寄存器的控制位域MSR CPSR_c,R0条件代码标志保留控制位域Byte0Byte3,Byte2,Byte1R0CPSRNZCV IM0M1M2M3M4TF.31 30 29 28 27 26 8 7 6 5 4 3 2 1 0Byte0 ARM杂项指令状态寄存器写指令启动代码堆栈初始化应用示例:INITSTACKMOV R0,LR;设置管理模式堆栈MSR C

62、PSR_C,#0 xD3LDR SP,StackSvc;设置中断模式堆栈MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位状态位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD311010011禁止FIQ中断禁止IRQ中断ARM状态管理模式MSR CPSR_C,#0 xD3CPRS寄存器 ARM杂项指令状态寄存器写指令启动代码堆栈初始化应用示例:INITSTACKMOV R0,LR;设置管理模式堆栈MSR CPSR_C,#0 xD3LDR SP,StackSvc;设置中断模式堆栈MSR C

63、PSR_C,#0 xD2LDR SP,StackIrq.模式位状态位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD2 211010010禁止FIQ中断禁止IRQ中断ARM状态IRQIRQ模式MSR CPSR_C,#0 xD2CPRS寄存器 思考与练习?1.使用MSR和MRS指令,通过修改CPSR寄存器,实现打开/关闭IRQ中断的两个子程序,注意不能影响其它位?(1)(2)(3)(4);子程序:使能IRQ中断Enable_IRQ MRS R0,CPSR BIC R0,R0,#0 x80 MSR CPSR_c,R

64、0 MOV PC,LR ;子程序:禁能IRQ中断Disable_IRQ MRS R0 CPSR ORR R0,R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.将CPSR寄存器内容读出到R0;2.修改对应于CPSR中的I控制位;3.将修改后的值写回 CPSR寄存器的对应控制域;4.返回上一层函数;思考与练习?ARM指令种类1.存储器访问指令2.数据处理指令3.乘法指令4.ARM分支指令5.协处理器指令6.杂项指令7.伪指令3.2 指令集介绍 ARM伪指令 ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令

65、将被等效的ARM指令代替。反汇编代码源程序伪指令实际指令编译器实际指令实际指令3.2 指令集介绍 ARM伪指令 ARM伪指令有四条:1.小范围地址读取指令:2.中等范围地址读取指令:3.大等范围地址读取指令:4.空操作指令:ARM伪指令小范围的地址读取 伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令,若不能用一条指令实现,则产生错误,编译失败。目标寄存器表达式 ARM伪指令小范围的地址读取目标寄存器表达式地址表达式expr的取指范围:当地址值不是字对齐时,其取指范围为;当地址值是字对齐时,其取指范围

66、为;当地址值是16字节对齐时,其取指范围将更大。ARM伪指令小范围的地址读取 .ADR R0,Delay .Delay MOV R0,r14 .应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0 .0 x20 ADD r0,pc,#0 x3c .0 x64 MOV r0,r14 .编译后的反汇编代码:地址程序代码 ARM伪指令小范围的地址读取 .ADR R0,Delay .Delay MOV R0,r14 .应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0 .0 x20 ADD r0,pc,#0 x3c .0 x64 MOV r0,r14 .编译后的反汇编代码:ADR伪指令被汇编成一条指令 ARM伪指令小范围的地址读取 ;查表应用示例:ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为参数,进行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8 ARM伪指令中等范围的地址读取 伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄

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